Vagy egy AT90USB1287 AVR-em,a mivel kicsit meggyűlt a bajom. Elég misztikus hibákat produkál, amit arra tudtam visszavezetni, hogy UART adatküldéskor resetelődik a kontroller.
A probléma akkor derült ki, amikor visszaküldettem vele a belső adatokat. Kiderült, hogy az UART-ről beolvasott adatokat simán eltárolja, de ha vissza is küldetem, a küldés után minden belső változó újra inicializálódott. Ez a gyakorlatban úgy néz ki, hogy az első UART parancs hatására minden, korábban UART-on kapott adatot visszaküldött, a közvetlenül utána küldött kiolvasó parancsra viszont már csupa null érték jött.
A végletekig egyszerűsítve mutatja a problémát az alábbi forrsákód, melyet futtatva végtelen mennyiségű '?' árasztja el a soros portot.
Kód: Egész kijelölése
int main(void)
{
callAllInit();
enableTransciever();
startRN42();
WDTCSR = 0;
sendChar('?');
while(1)
{
}
}
Ebből a callAllInit az alábbi USART initet hívja:
void uSARTInit()
{
UCSR1A = _BV(U2X1); //clearing flags, setting double speed (versus normal)
//UCSR1B = 0; //disabling transmitter, setting UCSZ12 in order to provide 8 bit frames
UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); //8 bit, 1 stop bit, no parity
UBRR1H = ((unsigned int)(BAUD_PRESCALE) >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
UBRR1L = ((unsigned int)(BAUD_PRESCALE)); // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
}
Az enableTransciever ezt a két függvényt hajtja végre:
void enableTransmitter()
{
UCSR1B = UCSR1B | _BV(TXEN1) | _BV(TXCIE1); //Transmitter, enable, transmitt complete interrupt enable
}
void enableReciever()
{
UCSR1B = UCSR1B | _BV(RXEN1) | _BV(RXCIE1); //Reciever, enable, recieve complete interrupt enable
}
A sendChar() pedig így működik:
void sendChar(char c)
{
char temp = c;
while(!rN42ready()); //ez az UART adatokat fogadó modul flow control jeleit ellenörzi.
while(checkDataRegister());
UDR1 = temp;
}
Van valakinek ötlete, hogy ez mi lesz?
[/b]
