Gast
#1191217
Hi :) also ich bekomme einfach keine USART-Kommunikation mit meinem ATmega128 hin. Die Mega103 Kompatibilität ist ausgeschaltet, und ich will USART0 nutzen. Da an den selben Leitungen der ISP-Anschluss hängt, habe ich zu RX und TX welche vom MAX232 kommen, jeweils einen 10k Widerstand eingebaut (hoffe das ist richtig so?). Der ISP-Zugriff klappt prima, nur beim RS232 tut sich gar nicht. Die Baudrate hab ich auf 2400 gestellt, weil ich bislang nur den internen Oszi genutzt hab (hab beim fusen auf den externen den µC schon zweimal "abgeschossen" und musste ihn über nen externen Takt wiederbeleben, also bin ich da nun bissel... ängstlich :)). Den ATmega128 hab ich auf einer Mini-Aufsteck-Platine gekauft, laut Händler ist ein "PBRC16.00MHz Resonator" verbaut. Bei den Fuses im AVR Studio hab ich zuerst dafür CKOPT gesetzt (laut Datenblatt für Frequenzen über 8MHz nötig) und External Crystall/Resonator High Frequenz, Startup-Time: 16K CK + 64ms gewählt... zack ging nichts mehr :) Dann hab ich noch den Ext. RC-Osc. 8MHz-12MHz Startup-time 6CK + 4ms geklickt, und wieder tot. Im Momemnt läuft der µC mit der Einstellung "Int. RC-Osc. 4MHz Startup-time 6CK + 4ms" ... Für das Testen der UART-Verbindung hab ich folgendes Programm geschrieben: ----- .INCLUDE "m128def.inc" .DEF temp = R16 .EQU Baud = 2400 .EQU CLOCK = 4000000 .EQU UBRVAL = CLOCK/(Baud*16)-1 ; Stackpointer initialisieren ldi temp,LOW(RAMEND) ; Unteres Ende des Stackspeichers out SPL,temp ldi temp,HIGH(RAMEND) ; Oberes Ende des Stackspeichers out SPH,temp ; Baudrate einstellen ldi temp,LOW(UBRVAL) out UBRR0L,temp ldi temp,HIGH(UBRVAL) sts UBRR0H,temp ; Frame Format 8bit ldi temp, 0x00 ; R16 wird mir Nullen belegt out UCSR0A, temp ; Control and Status Register A (UCSRA) wird mit Nullen ; belegt out UCSR0B, temp ldi temp,0b00010011 ; = Asynchroner Modus, kein Parity Bit ; 1 Stop Bit, 8 DatenBits sts UCSR0C,temp ; temp wird in UCSRC geschrieben start: cbi UCSR0B,TxEN0 ; Transmit Enable auf 0 gesetzt sbi UCSR0B,RxEN0 ; Receive Enable wird auf 1 gesetzt empfangen: sbis UCSR0A,UDRE0 ; Skip Bit if Set = Überspringe die nächste Anweisuung ; wenn Bit UDRE des Registers UCSRA auf 1 gesetzt ist ; UDR=1 heißt, dass UDR (Buffer) leer ist rjmp empfangen ; wenn UDR nicht leer ist, zurück zu "empfangen" komplett: sbis UCSR0A,RxC0 ; sbis, wenn die Daten komplett empfangen wurden rjmp komplett in temp,UDR0 ; empfangenes Byte aus dem Buffer UDR nach R16 schieben inc temp ; R16 um 1 inkrementieren leer: sbis UCSR0A,UDRE0 rjmp leer out UDR0,temp cbi UCSR0B,RxEN0 ; Receive Enable wird auf 0 gesetzt sbi UCSR0B,TxEN0 ; Transmit Enable wird auf 1 gesetzt test: sbis UCSR0A, UDRE0 ; sbis wenn UDR Empty rjmp test a2: sbis UCSR0A,TxC0 ; Tranmission Complete? rjmp a2 sbi UCSR0A,TxC0 ; manuelles Löschen von TxC durch auf 1 setzen rjmp start ------------ Das Ding funktioniert (mit umgewandelten Registern) auch auf einem ATmega8. Der einzige technische Unterschied ist, dass ich beim ATmega128 einen USB-Seriell-Wandler benutzen muss (der mega8 ist aufm Asuro, da läuft das über einen IR-USB-Transmitter)... könnte das vl auch an dem Teil liegen? Oder hats mit der Taktquelle zu tun? Ich hätte gedacht, dass dann vl fehlerhafte Zeichen kommen, aber im Hyperterminal kann ich nichtmal was eintippen (und es kommt freilich auch nichts :)) .... Wäre super wenn mir jemand auf die Sprünge helfen könnte! Vielen Dank und liebe Grüße, Jan