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
Die 10kOhm soltest du besser wieder ausbauen, die Max232 haben interne Pulldownwiderstände. Da wird wesentlich mehr Strom benötigt um durchzuschalten, als über einen 10k kommen kann. Bau besser Jumper ein um den Max abzutrennen oder verzichte auf den ISP (Bootloader verwenden). Grüße, Peter
UART mit dem internen Oszillator ist reines Glücksspiel! Das geht nur mit einem Quarz wirklich zuverlässig.
ah ok danke soweit! kann mir denn jemand sagen, welche einstellung ich für den ext. takt wählen muss? ... wie gesagt, die bezeichnung bringt mich irgendwie durcheinander... :/ danke!
Jan wrote: > kann mir denn jemand sagen, welche einstellung ich für den ext. takt > wählen muss? Als allererstes musst Du entscheiden, ob Du tatsächlich einen externen Takt (external clock) hast oder einen Quarz (external crystal). Das sind nämlich zwei völlig unterschiedliche Dinge. > ... wie gesagt, die bezeichnung bringt mich irgendwie > durcheinander... :/ Welche Bezeichnung? AVR Fuses
dieses ding hier soll der externe taktgeber sein: PBRC16.00MHz Resonator ... nur das sieht ja für mich nach einem rc-oszi aus? ... und der µC ist bei der einstellung ja bereits abgeschmiert bei mir.. ? danke weiterhin!
Hi >dieses ding hier soll der externe taktgeber sein: PBRC16.00MHz Resonator >... nur das sieht ja für mich nach einem rc-oszi aus? ... und der µC ist >bei der einstellung ja bereits abgeschmiert bei mir.. ? Schon mal Datenblatt angesehen? MfG Spess
ah um ehrlich zu sein - nein *g ... entschuldigung. (und danke :)) also das sieht für mich nach einem quarz, sprich external crystal aus. nur wieso ging dann die einstellung External Crystall/Resonator High Frequenz, Startup-Time: 16K CK + 64ms plus gesetzte CKOPT fuse nicht? ... also nachdem ich das so eingestellt und die fuses geschrieben hab, konnte ich nichtmehr auf den µC zugreifen? ...
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.