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

Gast #1442599
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.