Forum: Mikrocontroller und Digitale Elektronik TCNT0 lesen atmega8


von Clemens Janzarik (Gast)


Lesenswert?

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

: Verschoben durch User
von troll (Gast)


Lesenswert?

> ldi r18, TCNT0
falsches Nnemonic! Du suchst in.

von Clemens Janzarik (Gast)


Lesenswert?

danke :) es funktioniert , aber wann nimmt man ldi wann in und wann out 
?

von Spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.