Hallo Leute !
Mein Programm macht folgendes: Alle 100 ms wird über UART ein 'X' an
ein Terminalprogramm gesendet. Nach 10 mal 'X' (also 1 Sek.) wird
eine '0' geschickt. Recht simpel. Tatsächlich kommt aber noch vor
jeder '0' ein seltsames Zeichen, das ich nicht bestellt habe und
nicht will. So sieht das dann aus:
XXXXXXX¬0XXXXXXXXX¬0XXXXXXXXX¬0XXXXXXXXX¬0XXXXXXXXX
Weg mit dem ¬ ! Wo kommt das her ? Wie kann ich das ausschalten /
unterdrücken ? Wer weiss einen Rat ?
Danke !
Tilman
.include "tn2313def.inc"
.def temp = r16
.def count = r24
.def count2 = r25
.equ CLOCK = 4000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
.org 0x0000
rjmp main ; Reset Handler
.org 0x0001
rjmp int0_handler
.org 0x0002
rjmp int1_handler ; IRQ1 Handler
.org 0x0006
rjmp timer0
main:
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp
; Frame-Format: 8 Bit
ldi temp, (1<<UCSRC)|(3<<UCSZ0)
out UCSRC, temp
sbi UCSRB,TXEN ; TX aktivieren
ldi temp, 0b00000010 ;Timer 0 auf CK 8 einstellen 2µs
out TCCR0, temp ;Timer in Betrieb
ldi temp, 0b00000010 ;Timer 0 Interrupt initialisieren
out TIMSK, temp
ldi temp, 0b00000010 ;jede Änderung löst Interrupt aus
out MCUCR, temp
ldi temp, 0b11000000 ;INT0 und INT1 aktivieren
out GIMSK, temp
ldi temp, 0x00
out DDRD, temp
ldi temp, 0xFF
out DDRB, temp
sei ;Interrupts allgemein aktivieren
loop: cpi count,200 ; 102,4 ms vorbei ?
breq zehnms
cpi count2,10
breq einsek
rjmp loop
zehnms:
ldi temp,'X' ;tritt alle 10 ms ein
push temp
rcall serout
clr count
inc count2
rjmp loop
einsek:
ldi temp,'0'
push temp
rcall serout ;sollte eigentlich jede Sekunde passieren
clr count
clr count2
rjmp main
serout: sbis UCSRA,UDRE
rjmp serout
out UDR, temp
ret ; zurück zum Hauptprogramm
timer0:
;push temp
inc count
;pop temp
reti
int0_handler:
ldi temp,'G'
rcall serout
reti
int1_handler:
ldi temp,'H'
rcall serout
reti
Also in Interrupts grundsätzlich das SREG sichern und alle anderen verwendeten Register. Und Funktionen, die aus Main aufgerufen werden, nicht auch in Interrupts aufrufen. Profis können das in Ausnahmefällen doch, bei Aus- oder Eingabfunktionen kommt aber grundsätzlich Mumpitz raus. Peter
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.