avr-gcc problem z programem.

May 18, 2004 5 Replies

czesc, Potrzebuje zrobic sobie timeout do rs'a, cos mi to nie dziala i nie bardzo wiem dlaczego. Moze ktos "rzuci" okiem i zobaczy: Generalnie chcialbym by po ustawieniu rs_stop na 1 usart wyslal K i zakonczyl dzialanie. Wiem ze timer dziala poprawnie (dostaje komunikat). A moze jakos inaczej to realizowac? Jestem otwarty na propozycje...



pozdrawiam, bartek.



PS. Zadzialalo mi to jezeli mialem wlaczone usart0_transmit('e') (wysyla e na drugi port), ale opoznienie ktore probowalem wstawic niz juz nie zmienilo.



unsigned char USART1_Receive( void ) { char status,data; while (1) { while(rs_stop != 0x01){ if (((status=UCSR1A) & RX_COMPLETE)!=0){ data=UDR1; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) return data; } //USART0_Transmit('e'); //_delay_loop_2(100); } if (rs_stop == 0x01){ return 'K'; } }; }



SIGNAL (SIG_OVERFLOW0){ rs_timeout++; if (rs_stop == 0x00){ if (rs_timeout >= 220){ rs_stop = 0x01; usart0_send("RS time outss"); } } TCNT0= 0x29; //reload counter value wdt_reset(); }



Bartosz Waleska wrote: ...

A masz rs_stop zadeklarowane jako volatile?

...

BTW> a gdzie zerujesz rs_timeout

To rozumiem, że tylko testowo, bo wypisywanie w ISR stringu przez UART jest co najmniej problematyczne.

To bardzo zły pomysł, a w zasadzie błąd (w 99.9% przypadków). Nie resetuj watchdoga w przerwaniu, a szególnie przerwaniu timera.

Pozdrawiam,

</ciach>

wiem, wiem... na razie poprostu nie mam jeszcze zadnego kodu, trudno wiec cokolwiek zerowac. A test jakos przeprowadzic trzeba, no a co z moim rs timeout? Jak to robic poprawnie? moze ktos moze pochwalic sie gotowcem? Zalozenie: w timerze (1) jest zadanie danych (rs_recive) a w timerze 0 pojawia sie rs_timeout i teraz jak przekonac rs_recive zeby odeslala jakiekolwiek znaki co by zaspokoic potrzebe 1 timera? Dlaczego moj sposob niezbyt chce dzialac?

pozdrawiam, Bartek.

Bartosz Waleska wrote: ...

... A co z odpowiedzią na moje dwa pytania kontrolne?

Pozdrawiam,

</ciach>

Dobrze, ze napisales... wzrok juz nie ten, nie zauwazylem ;)

hm... nie... mam tylko: po deklaracji bibliotek, jako zmienna globalna: unsigned char rs_stop;

rs_timeout zeruje w timerze 1. Najpierw wysylam z timer1 zapytanie po rs (rs_send("daj dane");) a nastepnie zeruje rs_timeout, ustawiam "bramkowanie" rs_stop=0x00 i czekam na dane USART1_Receive( void )

to oczywiscie tylko testowo -dziala :) Z tego wiem, ze dochodzi do przepelnienia mojego timeoutu... problem jest pozniej (chyba).

pozdrawiam, bartek.

A to jest FAQ #1 I w 90% przyczyna tzw. "problemów" z przerwaniami.

Pozdrawiam,

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required