Hallo,
ich habe folgendes Problem:
zur Übung schreibe ich gerade an einem mini Programm, dass mit dem
Timer0 eine Zeit misst, solange der Interrupt-Pin PIND2 auf high
geschalten ist und diese anschließend ins Register r18 lädt.
Wenn man das ganze jetzt im Simulator testet, wird komischerweise immer
die Zahl 0x32 in das Register r18 geladen, egal wie lange der Timer
läuft.
Kann mir bitte jemand helfen? Wo liegt der Fehler ?
.include "m8def.inc"
.def temp = r16
.org 0x000
rjmp main ; Reset Handler
.org INT0addr
rjmp timerstarten
main:
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, 0x00
out DDRD, temp
ldi temp, 0xFF
out DDRB, temp
ldi temp, (0<<ISC01)
out MCUCR, temp
ldi temp, (1<<ISC00)
out MCUCR, temp
ldi temp, (1<<INT0)
out GICR, temp
sei ; Interrupts allgemein aktivieren
loop: rjmp loop ; eine leere Endlosschleife
timerstarten:
ldi temp, (1<<CS00) ; CS00 setzen: Teiler 1
out TCCR0, temp
inc r17
cpi r17,2
brsh timerstoppen
rjmp weiter
timerstoppen:
ldi r17, 0x00
ldi temp, (0<<CS00)
out TCCR0, temp
ldi r18, TCNT0 ; <-- Hier sollte der Wert des Timers in
r18 geladen werden
out TCNT0, r17
weiter:
reti
Hi
>danke :) es funktioniert , aber wann nimmt man ldi wann in und wann out
Wenn die IO-Adresse <=0x3F dann in oder out. Wenn größer, dann lds oder
sts. In lädt ein Register mit dem Inhalt eines IO-Register. Lds mit dem
Inhalt einer RAM-Adresse oder eines IO-Registers aus dem erweiterten
IO-Bereich.
Out speichert den Inhalt eines Registers in ein IO-Register. Sts lädt
eine RAM-Adresse oder ein IO-Register im erweiterten Bereich mit dem
Inhalt eines Registers.
Ldi hat damit nichts zu tun. Damit wird ein Register mit einer Konstante
geladen.
MfG Spess
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.