Hallo Leute,
ich dachte mir, daß es Zeit wird, mal nen neuen Thread zu eröffnen.
In einem Buch (speziell zum Tin2313) entdeckte ich einen Code, wo ich dachte
"eine LED zum blinken zu bringen...na was ist das schon"!
Aber denkste! Es tauchten so viele neue Befehle und Strukturen auf, was mein Wissen
überforderte.
Alle angesetzten Kommentare stammen von mir. Und es hat an Zeit gekostet, mich dadurch zu kämpfen.
D.h. mit Hilfe eines anderen Buchs, indem die Befehle sehr schön dokumentiert werden, war es möglich
etwas Licht in die Sache zu gewinnen. Vieles habe ich besonders am Anfang umgemodelt. Jetzt weiß ich auch
mit den Variablen (.equ xxxx,xx) umzugehen.
Wie man allerdings auf eine Blinkfrequ. von 500ms kommt...mh!
Na schaut Euch das mal an.
Grüße
Rolf
ich dachte mir, daß es Zeit wird, mal nen neuen Thread zu eröffnen.
In einem Buch (speziell zum Tin2313) entdeckte ich einen Code, wo ich dachte
"eine LED zum blinken zu bringen...na was ist das schon"!
Aber denkste! Es tauchten so viele neue Befehle und Strukturen auf, was mein Wissen
überforderte.
Alle angesetzten Kommentare stammen von mir. Und es hat an Zeit gekostet, mich dadurch zu kämpfen.
D.h. mit Hilfe eines anderen Buchs, indem die Befehle sehr schön dokumentiert werden, war es möglich
etwas Licht in die Sache zu gewinnen. Vieles habe ich besonders am Anfang umgemodelt. Jetzt weiß ich auch
mit den Variablen (.equ xxxx,xx) umzugehen.
Wie man allerdings auf eine Blinkfrequ. von 500ms kommt...mh!
Na schaut Euch das mal an.
Code:
; Projekt-Name: Projekt01 Datum: 16.11.2012
; Datei: Maske.asm (aus dem Buch Seite 61 / test3)
; PORTB,xx (Output)
; PINB,xx (Input)
; DDRB,akku (Datenrichtung)
; AVR: Tiny2313-20PU
.INCLUDE "tn2313def.inc" ; Deklaration für Tiny2313
rjmp reset ; Reseteinsprung
.ORG OVF0addr ; Interrupt-Vektor
rjmp TIMER0_OVF ; Sprung zur ISR
.def akku=r16
.def temp1=r17
.def stavec=r22
.def itmp=r25
.equ CNTVAL=0x3D
.equ TICKS=0x61
reset:
ldi akku,0x80 ; 0b1000.0000
out DDRB,akku ; Datenricht.PB7=Output
clr akku ; alle Bits=Low
; Timer0 initialisieren:
ldi akku,(1<<CS02) ; Prescale = 256
out TCCR0B,akku
ldi akku,(1<<TOIE0) ; Timer Overflow / Interrupt
out TIMSK,akku
sei ; Timer frei
ldi stavec,0x00 ;r22 = 00
clr akku ;r16 = 00
sts TICKS,akku ;Speicherinh. r16 in adressiertes Byte im SRAM=61
loop:
sbrs stavec,0 ;überspringe, wenn Bit0 in r22 gesetzt ist
;wird im Interrupt gesetzt
rjmp loop
cbr stavec,0x01 ;lösche in r22 die Bits,die in dem Maskenbyte=1 sind
in akku,PORTB ;lade r16 mit Inhalt von PORTB (r16=0)
ldi temp1,0x80 ;r17 = 80
eor akku,temp1 ;verknüpfe r16 mit r17 durch ODER Funkt.
out PORTB,akku ;PORTB,PB7 = 1
rjmp loop
; Interrupt-ISR
TIMER0_OVF:
in itmp,SREG ;lade r25 mit Inhalt Statusreg.
push itmp ;Kopie r25 auf den Stack, danach SP-1
ldi itmp,CNTVAL ;lade r25 mit Variable = 0x3D
;8bit Aufwärtszähler des Timerregisters TCNT0 wird mit
;einen Anfangswert hex=3D beschrieben.
out TCNT0,itmp
lds itmp,TICKS ;lade r25 mit dem direkt adressierten Byte
;aus dem SRAM = hex 61
inc itmp ;Inhalt von r25 + 1
sts TICKS,itmp ;Speicherinh. r25 in adressiertes Byte im SRAM
cpi itmp,0x0A ;vergleiche r25 mit Konst. 0A (wenn ja C=1)
brlo TIM0_OVF_DONE ;Verzweigung, wenn C=1
clr itmp ;r25 = 00
sts TICKS,itmp ;Speicherinh. r25 in adressiertes Byte im SRAM
sbr stavec,0x01 ;setze in r22 die Bits, die in der Maske=1 sind
TIM0_OVF_DONE:
pop itmp ;SP+1 danach vom Stack in r25
out SREG,itmp ;Inhalt von r25 ins SREG laden
reti
.EXIT
Grüße
Rolf