mikrocontroller.net

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


Autor: Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> in R16,PortB   'PortB nach R16 laden

Port einlesen: in R16, PINB


Thomas

Autor: Bastian (Gast)
Datum:

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

basti

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank an Thomas.

PINB ... das wars.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.