Forum: Mikrocontroller und Digitale Elektronik ASM-Simulation klappt, im Atmega8 jedoch nicht. Warum?


von Bastian (Gast)


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

von Thomas Forster (Gast)


Lesenswert?

> in R16,PortB   'PortB nach R16 laden

Port einlesen: in R16, PINB


Thomas

von Bastian (Gast)


Lesenswert?

PORTB ist die Adresse für "in", kein Befehl wie PINB, Einlesen eines 
Ports in BASCOM

basti

von spess53 (Gast)


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

von Bastian (Gast)


Lesenswert?

Vielen Dank an Thomas.

PINB ... das wars.

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.