ASM-Simulation klappt, im Atmega8 jedoch nicht. Warum?

Gast #1442599
Lesenswert?

Bei nachfolgendem Assemblerteil in BASCOM wird PB1 abgefragt und nach 
einem Wechsel auf "1" TCNT1 gelöscht (als Counter intern hochgezählt)
und nach 32 Wechseln an PB1 die Schleife verlassen um das Ergebnis in 
TCNT1 weiter zu verarbeiten.

Die vorherge Variante in BASCOM lief einwandfrei.
Die ASM-zeilen laufen im BASCOM-Simulator auch korrekt.

In der Praxis gibt es irgendwo einen Hänger.

Warum ?


$asm
   push R16
   lds r16,sreg   'Statusregister einlesen und
   push r16       'auf den Stack schieben
   push r17
   push R26       'X-Register frei machen
   Push R27

   L1:
   in R16,PortB   'PortB nach R16 laden
   bst r16,1      'Bit PB1 aus Register16 in das T-Flag laden
   BRTS L1        'Springe nach L1 wenn T=1 (auf 0 wartten)
   L2:
   in R16,PortB   'PortB nach R16 laden
   bst r16,1      'Bit PB1 aus Register16 in das T-Flag laden
   BRTC L2        'Springe nach L2 wenn T=0 (auf 1 warten)

   clr R16              'Register16 löschen
   Out Tcnt1h , R16     'Timerregister high löschen
   Out Tcnt1l , R16     'Timer1register low löschen

   ldi R17,32      'Schreifenregister mit 32 laden

   Schleife:

   L3:
   in R16,PortB    'PortB nach R16 laden
   bst r16,1       'Bit PB1 aus Register16 in das T-Flag laden
   BRTS L3         'Springe nach L3 wenn T=1 (auf 0 warten)
   L4:
   in R16,PortB    'PortB nach R16 laden
   bst r16,1       'Bit PB1 aus Register16 in das T-Flag laden
   BRTC L4         'Springe nach L4 wenn T=0 (auf 1 warten)
   dec R17         'Schreifenzähler um 1 vermindern
   BRNE Schleife   'Schleife nochmal ausführen

   'Timerregister auslesen und nach W at &H60 speichern

   in R16,tcnt1l
   sts &H60,R16
   in R16,tcnt1h
   sts &H61,R16

   Fertig:

   Pop R27
   pop R26           'X-Register
   pop R17
   pop R16           'Statusregister zurückholen
   sts sreg,R16      '... und zurückschreiebn
   pop R16
$end Asm
Gast #1442613
Lesenswert?

HI

Auf den ersten Blick:

>   lds r16,sreg   'Statusregister einlesen und
....
>   sts sreg,R16      '... und zurückschreiebn

Welchen Wert hat 'sreg'. Normalerweise wird auf SREG mit in/Out 
zugegriffen.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren