Без описания |
Поиск в теме | Версия для печати |
Blitzkrieg |
Отправлено: 08 Февраля, 2009 - 13:31:48
|
Лейтенант
Сообщений всего: 33
Дата рег-ции: Янв. 2009
|
Столкнулся с каким-то глюкобагом, не пойму почиму так происходит.
Переменная cnt используетя для подсчета кол-ва переполнений регистра TMR0. То есть в данном случае каждые 10 мс переменная cnt увеличивается на 1. То есть если проверять условие ее равенства 100 - мы ждем 1 секунду.
Так вот в следующем коде в случае если эта переменная равна 300 я ее обнуляю.
Обнуляться она не хочет,бывает что обнуляется при первом отсчете до 300, далее просто забывает это сделать.
Проблема конечно решается нестрогим равенством, но это же погрешность.
Обнуляться она не хочет, обнуляется только один первый раз. Но при использоавнии второго кода все отлично срабатывает.
Код 1
CODE:int Sensor1,Sensor2,Sensor3,Sensor4,Sensor5;
char Txt[6];
unsigned cnt;
void Read_Adc()
{
ADCON0=0b00000001;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor1=(ADRESH*4)+(ADRESL/64);
ADCON0=0b00000101;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor2=(ADRESH*4)+(ADRESL/64);
ADCON0=0b00001001;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor3=(ADRESH*4)+(ADRESL/64);
ADCON0=0b00001101;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor4=(ADRESH*4)+(ADRESL/64);
}
void Read_Adc1()
{
ADCON0=0b00010001;
delay_us(20);
ADCON0.GO=1;
while(ADCON0.GO);
Sensor5=(ADRESH*4)+(ADRESL/64);
}
void interrupt() {
if(INTCON.T0IF)
{
cnt++;
TMR0 = 61;
INTCON.T0IF = 0;
}
}
void main()
{
cnt=0;
TRISA = 0b00111111;
ANSEL = 0b00111111;
TRISB.F0=1;
ANSELH.F4=0;
INTCON.GIE=1;
INTCON.T0IE=1;
OPTION_REG.T0CS=0;
OPTION_REG.PSA=0;
OPTION_REG.PS2=1;
OPTION_REG.PS1=1;
OPTION_REG.PS0=1;
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_CURSOR_OFF);
while(PORTB.F0);
do
{
if (cnt==1300) cnt=0;
Read_Adc();
WordToStr(Sensor1,Txt);
Lcd_Out(1,1,Txt);
WordToStr(Sensor2,Txt);
Lcd_Out(1,6,Txt);
WordToStr(Sensor3,Txt);
Lcd_Out(1,11,Txt);
WordToStr(Sensor4,Txt);
Lcd_Out(2,1,Txt);
WordToStr(cnt,Txt);
Lcd_Out(2,11,Txt);
}
while(1);
}
Код 2
CODE:char Txt[6];
unsigned cnt;
void interrupt() {
if(INTCON.T0IF)
{
cnt++;
TMR0 = 61;
INTCON.T0IF = 0;
}
}
void main()
{
cnt=0;
TRISB.F0=1;
ANSELH.F4=0;
INTCON.GIE=1;
INTCON.T0IE=1;
OPTION_REG.T0CS=0;
OPTION_REG.PSA=0;
OPTION_REG.PS2=1;
OPTION_REG.PS1=1;
OPTION_REG.PS0=1;
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_CURSOR_OFF);
while(PORTB.F0);
while(1)
{
WordToStr(cnt,Txt);
Lcd_Out(2,11,Txt);
if (cnt==300) cnt=0;
}
}
(Отредактировано автором: 08 Февраля, 2009 - 13:36:25) |
|
|
Гость |
Отправлено: 08 Февраля, 2009 - 15:10:44
|
УДАЛЁН
|
есть мысля:
во время последующих (после первого сброса) насчетов до 300 Цитата:if (cnt==1300) cnt=0; 1300 я понимаю опечатка и не в том суть. контроллер всякой ерундой занимаеться (опрос сенсоров, вывод на LCD...), и успевает перещелкнутся на 301.
я не понял это к чему относиться (под контроллеры писал мало и только под 51) |
|
|
Blitzkrieg |
Отправлено: 08 Февраля, 2009 - 15:19:37
|
Лейтенант
Сообщений всего: 33
Дата рег-ции: Янв. 2009
|
Predator пишет:есть мысля:
во время последующих (после первого сброса) насчетов до 300 Цитата:if (cnt==1300) cnt=0; 1300 я понимаю опечатка и не в том суть. контроллер всякой ерундой занимаеться (опрос сенсоров, вывод на LCD...), и успевает перещелкнутся на 301.
я не понял это к чему относиться (под контроллеры писал мало и только под 51)
Вот тоже мысль такая, что МК занят чем-то в момент когда cnt==300. Может если сравнивать с 301 может будет работать?
1300 это опечатка.
while(PORTB.F0); а это сделано длля начала работы программы, то есть программа не выполняется до тех пор пока не нажмешь кнопочку RB0. |
|
|
Гость |
Отправлено: 08 Февраля, 2009 - 17:29:26
|
УДАЛЁН
|
не, если сравнивать с 301- то он может оказаться занят именно, когда 301. надо сравнивать в момент инкремента (типа если 299, то в 0, иначе ++) |
|
|
Blitzkrieg |
Отправлено: 08 Февраля, 2009 - 17:29:51
|
Лейтенант
Сообщений всего: 33
Дата рег-ции: Янв. 2009
|
redcat пишет:а как насчёт if (cnt>=300) cnt=0;
Вы обладаете катастрофической невнимательностью :-)
Blitzkrieg пишет:Проблема конечно решается нестрогим равенством, но это же погрешность. (Отредактировано автором: 08 Февраля, 2009 - 17:31:28) |
|
|
Гость |
Отправлено: 08 Февраля, 2009 - 18:44:06
|
УДАЛЁН
|
еще надо else{cnt=0;}, ато на 300 застрянет и не обнулиться |
|
|
Гость |
Отправлено: 08 Февраля, 2009 - 19:11:18
|
УДАЛЁН
|
ну я так понял, что надо каждые 300 прерываний отсчитывать Цитата:бывает что обнуляется при первом отсчете до 300, далее просто забывает это сделать
Цитата:if (cnt==300) cnt=0; . а там ему виднее |
|
|
|
Поиск в теме | Версия для печати |
Страниц (2): [1] 2 » |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|