Beitrag
von Harry » Montag 16. Februar 2004, 12:46
Das Interesse mit Atmel AVRs zu arbeiten, ist ja nicht sooooo gross.
Aber trotzdem möchte ich eine Zusage einhalten. Hier ist der Assembler Code für eine blinkende LED. Bisher wurde der nur mit dem Simulator getestet.
Als Controller nehme ich den ATtiny15L, Ausgang für die LED ist PortB 3.
Viele Grüsse
Harry
Der Code:
.include "tn15def.inc"
;---------------------------------------------------------------------------------
.def CntLoop1 = r16
.def CntLoop2 = r17
.def CntBlink1 = r18
.def CntBlink2 = r19
.def Dummy = r20
;---------------------------------------------------------------------------------
.cseg
.org $0000
;---------------------------------------------------------------------------------
Reset:
;Initialisierung der Portpins
ldi Dummy,0b11111111 ;1=output,0=input
out DDRB,Dummy ;PortB4 alle Pins output
ldi Dummy,0b11111111 ;alle outputs auf high ;
out PortB,Dummy
clr CntLoop1 ;init Variable
clr CntLoop2 ;init Variable
clr CntBlink1 ;init Variable
clr CntBlink2 ;init Variable
;---------------------------------------------------------------------------------
Main:
;Hier beginnt die endlose Hauptschleife
;---------------------------------------------------------------------------------
;Um den Controller ein wenig zu beschäftigen, gibt es erst einmal eine Warteschleife.
;Es gibt eine innere und eine äussere Warteschleife. Mit den Einstellungen wie hier
;dauert sie ca. 10ms.
Loop1:
inc CntLoop1 ;increment Counter
cpi CntLoop1,100 ;default: 249 Vergleich mit Konstanten
brcc Loop2 ;Sprung, wenn Maximum erreicht
rjmp Loop1 ;Schleife wiederholen
Loop2:
inc CntLoop2 ;increment Counter
cpi CntLoop2,8 ;default: 8Vergleich mit Konstanten
brcc EndLoop ;Sprung, wenn Maximum erreicht
clr CntLoop1 ;reset Counter
rjmp Loop1 ;neuer Schleifendurchlauf
;Die Warteschleife ist beendet, jetzt die Zähler für Blinker inkrementieren:
EndLoop:
clr CntLoop1 ;clear Variable
clr CntLoop2 ;clear Variable
inc CntBlink1 ;increment BlinkCounter
inc CntBlink2 ;increment BlinkCounter
;---------------------------------------------------------------------------------
AuswertungCounter1:
;Hier das Blinken der LED erzeugen. Ein guter Wert für die Ein-Zeit sind ca.
;20ms, für Periode 300ms. Dazu wurden ein paar Konsanten definiert. Wenn
;man deren Werte ändert, dann kann man damit den Blinkrhytmus beeinflussen.
.equ AUS_ZEIT = 5 ;5x10ms kann bei Bedarf verändert werden
.equ PERIODE = 50 ;50x10ms kann bei Bedarf verändert werden
cpi CntBlink1,AUS_ZEIT ;Counter mit Grenzwert vergleichen
brcs LED1ein ;Sprung, falls CY=1
rjmp LED1aus
LED1ein:
cbi PortB,3 ;LED einschalten
rjmp EndCounter1 ;Sprung zum Ende der LED1 Bearbeitung
LED1aus:
sbi PortB,3 ;LED ausschalten
cpi CntBlink1,PERIODE ;Counter mit Grenzwert vergleichen
brcs EndCounter1 ;Sprung, falls CY=1
clr CntBlink1 ;clear Counter
EndCounter1:
;---------------------------------------------------------------------------------
EndMain:
;Die Arbeit ist getan, und es geht wieder von vorn los.
rjmp Main