;***********************************************************************
***
;Seicherreservierung
INIT:
ldi buffer, LOW(RAMEND) ;Initiate Stackpointer
out SPL, buffer ; wegen Interrupts und Unterprogr.
ldi buffer, HIGH(RAMEND)
out SPH, buffer
;***********************************************************************
***
START_ZEICHEN:
;***********************************************************************
***
;Manuelle ID Eingabe
ldi buffer, 0x05
sts ID_HIGH, buffer
ldi temp, 0x0f
sts ID_LOW, temp
;***********************************************************************
***
clr NULL
clr High_Test
clr Low_Test
clr BUSRUHE_GELESEN
ldi buffer, 0xfe
out ddrb, buffer ;Port B wird Ausgang
ldi buffer, 0xff ;PortB Pin 0 ist Eingang
out ddrd, buffer ;Port d wird Ausgang
;***********************************************************************
***
; Die Counter werden aktiviert und zählen jetzt los.
; Damit die 8-Bitzeiten Busruhe eingehalten werden können wird
; in das OUTPUT COMPARE REGISTER(OCR1B) ein Wert geladen
out ocr1ah, buffer
out ocr1al, buffer
ldi buffer, (1<<OCIE1B) ;Es werden Interrupts zugelassen für
out timsk, buffer ;Compare Counter B
ldi buffer,(1<<COM1B1)
out tccr1a, buffer ;Compare Counter B wird aktiviert
ldi buffer, (1<<CS10)
out tccr1b, buffer
sei
ldi buffer, BUSRUHE_HIGH
out ocr1bh, buffer
ldi buffer, BUSRUHE_LOW
out ocr1bl, buffer
;***********************************************************************
***
;Diese Schleife wird so oft durchlaufen bis die 8_bitzeiten abgelaufen
sind.
;Sollten während der Busruhe von 8-Bitzeiten eine Low-Flanke auftreten,
;wird der Counter auf Null gesetzt.
;Hiermit wird Sichergestellt, dass die Messung nicht in der Mitte eines
Frames anfängt
LOOP:
sbi portd,6
sbic PINB,0
rjmp RUECKSETZEN
rjmp LOOP
RUECKSETZEN:
out tcnt1h, NULL
out tcnt1l, NULL
rjmp loop
;***********************************************************************
***
;Einfache Warteschleife
START:
sbi portd,6
rjmp START
;***********************************************************************
***
;Erstes Bit nach der Busruhe wurde eingelesen.
;Das INPUT CAPTURE REGISTER(ICP) wird nun auf steigende Flanke
;gesetzt und der Counter wird damit ein Zeitstempel für
;das OUTPUT COMPARE REGISTER A erstellen. Dieser Zeitstempel
;dient später zur Messung der Bitzeiten.
OUTP_COMP_B_INT:
in buffer, SREG
push buffer
cli
out tcnt1h, NULL ;Der Counter wird auf ein Anfagswert
ldi buffer, RELOAD_COUNTER ;gesetzt
out tcnt1l, buffer
ldi buffer,(1<<ticie1) ;Es werden Interrupts zugelassen für
out timsk, buffer ;Input Capture
ldi buffer, (1<<ICF1)
out TIFR, buffer
ldi buffer,(1<<CS10)
out tccr1b, buffer ;Capture auf fallende Flanke
inc BUSRUHE_GELESEN
ldi counter, 0x00
pop buffer
out SREG,buffer
sei
ret
;***********************************************************************
***
ICP_INT:
in buffer, SREG ;Status-Register Sichern
push buffer ;und auf derm Stack ablegen
cli ;Globale Interrupt deaktiviere
inc Counter
cpi Counter, 0x01 ;Überprüfen, welches Bit eingelesen wurde
breq WECHSEL_EINS ;
cpi Counter, 0x02 ;
breq WECHSEL_ZWEI ;
WECHSEL_EINS:
cbi portd,6
out tcnt1h, NULL ;Der Counter wird auf ein Anfagswert
ldi buffer, RELOAD_COUNTER ;gesetzt
out tcnt1l, buffer ;
ldi buffer, (1<<ICES1)|(1<<CS10);
out tccr1b, buffer ;Capture auf steigende Flanke
pop buffer ;Zurückholen des Status-Registers vom Stack
out SREG,buffer ;Rückladen
sei
reti
WECHSEL_ZWEI:
cbi portd,6
ldi buffer,(1<<CS10) ;Capture auf fallende Flanke
out tccr1b, buffer
clr counter
pop buffer ;Zurückholen des Status-Registers vom Stack
out SREG,buffer
sei ;Globale Interrupt zulassen
rjmp INIT
/*
;***********************************************************************
***