Bartosz Waleska
Guest
Tue May 18, 2004 1:04 pm
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();
}
Artur Lipowski
Guest
Wed May 19, 2004 6:20 am
Bartosz Waleska wrote:
....
Quote:
Generalnie chcialbym by po ustawieniu rs_stop na 1 usart wyslal K i
zakonczyl dzialanie.
A masz rs_stop zadeklarowane jako volatile?
....
Quote:
SIGNAL (SIG_OVERFLOW0){
rs_timeout++;
if (rs_stop == 0x00){
if (rs_timeout >= 220){
BTW> a gdzie zerujesz rs_timeout
Quote:
usart0_send("RS time outss");
To rozumiem, że tylko testowo, bo wypisywanie w ISR stringu przez UART
jest co najmniej problematyczne.
Quote:
wdt_reset();
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,
--
Artur Lipowski
Bartosz Waleska
Guest
Wed May 19, 2004 5:48 pm
</ciach>
Quote:
wdt_reset();
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.
Artur Lipowski
Guest
Thu May 20, 2004 5:22 am
Bartosz Waleska wrote:
....
Quote:
A test jakos przeprowadzic trzeba, no a co z moim rs timeout?
....
A co z odpowiedzią na moje dwa pytania kontrolne?
Pozdrawiam,
--
Artur Lipowski
Bartosz Waleska
Guest
Thu May 20, 2004 5:44 am
</ciach>
Dobrze, ze napisales... wzrok juz nie ten, nie zauwazylem ;)
Quote:
A masz rs_stop zadeklarowane jako volatile?
hm... nie...
mam tylko:
po deklaracji bibliotek, jako zmienna globalna:
unsigned char rs_stop;
Quote:
...
SIGNAL (SIG_OVERFLOW0){
rs_timeout++;
if (rs_stop == 0x00){
if (rs_timeout >= 220){
BTW> a gdzie zerujesz rs_timeout
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 )
Quote:
usart0_send("RS time outss");
To rozumiem, że tylko testowo, bo wypisywanie w ISR stringu przez UART
jest co najmniej problematyczne.
to oczywiscie tylko testowo -dziala
Z tego wiem, ze dochodzi do przepelnienia mojego timeoutu... problem jest
pozniej (chyba).
pozdrawiam,
bartek.
Artur Lipowski
Guest
Thu May 20, 2004 6:18 am
Bartosz Waleska wrote:
Quote:
A masz rs_stop zadeklarowane jako volatile?
hm... nie...
mam tylko:
po deklaracji bibliotek, jako zmienna globalna:
unsigned char rs_stop;
A to jest FAQ #1
I w 90% przyczyna tzw. "problemów" z przerwaniami.
Pozdrawiam,
--
Artur Lipowski