Witam Was mam takie pytanie, być może wynika one z mojej niewiedzy.
Mam program, który będzie odczytywał temperaturę , ponieważ czujników jest sztuk 4 to chciałem po 2 pomiary pokazać na LCD.
Pierwszy pomysł jaki mi przyszedł do głowy to funkcja przełączająca i delay na 3-5 sekund. Niestety założenie było błędne, ponieważ w głównej pętli mam jeszcze odwołanie do takiego mini menu z ustawieniami różnymi i taki pomysł skutecznie blokował wszystko.
Tak więc znajomy podpowiedział mi by skorzystać z licznika oraz licznika timera.
Timer2 trochę za szybko się przepełnia (timer 0,1 mam zajęty). Tak więc pomysłem było wsadzenie w przerwanie licznika który zliczy np do 10000 i zmieni flagę. Tą flagę potem odczytuje w pętli głównej i zmieniam wyświetlaną treść.
Problem jest z tym że timer działa dosyć dziwnie.
Kod na wstępie najważniejszy
I teraz kilka wyjaśnień, kod jest przykładowy w przerwaniu po uruchomieniu na LCD mam tak
1 2 3 4 5 6 7 8 (potem dalszy zapis znika na LCD na 2-3 sekundy i pojawia się w drugim wierszu)
drugi wiesz: 1113 311114 (miedzy nimi jest jedna jeszcze liczba ale ucięta) 811119 itd
O co chodzi ?, czemu tak się dzieje i jak to naprawić.
Druga dość dziwna sprawa taki zapis działa
Moim zdaniem powinny być te zapisy równoważne. Niestety w dwóch ostatnich timer nie startuje.
Będę wdzięczny za pomoc bo nie wiem o co biega, czemu ccc nie liczy prawidłowo.
Pozdrawiam.
Mam program, który będzie odczytywał temperaturę , ponieważ czujników jest sztuk 4 to chciałem po 2 pomiary pokazać na LCD.
Pierwszy pomysł jaki mi przyszedł do głowy to funkcja przełączająca i delay na 3-5 sekund. Niestety założenie było błędne, ponieważ w głównej pętli mam jeszcze odwołanie do takiego mini menu z ustawieniami różnymi i taki pomysł skutecznie blokował wszystko.
Tak więc znajomy podpowiedział mi by skorzystać z licznika oraz licznika timera.
Timer2 trochę za szybko się przepełnia (timer 0,1 mam zajęty). Tak więc pomysłem było wsadzenie w przerwanie licznika który zliczy np do 10000 i zmieni flagę. Tą flagę potem odczytuje w pętli głównej i zmieniam wyświetlaną treść.
Problem jest z tym że timer działa dosyć dziwnie.
Kod na wstępie najważniejszy
// deklaracja licznika jako globalna zmienna
uint16_t ccc;
// main nie w pętli
TCCR2 |= (1 << CS22);
TCCR2 |= (1 << CS20);
TCCR2 |= (1 << CS21);
//TCNT2 |= (0 << CS20) | (0 << CS21) | (1 << CS22);
TIMSK |= (1 << TOIE2); // zezwolenie na przerwania
// przerwanie
ISR(TIMER2_OVF_vect) // przerwanie dla timer2 - 8bit
{
ccc++;
uint16_t buff;
itoa(ccc, buff, 10);
LCD_WriteText(buff);
LCD_WriteText(" ");
_delay_ms(700);
if(ccc >= 100) {
LCD_Clear();
}
}
I teraz kilka wyjaśnień, kod jest przykładowy w przerwaniu po uruchomieniu na LCD mam tak
1 2 3 4 5 6 7 8 (potem dalszy zapis znika na LCD na 2-3 sekundy i pojawia się w drugim wierszu)
drugi wiesz: 1113 311114 (miedzy nimi jest jedna jeszcze liczba ale ucięta) 811119 itd
O co chodzi ?, czemu tak się dzieje i jak to naprawić.
Druga dość dziwna sprawa taki zapis działa
TCCR2 |= (1 << CS22);
TCCR2 |= (1 << CS20);
TCCR2 |= (1 << CS21);
ale ten
TCNT2 |= (1 << CS20) | (1 << CS21) | (1 << CS22);
lub ten
TCNT2 |= (1 << CS20 | 1 << CS21 | 1 << CS22);
Już nie.
Moim zdaniem powinny być te zapisy równoważne. Niestety w dwóch ostatnich timer nie startuje.
Będę wdzięczny za pomoc bo nie wiem o co biega, czemu ccc nie liczy prawidłowo.
Pozdrawiam.