Hallo! ich habe einen avr 644p und möchte so wie es im "AVR-Tutorial: UART" mit dem mega8 beschrieben ist zeichen an meinen Rechner per rs232 senden. - Hardware Max 232 & Co ist aufgebaut und funktioniert - Hterm installiert - ich benutze AVR Studio - habe versucht den Quelltext aus dem "AVR-Tutorial: UART" auf meinen 644p anzupassen. Was habe ich vergessen anzupassen oder falsch gemacht? Gibt es eine Diagnose-Möglichkeit um festzustellen, wo der 644p hängen bleibt und kann man die Speicher auslesen? Besten Dank im Voraus!!! .include "m644pdef.inc" .def temp = r16 .def zeichen = r17 .def rxy = r19 .equ F_CPU = 2000000 ; Systemtakt in Hz .equ BAUD = 9600 ; Baudrate ; Berechnungen .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!" .endif ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, LOW(RAMEND) out SPL, temp ; Baudrate einstellen ldi temp, HIGH(UBRR_VAL) sts UBRR0H, temp ldi temp, LOW(UBRR_VAL) sts UBRR0L, temp ; Frame-Format: 8 Bit ldi temp, (1<<USBS0)|(3<<UCSZ00) sts UCSR0C, temp lds rxy,UCSR0B sbr rxy,1<<TXB81 sts UCSR0B,rxy loop: ldi zeichen, 'T' rcall serout ; Unterprogramm aufrufen ldi zeichen, 'e' rcall serout ; Unterprogramm aufrufen ldi zeichen, 's' rcall serout ; ... ldi zeichen, 't' rcall serout ldi zeichen, '!' rcall serout ldi zeichen, 10 rcall serout ldi zeichen, 13 rcall serout rcall sync rjmp loop serout: lds rxy,UCSR0A sbrs rxy,UDRE0 rjmp serout sts UDR0, zeichen ret ; zurück zum Hauptprogramm ; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich ; das Kabel getrennt wurde sync: ldi r16,0 sync_1: ldi r17,0 sync_loop: dec r17 brne sync_loop dec r16 brne sync_1 ret
> sbr rxy,1<<TXB81
Du willst wirklich dem PC 9-Datenbits senden? Üblich sind 8-Datenbits.
Bei 8-Bit solltest dich nicht am Beispiel 16.7.2 orientieren sondern am
Beispiel 16.7.
Hi, ich kann sbrs UCSR0A,UDRE0 nicht verwenden da ich mit sbrs auf diese Register keinen Zugriff habe. Ich habe versucht das damit zu umgehen. lds rxy,UCSR0B den Wert in rxy zwischenspeichern sbr rxy,1<<TXB81 ; UCSR1B - USART Control and Status Register B ; .equ TXB81 = 0 ; Transmit Data Bit 8 sts UCSR0B,rxy und wieder zurückschreiben
Warum "Transmit Data Bit 8", d.h. 9 Datenbits (Bits 0..8), wo doch ein PC üblicherweise nur mit 8 Datenbits (0..7) arbeitet. Mir ist so ein Exoten-PC noch nie begegnet. Ich würde den Teil in der Initialisierung komplett weg lassen und die UART so initialisieren, dass die UART mit 8 Datenbits arbeitet.
So jetzt mit etwas mehr Zeit... In http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#UART_konfigurieren ist folgende Zeile für den Atmega8
1 | sbi UCSRB,TXEN ; TX aktivieren |
Beachte das TXEN, d.h. Sender (TX) einschalten (ENablen). Das ist ein anderes Bit in UCSRB mit anderer Funktion anderes als dein TXB81. Die Anpassung von IO-mapped Register beim Atmega8 auf Memory-mapped Register beim Atmega644p sieht also so aus:
1 | lds rxy, UCSR0B |
2 | sbr rxy, (1<<TXEN0) |
3 | sts UCSR0B, rxy |
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.