Hallo. Das TerminalProgramm zeigt immer nur das gleiche Zeichen. Mein Programm: .include <m48def.inc> .equ XTAL= 10000000 .equ Baud= 9600 ; Berechnungen .equ UBRR_VAL = ((XTAL+baud*8)/(BAUD*16)-1) ; berechnet die Baudrate ;.equ UBRR_VAL = xtal/(baud*16)-1 .equ BAUD_REAL = (XTAL/(16*(UBRR_VAL+1))) ; und den Fehler .equ BAUD_ERROR = ((BAUD_REAL*1000)/baud-1000) ; .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; .error "Fehler der Baudrate > 1%!" .endif .def i = r16 .def s = r17 .def l = r18 .def zahl = r19 .def temp1 = r23 .def temp2 = r24 .def temp3 = r25 init: ldi i, LOW(RAMEND) out SPL, i ldi i, HIGH(RAMEND) out SPH, i ;ldi i, 0x0c ;out DDRD, i ; Ein- & Ausgänge PORTD festlegen ;ldi i, 0x10 ;out PORTD, i ; Pullup einschalten ldi i, LOW(UBRR_VAL) ; eintragen sts UBRR0L, i ldi i, HIGH(UBRR_VAL) ; Übertragungsrate ins sts UBRR0H, i ; entsprechende Register ldi i, (1<<USBS0) | (3<<UCSZ00) ; 8bit Mode sts UCSR0C, i lds i, UCSR0B ldi i, (1<<TXEN0); senden aktivieren sts UCSR0B, i loop: ldi i, 'A' rcall sertrans ldi i, '7' rcall sertrans ldi i, 'c' ;rcall sertrans ldi i, 'h' ;rcall sertrans ldi i, '!' ;rcall sertrans ldi i, 10 ;rcall sertrans ldi i, 13 ;rcall sertrans rcall delay5ms rjmp loop sertrans: lds s, UCSR0A sbrs s, UDRE0 ; kiecken ob noch übertragen wird rjmp sertrans sts UDR0, i ret delay5ms: push i push s ; i & s auf dem stack sichern ldi i, 65 ; 65 Durchläufe für 5ms delay50ms0: ldi s, 0xff delay50ms1: dec s brne delay50ms1 dec i brne delay50ms0 pop s pop i ret Die Fusebits sind korrekt gesetzt (CKSEL0111), hab schon verschiedene Quarze probiert und das Signal am 9pol Stecker sieht auch sauber aus und ändert wenn ick verschiedene Zeichen sende. Hab keine Ahnung wo die Säge klemmt. Kann mir jemand sagen, weswegen Hyperterm nur Kästchen zeigt und HTerm nur 0x00 & 0x80 empfängt?
Versuch mal TX auf Ausgang zu konfigurieren. und WELCHES Zeichen kommt immer an? Envetuell doch falsche Baudrate/Quarz?
1 | lds i, UCSR0B |
2 | ldi i, (1<<TXEN0); senden aktivieren |
3 | sts UCSR0B, i |
Die erste Zeile ist ohne effekt da du i gleich wieder überschreibst. Wenn das nicht geplant ist muß es heißen:
1 | lds i, UCSR0B |
2 | ori i, (1<<TXEN0); senden aktivieren |
3 | sts UCSR0B, i |
>To do a 16-bit write, the high byte must be written before the low byte. >For a 16-bit read, the low byte must be read before the high byte.
1 | ldi i, LOW(UBRR_VAL) ; eintragen |
2 | sts UBRR0L, i |
3 | ldi i, HIGH(UBRR_VAL) ; Übertragungsrate ins |
4 | sts UBRR0H, i ; entsprechende Register |
Muß also hier umgekehrt erfolgen (ebenso der zugriff auf den Stackpointer!)
1 | ldi i, HIGH(UBRR_VAL) ; Übertragungsrate ins |
2 | sts UBRR0H, i ; entsprechende Register |
3 | ldi i, LOW(UBRR_VAL) ; eintragen |
4 | sts UBRR0L, i |
> Wie kann man eine falsche Baudrate/Quarz erkennen? ^^^^^^^^ z.B. Wenn nichts oder das falsche beim Empfänger ankommt. Das kann an der Baudrate liegen, muss aber nicht (besondern im Fall nixhts kommt an) > Wie kann man eine falsche Baudrate/Quarz erkennen? ^^^^^ Auf dem nach AVR Datenblatt angeschlossenen Quarz steht was anderes als 10 MHz drauf und die Fuses im AVR sind nicht so gesetzt, dass dieser External Crystal zum Schwingen angeregt wird.
Tatsächlich kommt etwas falsches an, 0x00 und 0x80, keine anderen Zeichen. Verschiedene Quarze hab ick schon probiert und ohne Quarz tut sich gar nichts. Am Ende meiner Schaltung lassen sich die Daten wunderbar mit dem OSZi ankiecken. Und wenn ick auf der Atmega-Fassung Tx und Rx verbinde, funktioniert der EchoTrick im TerminalProgramm wunderbar. Mir fällt nichts mehr ein!
Ja, vielen Dank. Hab das LOW & HIGH-Byte wieder getauscht. Das Programm funktioniert. Irgendwie versteht der Rechner wohl nicht, was vom µC kommt????!!!!!
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.