Moin, ich hab folgendes Problem mit der USART: Es kommt nichts an, es ist so, als ob der Controller falsch initializiert wäre... Mein Code sieht so aus: /* Initialisierung der UART */ UBRRH = 23; /*ext. Quarz 3,68.. MHz -> Baudrate : 9600 UCSRB = ( (1<<RXCIE) | (1<<TXCIE) | (1<<RXEN) | (1<<TXEN) ); UCSRC = ( (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0)); CLEARBIT(DDRD,DDD0); // Pullup für RxD aktivieren SETBIT(PORTD,DDD0); void transmit ( unsigned char data ) { SETBIT(PORTD,PD2); // RS485 auf Sendung while ( !(UCSRA & (1<< UDRE )) ) // Warten bis Senderegister leer ; UDR = data; } Kann mir jemand das Problem sagewn?? Vielen Dank
> SETBIT(PORTD,PD2); // RS485 auf Sendung
Und wann setzt Du den Pin wieder auf Low?
Bedenkst Du, dass, nachdem Du in UDR geschrieben hast, die RS485 eine
Weile eingeschaltet bleiben muss?
Am besten direkt am TXD mit dem Oszi messen, dann kannst Du eingrenzen,
ob das Problem im mc oder an der Ansteuerung des RS485-Treibers liegt.
Stefan
Also, es kommt etwas an dem Controller an, allerdings wird es nicht richtig verarbeitet...ich glaube ich frage das UDR zweimal ab, is ja bei USART ein doppeltes FIFO im Vergleich zum UART... Kann das der Fehler sein?? Wie behebe ich das am besten?? Der RS485 wird im TXC_Interrupt gecleared, daran liegt es also nicht...
Hab eben nachgemessen, der RS485 empfängt was...Das Problem schient also im MC zu liegen... Hier nochmal meiner Interrupts: #pragma vector=USART_RXC_vect __interrupt void USART_RXC_interrupt ( void ) { while( !(UCSRA & (1<<RXC))) ; transmit(UDR); //empfangenes Zeichen ausgeben if (BUFPTR<12) { INBUF[BUFPTR]=UDR; BUFPTR++; } else { INBUF[BUFPTR-1]=UDR; } } #pragma vector=USART_TXC_vect __interrupt void USART_TXC_Complete_interrupt ( void ) { CLEARBIT(PORTD,PD2); // RS485 auf Empfang }
Du liest UDR zweimal. Das ist mal ein Fehler: hier: transmit(UDR); //empfangenes Zeichen ausgeben und hier: INBUF[BUFPTR]=UDR; Zwischenspeichern in lokaler Variable ist da besser, macht den effektiven Code eher kürzer: my_data = UDR, transmit(my_data); if ... INBUF[BUFPTR] = my_data; Folgende Zeile finde ich etwas fragwürdig: while( !(UCSRA & (1<<RXC))); RXC ist an dieser Stelle IMMER gesetzt. Und wenn es nicht gesetzt WÄRE, dann bist Du im IR in einer Endlosschleife, bis mal wieder Daten ankommen. Was ist eigendlich genau das Problem / wie macht sich der Fehler bemerkbar? Ich dachte, Du hast beim Senden Schwierigkeiten? Steht in INBUF was bzw. wird BUFTR erhöht? Stefan
Problem war tatsächlich dass ich beim mega8 nicht zweimal auch dem UDR lesen kann...also zwischenspeichern und schon gehts.. danke
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.