Hallo, ich habe folgendes Problem beim Programmieren des UART meines ATmega644P. Den Code hab ich soweit direkt aus dem Datenblatt übernommen, bis auf Register UBR0, das wird im Datenblatt mit 2 Registern ( High und Low ) dagestellt, wird mir aber beim Compilieren als Fehler angepriesen. Nach dem Initialisieren wird das SendeDatenRegisterFlag UDRE0 ständig geprüft. Sobald dieses Leer, wird das SendeRegister mit dem Byte gefüllt und SOLLTE dann den Wert auf meiner RS232 Schnittstelle ausgegeben . Die Ausgabe überprüfe ich auf meinem Rechner mit Hyperterminal und einem Angeschlossenem Null-Modem Kabel. Leider hab ich dabei keinen Erfolg, es kommen keine Daten an. Ein Blick in den Simulator des AVR-Studios ( Device ist ATmega644P ) zeigt mir, das nach dem Zweiten schreiben in das SendeRegister das EmptyFlag des SendeRegisters ( UDRE0 ) nicht gesetzt wird. Somit bleibt das Programm in der Pollingschleife für das Flag hängen. Scheinbar sendet der Controller die Daten nicht, da auch das TXCO Bit ( Daten gesendet ) zu keiner Zeit auf 1 gesetzt wird. Aber wieso sendet der Controller nicht ? Evtl. Falsche Baudrate berechnet oder einen Fehler beim initialisieren gemacht ? Den Clock Divisor 8 (CKDIV8) hab ich deaktiviert, d.h der Controller sollte mit dem Takt des Externen Quarzes laufen (14,7456MHz) Hier ist das Programm, so wie ich es im Controller geflasht habe. ------------------------------------------------------------------------ -- #include<avr/io.h> int main(void) { //PRR = (PRR|(1<<PRUSART0)); UBRR0 = 95; // BaudRate 9600 bei 14,7456MHz // Transmitter und Receiver Enable UCSR0B = (1<<RXEN0)|(1<<TXEN0); UCSR0C = (1<<USBS0)|(1<<UCSZ00); while(1) { // Abfrage ob Senderegister Leer while ( !(UCSR0A & (1<<UDRE0)) ) ; // Daten in Sende Register legen UDR0 = 0b10101010; } } ------------------------------------------------------------------------ --- Danke schonmal fürs durchlesen, vielleicht kann mir von euch jemand weiterhelfen :) Gruss Markus
Hi Was hast du für ein Board? Beim STK500 wird ein normales Verlängerungskabel verwendet. kein Nullmodemkabel. MfG Spess
Ist kein Kaufboard. Der Max istfolgendermassen angeschlossen : Pin14 T1OUT ---> Pin2 RS232 (Rx) Pin13 R1IN ---> PIN3 RS232 (Tx) Ok, das Null-Modem Kabel funktioniert in diesem Fall natürlich nicht.Werde ich ändern. Erklärt aber immernoch nicht das verhalten in der AVR-Studio Simulation ?!?
Hab mal für nen ATmega8 das ganze Simuliert, und dabei verhält es sich genauso. Ich bin mir aber ganz sicher, das hier das senden mit dem Controller funktioniert hatte. Das mit dem EmptyFlag Scheint wohl mit der Simulation zusammenzuhängen :/ Werde mal ein Anderes Kabel anschliessen, evtl. Sendet der ATmega644P ja die ganze Zeit schon, und es hängt wirklich nur an dem Kabel.
Hi Der Simulator hat einige Macken. Mal in der Hilfe bei 'Known Issues' nachsehen. MfG Spess
Hab da jetz nix gefunden. Ich warte jetz einfach mal auf das Kabel ab, werde dann schreiben falls es daran gelegen hatte.... Gruss Maggus
Ok, funktioniert nun :) (freu) Scheinbar waren es zwei Sachen auf einmal ..... a) Der Simulator vom AVR-Studio ist scheinbar sehr launig. Am Schluss konnte ich nichteinmal die Ports als Ausgänge definieren, über die Anweisung ist er einfach drübergesprungen. Deshalb auch wahrscheinlich der Fehler mit dem Empty-Flag. b) Wenn man sich ein Adapterkabel selbst bauen will, sollte man sich auch über die Belegung im klaren sein , Soviel nur dazu ;) Trotzdem vielen Dank für die Hilfe :) Gruss Maggus
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.