$crystal = 8000000
$regfile = "attiny2313.dat"
$hwstack = 20 ' default use 32 for the hardware stack
$swstack = 20 'default use 10 for the SW stack
$framesize = 10 'default use 40 for the frame space
$baud = 19200
$sim
Radio_out Alias Portb.0
'****Interruptvektoren****
On Oc1a Oc1a_isr Nosave
'Variablen
Dim Bitzaehler As Byte
Dim Adress As Byte
Dim Kommando As Byte
'****NEC init****
Tccr1a = 2 'für normale I/O und WGM=14
Ocr1a = 17999
Icr1 = 17999
Ddrb.3 = 1 'PortB.3 (OC1A) ist Ausgang
Bitzaehler = 39
'****Interrupts freigeben****
Enable Oc1a
Enable Interrupts
'****zu sendende Daten****
Adress = &B10011101
Kommando = &B00101000
'****senden starten****
Tccr1b = 25 'Startburst wahrscheinlich Takt zu lang
SBI PORTB, PORTB3 'ggf TCNT vorladen (auch in ISR)
'******Hauptschleife******
Do
'leer
Loop
'*****Interrupt Service Routinen****
Oc1a_isr:
$asm 'Assemblerblockanfang
PUSH XH
PUSH XL
PUSH R16
IN R16, SREG
PUSH R16 'Register und SREG gesichert
Loadadr Bitzaehler , X 'X Enthält Bitzaehler -speicheradresse
LD R16, X 'R16=Bitzähler
DEC R16 'R16 dekrementiert
ST X+, R16 'Bitzähler zurückgespeichert, X enthält Adress-Adresse
BREQ naechstesVorbereiten 'final wurde gesendet, Sprung (nächstes vorbereiten)
CPI R16, 35 'Z=1 <==> Bitzaehler (jetzt)= 35
BREQ burstAbschalten 'dann springe burstAbschalten
cpi R16, 34 'Z=1<==>Bitzaehler=34
BREQ pauseEnde 'dann -> Pause Ende
CPI R16, 33 'C=1<==>Bitzaehler<33
BRSH dasWars '>=33->dasWars (0,35,34 wurden bereits behandelt, bleiben die 32 Bits)
CPI R16, 17 'Carry bei den letzten 17 als einem Endburst (R16=0) plus 16 Bits(R16=16..1)
BRCC AdresseStimmt 'sonst überspringe
inc XL 'X =Kommandoadresse
Adressestimmt:
LD R16, X
LSL R16 'einmal nach links schieben, MSB wandert ins Carry
BRCS EinsSenden 'bei 1 springe, bei 0 bleibe
INC R16 'links wurde ne 0 rausgeschoben, deswegen wird die 0 hinten zur 1 invertiert
ST X, R16 'Byte zurückgespeichert
LDI R16, hbyte(8999)
Out Icr1h , R16
LDI R16, lbyte(8999)
Out Icr1l , R16 'Icr Angepaßt
RJMP dasWars 'Fall 0 erledigt
Einssenden:
ST X, R16 'die hinten eingeschobene 0 ist bereits invers zur 1 - Byte zurückgespeichert
LDI R16, hbyte(17999 )
Out Icr1h , R16
LDI R16, lbyte(17999 )
Out Icr1l , R16 'Icr Angepaßt
RJMP dasWars 'Fall 1 erledigt
Pauseende:
LDI R16, hbyte(4499)
Out Ocr1ah , R16
LDI R16, lbyte(4499) 'Ocr Vieder Auf 562,5µs
Out Ocr1al , R16 'wird erst nach dem nächsten TOV aktiv
LDI R16, 130
Out Tccr1a , R16 'B3 wird PWM (lo->hi beim nächsten TOV)
RJMP dasWars '->dasWars
Burstabschalten:
CBI PORTB, PORTB3 'B3 -> lo
RJMP dasWars '->dasWars
Naechstesvorbereiten:
LDI R16 , 24
Out Tccr1b , R16 'Timer Steht
LDI R16, hbyte(17999)
Out Ocr1ah , R16
Out Icr1h , R16
LDI R16, lbyte(17999)
Out Ocr1al , R16
Out Icr1l , R16 'Ocr1a Und Icr1 Für Nächsten Start Vorbereitet
LDI R16, 39
STS {Bitzaehler},R16 'Bitzäehler reinitialisiert (39)
LDI R16,0
Out Tcnt1h , R16
Out Tcnt1l , R16 'Timer = 0 (Reload, ggf anpassen)
LDI R16, 2
Out Tccr1a , R16 'B3 ist wieder I/O
Daswars:
POP R16
Out Sreg , R16
POP R16
POP XL
POP XH 'SREG und Register (R16, XH, XL) wiederhergestellt
$end Asm
Return