Desert-Storm
15.06.2008, 15:32
Hallo Leute,
ich habe mich seit kurzem mal an das Uart meines Atmega8 gewagt. Allerdings habe ich das Problem das ich in meinem Terminalprogramm ( Hterm) nur manchmal das vom Chip gesendete 'Test!\n\r' empfange. Wenn ich die Verbindung bei Hterm allerdings öfters neu verbinde kommt das Test irgendwann. Kann mir jemand sagen wo mein Fehler liegt?
Ich möchte damit wenns läuft Messwerte übertragen und es hat ja keinen Sinn wenn die nur manchmal richtig übertragen werden.
Hier ist der von mir verwendete Code:
.include "m8def.inc"
.def temp = r16
.def zeichen = r17
.equ F_CPU = 4000000 ; 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
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
; Baudrate einstellen
ldi temp, HIGH(UBRR_VAL)
out UBRRH, temp
ldi temp, LOW(UBRR_VAL)
out UBRRL, temp
ldi temp, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)|(0<<UCSZ2)|(0<<UMSEL)|(0<<UPM0)|(0<<UPM1)|(0<<USBS)
out UCSRC, temp
sbi UCSRB,TXEN
loop:
ldi zeichen, 'T'
rcall senden
ldi zeichen, 'e'
rcall senden
ldi zeichen, 's'
rcall senden
ldi zeichen, 't'
rcall senden
ldi zeichen, '!'
rcall senden
ldi zeichen, 10
rcall senden
ldi zeichen, 13
rcall senden
rjmp loop
senden:
sbis UCSRA,UDRE
rjmp senden
out UDR, zeichen
ret
Danke
Michael
ich habe mich seit kurzem mal an das Uart meines Atmega8 gewagt. Allerdings habe ich das Problem das ich in meinem Terminalprogramm ( Hterm) nur manchmal das vom Chip gesendete 'Test!\n\r' empfange. Wenn ich die Verbindung bei Hterm allerdings öfters neu verbinde kommt das Test irgendwann. Kann mir jemand sagen wo mein Fehler liegt?
Ich möchte damit wenns läuft Messwerte übertragen und es hat ja keinen Sinn wenn die nur manchmal richtig übertragen werden.
Hier ist der von mir verwendete Code:
.include "m8def.inc"
.def temp = r16
.def zeichen = r17
.equ F_CPU = 4000000 ; 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
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
; Baudrate einstellen
ldi temp, HIGH(UBRR_VAL)
out UBRRH, temp
ldi temp, LOW(UBRR_VAL)
out UBRRL, temp
ldi temp, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)|(0<<UCSZ2)|(0<<UMSEL)|(0<<UPM0)|(0<<UPM1)|(0<<USBS)
out UCSRC, temp
sbi UCSRB,TXEN
loop:
ldi zeichen, 'T'
rcall senden
ldi zeichen, 'e'
rcall senden
ldi zeichen, 's'
rcall senden
ldi zeichen, 't'
rcall senden
ldi zeichen, '!'
rcall senden
ldi zeichen, 10
rcall senden
ldi zeichen, 13
rcall senden
rjmp loop
senden:
sbis UCSRA,UDRE
rjmp senden
out UDR, zeichen
ret
Danke
Michael