Автомобильный вольтметр

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Автомобилльный вольтметр

Сообщение Master » 25 сен 2009, 15:59

Так и есть. Это корпус от кетайского тахометра, который не правильно показывал данные, а потом ваще сгорел.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Автомобилльный вольтметр

Сообщение Sun-dey » 27 сен 2009, 12:14

Привет. пытался скрестить маршрутный комп из своей темы и вольтметр. Точнее хотел с нуля добавить, дабы понять, что к чему. Не работает. Даже прерывания не происходит. Где почитать принцип? 8мега, считать пытался с PC0.
Добавил вот это:
Код: Выделить всё
unsigned long int  adc_data;
#define ADC_VREF_TYPE 0x00


             // ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;

в main:
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8F;
}


Глобально прерывания разрешены
Sun-dey
 
Сообщения: 106
Зарегистрирован: 23 апр 2009, 14:12
Откуда: Курская обл.

Re: Автомобилльный вольтметр

Сообщение flyroman » 27 сен 2009, 12:57

а что вы это делали "маршрутный" комп...без вольтметра))) какой эт омаршрутный комп тогда))
«Это невозможно» — сказала Причина. «Это безрассудно!» — заметил Опыт. «Это бесполезно!» — отрезала Гордость.
«Попробуй» — шепнула Мечта…
Аватара пользователя
flyroman
 
Сообщения: 1266
Зарегистрирован: 12 янв 2009, 21:39
Откуда: Чебоксары, Чувашская Республика
Skype: roman.buhalov
прог. языки: Basic, VisualBasic,Pascal, Delphi, ASM
ФИО: Роман Сергеевич

Re: Автомобилльный вольтметр

Сообщение Master » 27 сен 2009, 14:05

Sun-dey
Не совсем так. В самом начале, после #include
Код: Выделить всё
#define ADC_VREF_TYPE 0x00 

Потом
Код: Выделить всё
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
// Read the AD conversion result
adc_data=ADCW;     
}

А уже в main()
Код: Выделить всё
// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8F;     

А ну и плюс разрешить прерывания
Код: Выделить всё
// Global enable interrupts
#asm("sei")


Добавлено спустя 1 минуту:
При такой настройке АЦП подключаем к порту ADC0.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Автомобилльный вольтметр

Сообщение Sun-dey » 27 сен 2009, 18:46

Сделал, не прерывается :(
странно, конечно.

Код: Выделить всё
/
*****************************************************
Chip type           : ATmega8
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/
#include <stdlib.h>
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#define ADC_VREF_TYPE 0x00

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
char bylo_dlinnoe_nazatie=0;
char TotalFuelStr[14]; char Vtoraya_Stroka[14]; char LitrNaSotnyStr[14]; char TotalPutStr[14];int rezhim=1;    // 1- общий расход, л/100    2- общий расход, общий пробег    3-настройка   4-коэффициент форсунки   5- датчик скорости
float LitrNaSotny=0;float TotalFuel;float TotalPut;unsigned long int  StoGramm=0;unsigned long int  SpeedCounter=0;unsigned long int  i=0;unsigned long int  Speed_For_light=0;
eeprom unsigned long int  eepromPrFors; // производительность форсунки (время в мкс, за которое наливается 0,01л)/1000
eeprom unsigned long int eepromImpuls_km;unsigned long int  PrFors=0;unsigned long int  Impuls_km=0;//eeprom unsigned long int eepromTotalFuel;eeprom unsigned long int eepromTotalPut;
unsigned long int  key_interval; unsigned long int  litr_na_sotny_sredn; float  plan_probeg;float  v_bake;float  v_bake_plus;       
unsigned long int  adc_data;

// таймер времени
interrupt [TIM0_OVF] void timer0_ovf_isr(void){Speed_For_light=0;};



interrupt [EXT_INT0] void ext_int0_isr(void)
{SpeedCounter++;TotalPut=TotalPut+1;Speed_For_light++;}


// Прерывание по форсунке
interrupt [EXT_INT1] void ext_int1_isr(void)
{

    if ( PIND.3 ) 
        {
           // Закрытие форсунки, считаем время открытия
        MCUCR=0x0B;// разрешаем прерывание по спаду
        TCCR1B=0x00; // останавливаем таймер
        i=i+TCNT1; // имеем тики таймера, то есть мкс :) за 0.83 сек вливается 0,01л
        TCNT1=0;
       
        if (i>PrFors) {
          StoGramm++;i=0;LitrNaSotny=Impuls_km*100/SpeedCounter;                                             
          if (LitrNaSotny>10000) {LitrNaSotny=99990 ;};
          SpeedCounter=0;TotalFuel=TotalFuel+1;
          };


    }
    else   // Открытие форсунки
    {MCUCR=0x0F;      // разрешаем прерывание по нарастанию
     TCCR1B=0x02;// 1 кгц // запускаем таймер
    }  }




// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
// Read the AD conversion result
adc_data=ADCW;     
}





void main(void)
{
PORTB=0x00;DDRB=0x00;PORTC=0x7F;DDRC=0x00;PORTD=0x01;DDRD=0x01;TCCR0=0x05;TCNT0=0x00;TCCR1A=0x00;TCCR1B=0x03;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;ASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;GICR|=0xC0;MCUCR=0x0B;GIFR=0xC0;TIMSK=0x01;ACSR=0x80;SFIOR=0x00;#asm("sei")
lcd_init(16);delay_ms(100);delay_ms(5);//if (eepromPrFors<200) {eepromPrFors=830;};if (eepromImpuls_km<200) {eepromImpuls_km=5000;};TotalFuel=0;PrFors=eepromPrFors*1000;Impuls_km=eepromImpuls_km;TotalFuel=eepromTotalFuel;TotalPut=eepromTotalPut;
PORTD=0x00;delay_ms(100);PORTD=0x01;delay_ms(100);PORTD=0x00;delay_ms(100);PORTD=0x01;delay_ms(100);PORTD=0x00;lcd_clear();PrFors=830000;Impuls_km=5000;


// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8F; 

       
while (1) {
if (Speed_For_light>3) {PORTD=0x01;};


//adc_data=adc_data*150.0/1024.0;


// индикация
if (rezhim==1) {lcd_gotoxy(0,0);lcd_putsf("L ");ftoa(TotalFuel/100,2,TotalFuelStr);lcd_puts(TotalFuelStr);lcd_putsf(" ");lcd_gotoxy(9,0);lcd_putsf("Km ");ftoa(TotalPut/Impuls_km,2,TotalPutStr);lcd_puts(TotalPutStr);lcd_gotoxy(0,1);lcd_putsf("l ");ftoa(LitrNaSotny/100,1,LitrNaSotnyStr);lcd_puts(LitrNaSotnyStr);lcd_putsf("  ");lcd_gotoxy(9,1);lcd_putsf("km ");litr_na_sotny_sredn=((TotalFuel)/(TotalPut/Impuls_km));if (litr_na_sotny_sredn>0) {plan_probeg=v_bake/litr_na_sotny_sredn*100; ftoa(plan_probeg,0,TotalFuelStr);lcd_puts(TotalFuelStr);lcd_putsf("   ");};};
if (rezhim==2) {lcd_gotoxy(0,0);lcd_putsf("    Zapravka    ");lcd_gotoxy(4,1);ftoa(v_bake_plus,2,Vtoraya_Stroka);lcd_puts(Vtoraya_Stroka);lcd_putsf("   ");};   
if (rezhim==3) {lcd_gotoxy(0,0);lcd_putsf("   Volts    ");lcd_gotoxy(4,1);ftoa(adc_data,2,Vtoraya_Stroka);lcd_puts(Vtoraya_Stroka);lcd_putsf("   ");};   
if (rezhim==4) {lcd_gotoxy(4,0);lcd_putsf("Forsunka");itoa(PrFors/1000,Vtoraya_Stroka);lcd_gotoxy(5,1);lcd_puts(Vtoraya_Stroka);lcd_putsf("   ");};
if (rezhim==5) {lcd_gotoxy(4,0);lcd_putsf("Speed");lcd_putsf("   ");itoa(Impuls_km,Vtoraya_Stroka);lcd_gotoxy(5,1);lcd_puts(Vtoraya_Stroka);lcd_putsf("   ");};
//кнопки
if (rezhim==1) {if (PINC.1==0) {while (PINC.1==0) {key_interval++;delay_ms(100);if (key_interval>20) {key_interval=0;TotalFuel=0; TotalPut=0;lcd_clear();bylo_dlinnoe_nazatie=1; };};if (bylo_dlinnoe_nazatie==0){rezhim=3;lcd_clear();};bylo_dlinnoe_nazatie=0;};};
if (rezhim==1) {if (PINC.3==0) {while (PINC.3==0) {key_interval++;delay_ms(100);if (key_interval>20){key_interval=0;rezhim=2;lcd_clear(); };};};};
if (rezhim==2) {if (PINC.1==0) {while (PINC.1==0) {key_interval++;delay_ms(100);if (key_interval>20){key_interval=0;rezhim=4;lcd_clear();bylo_dlinnoe_nazatie=1; };};if (bylo_dlinnoe_nazatie==0){rezhim=1;v_bake=v_bake_plus;v_bake_plus=0;lcd_clear();};bylo_dlinnoe_nazatie=0;};};
if (rezhim==2) {if ( PINC.3==0) {v_bake_plus=v_bake_plus+0.1;delay_ms(50);};if ( PINC.4==0){v_bake_plus=v_bake_plus-0.01;delay_ms(350);};};
if (rezhim==4) {if (PINC.1==0) {while (PINC.1==0) {key_interval++;delay_ms(100);if (key_interval>20){key_interval=0;rezhim=5;lcd_clear();bylo_dlinnoe_nazatie=1; };};if (bylo_dlinnoe_nazatie==0){rezhim=1;lcd_clear();};bylo_dlinnoe_nazatie=0;};};
if (rezhim==4) {if ( PINC.3==0) {PrFors=PrFors+1000;eepromPrFors=PrFors/1000;delay_ms(100);};if ( PINC.4==0) {PrFors=PrFors-1000;eepromPrFors=PrFors/1000;delay_ms(100);};};
if (rezhim==5) {if (PINC.1==0) {while (PINC.1==0) {key_interval++;delay_ms(100);if (key_interval>20){key_interval=0;rezhim=6;lcd_clear();bylo_dlinnoe_nazatie=1; };};if (bylo_dlinnoe_nazatie==0){rezhim=1;lcd_clear();};bylo_dlinnoe_nazatie=0;};};
if (rezhim==5) { if ( PINC.3==0) {Impuls_km++;eepromImpuls_km=Impuls_km;delay_ms(100);};if ( PINC.4==0) {Impuls_km--;eepromImpuls_km=Impuls_km;delay_ms(100);};};

// при выключении зажигания записать
//TotalFuel
//TotalPut
//v_bake=v_bake-TotalFuel



if (rezhim==6) {rezhim=1;};//..не знаю зачем пока ))
};  // конец цикла
}



разобрался. ADCSRA|=0x40 не было :)
но почитать все равно можно.

Добавлено спустя 1 час 40 минут 28 секунд:
Сделал, но так и не понял как это получилось, считает с десятыми от 0 до 17В
пошел немного другим путем: в прерывании написал ADCSRA|=0x00;
другим таймером, он время у меня считал, 3 раза в секунду выполняется вот это: ADCSRA|=0xCB
Сглаживать показания с рассчетом среднего значения уже не нужно.

Есть казус: протеус начал ругаться я так понял на нехватку оперативки, он вообще это делает? :oops:
"уменьшил" несколько переменных- пропало.
Если что-то еще добавить в код DDR ставить придется? :D

Добавлено спустя 2 часа 22 минуты 39 секунд:
Re: Автомобильный вольтметр
Подозрения подтвердились.Как это ни печально, 8 меги уже мало.....
Sun-dey
 
Сообщения: 106
Зарегистрирован: 23 апр 2009, 14:12
Откуда: Курская обл.

Re: Автомобильный вольтметр

Сообщение boez » 29 сен 2009, 15:47

А это под какой компилер? Строковые константы все где лежат, в озу или во флеши?
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Автомобильный вольтметр

Сообщение Sun-dey » 29 сен 2009, 18:27

А это под какой компилер? Строковые константы все где лежат, в озу или во флеши?

CVAVR2.
Насчет констант :pardon: не знаю, думаю в ОЗУ.
флеш занята только на 55%.
Sun-dey
 
Сообщения: 106
Зарегистрирован: 23 апр 2009, 14:12
Откуда: Курская обл.

Re: Автомобильный вольтметр

Сообщение boez » 29 сен 2009, 22:05

Ну так надо их во флешу переносить, как это сделать на gcc я знаю, всегда храню строки во флеше, а как на CVAVR - не знаю, но наверняка тоже можно. ОЗУ-то всего килобайт, а флеши - 8 :)
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Автомобильный вольтметр

Сообщение Sun-dey » 29 сен 2009, 22:44

Где то видел конструкцию: flash char xxxxx;
может оно...надо будет попробовать.
Вот только тормоза при обращении будут наверное.
1 килобайт тоже не мало на ZX спектруме 48к было, игры были :D .
Sun-dey
 
Сообщения: 106
Зарегистрирован: 23 апр 2009, 14:12
Откуда: Курская обл.

Re: Автомобильный вольтметр

Сообщение SERGEY_M » 30 сен 2009, 09:26

flash char
или
const char
тормозов не будет, с чего-бы тормозить... :pardon:
Аватара пользователя
SERGEY_M
 
Сообщения: 682
Зарегистрирован: 20 мар 2009, 12:45
Откуда: Украина, Одесса
ФИО: Сергей

Re: Автомобильный вольтметр

Сообщение Sun-dey » 30 сен 2009, 16:41

сделал так: flash char Displ_Print[16];
получил вот это:
Warning: C:\cvavr2\work\mondeo.0.2\mondeo.c(21): uninitialized FLASH memory
как ее инициализировать?
ну и еще 30 штук таких:
Error: C:\cvavr2\work\mondeo.0.2\mondeo.c(79): function argument #1 of type 'flash unsigned char [16]' is incompatible with required parameter of type 'unsigned char *'

Таким образом можно все переменные во флеш убрать? само собой после инициализации :)
Sun-dey
 
Сообщения: 106
Зарегистрирован: 23 апр 2009, 14:12
Откуда: Курская обл.

Re: Автомобильный вольтметр

Сообщение SERGEY_M » 30 сен 2009, 16:52

1, переменные хранятся в RAM, на то они и переменные
2, константы можно хранить в FLASH памяти, т.к. они не меняются, на то они и константы
3, flash char Displ_Print[16]; ругается, т.к. ты не указал значения констант, т.е.
flash char Displ_Print[16]={16 значений констант через ","};
Аватара пользователя
SERGEY_M
 
Сообщения: 682
Зарегистрирован: 20 мар 2009, 12:45
Откуда: Украина, Одесса
ФИО: Сергей

Re: Автомобильный вольтметр

Сообщение Sun-dey » 30 сен 2009, 16:58

Тогда облом, это была переменная, константы у меня ни одной нет....
Sun-dey
 
Сообщения: 106
Зарегистрирован: 23 апр 2009, 14:12
Откуда: Курская обл.

Re: Автомобильный вольтметр

Сообщение SERGEY_M » 30 сен 2009, 16:59

:pardon:
Аватара пользователя
SERGEY_M
 
Сообщения: 682
Зарегистрирован: 20 мар 2009, 12:45
Откуда: Украина, Одесса
ФИО: Сергей

Re: Автомобильный вольтметр

Сообщение blindman » 30 сен 2009, 18:35

Sun-dey писал(а):Тогда облом, это была переменная, константы у меня ни одной нет....

а это что?

Код: Выделить всё
lcd_putsf("    Zapravka    ");
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17