mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ASM Code vereinfachen


Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich benötige für ein GLCD zwei verschiedene Statusabfragen.
Diese sind ziemlich gleich aufgebaut.
 StatusCheck:
  clr temp1
  out DDRD, temp1      ; Datenport als Eingang für Statusantwort des Displays  
  cbi PortB, CE        ; Display enable
  
    _status_check_0:
    cbi  PortB, RD          ; Leseanforderung 
    in   temp1, PinD          ; Daten vom Display kommend einlesen
    sbi  PortB, RD          ; Leseanforderung beenden
    andi temp1,(1<<STA0)+(1<<STA1)    ; Statusbyte maskieren
    cpi  temp1,(1<<STA0)+(1<<STA1)    ; Püfen ob Bits Bits STA0 und STA1 gesetzt sind
  brne _status_check_0        ; warte auf sta0 und sta1 =1

   sbi  PortB, CE      ; Display disable
   ser temp1        ; Datenport als Ausgang  
   out DDRD, temp1        
 ret

AutoStatusCheck:
  clr temp1
  out DDRD, temp1      ; Datenport als Eingang für Statusantwort des Displays  
  cbi PortB, CE        ; Display enable
  
    _status_check_1:
    cbi  PortB, RD          ; Leseanforderung 
    in   temp1, PinD          ; Daten vom Display kommend einlesen
    sbi  PortB, RD          ; Leseanforderung beenden
    andi temp1,(1<<STA3)    ; Statusbyte maskieren
    cpi  temp1,(1<<STA3)    ; Püfen ob Bits Bits STA0 und STA1 gesetzt sind
  brne _status_check_1        ; warte auf sta0 und sta1 =1
  
   sbi  PortB, CE      ; Display disable
   ser temp1        ; Datenport als Ausgang  
   out DDRD, temp1        
ret

kann man irgendetwas vereinfachen, ohne die Unterprogramme ineinander zu 
verschachteln oder dort neue Unterprogramme einzubauen?
Ich möchte wenn es geht nur ein Unterprogramm für beide Fälle 
verwenden,dafür aber mit Parameterübergabe. Es muss halt übersichtlich 
bleiben.
Was mir dazu einfällt wären Macros, aber da weiß ich nicht genau wie.

Hat jemand eine Idee?

vielen Dank

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Übergib doch einfach die Maske in einem Register.

->    and temp1,Register    ; Statusbyte maskieren
->    cp  temp1,Register    ; Püfen ob Bits Bits STA0 und STA1 gesetzt 
sind

Aufruf:

   ldi Register,(1<<STA0)+(1<<STA1) oder (1<<STA3)
   rcall StatusCheck

MfG Spess

Autor: Guter Rat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde so vorgehen:

1. Die Variable (einmal (1<<STA0)+(1<<STA1) und einmal STA3
in ein eigenes Register vor dem UP-Call laden und dann
mit diesem Register statt temp1 arbeiten.

2. Temp1 VOR dem UP-Aufruf entsprechend laden.

  push temp1           ; damit temp1 sichern

  clr temp1
  out DDRD, temp1      ; Datenport als Eingang für Statusantwort des 
Displays
  cbi PortB, CE        ; Display enable

  pop temp1            ; und wieder zurückholen

Vorschlag 2 braucht nur ein zusätzliches Push-pop, nicht mal ein 
Register!

Einen schönen Sonntag!

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
> brne _status_check_0        ; warte auf sta0 und sta1 =1
Da ist hoffentlich irgendwo ein Timeout verbaut, nicht das du dich mal 
wunderst wenn nichts losgeht(unmögliches ist immer möglich)
Ansonsten würde ich es wie "spess53" machen.

Viel Erfolg, Uwe

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Da ist hoffentlich irgendwo ein Timeout verbaut, nicht das du dich mal
>wunderst wenn nichts losgeht(unmögliches ist immer möglich)

Läuft bei mir seit über 10 Jahren und mehr als 500 Displays in dieser 
Art problemlos.

MfG Spess

Autor: pacer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorschlag 2 wird wohl nicht funktionieren, da ich ja den Portinhalt für 
den Vergleich in ein Register laden muss. Somit bräuchte ich auf jeden 
Fall zwei Register.
Eigentlich wollte ich durch Verwendung eines Macros um ein zweites 
Register herum kommen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pacer schrieb:
> Eigentlich wollte ich durch Verwendung eines Macros um ein zweites
> Register herum kommen.

Für ungenutzte Register gibts von Atmel kein Geld zurück.

Definiere Dir 4..8 zerstörbare Arbeitsregister, d.h. die müssen nicht 
per push/pop gesichert werden und jede Funktion darf sie nutzen.
Vorzugsweise sind das auch die Register, die als Funktionsargumente und 
Returnwerte definiert sind.

Man kann sich ne Menge Programmiertricks vom C-Compiler abgucken.
Ich habe damals auch nicht schlecht gestaunt, als mein Programm nach dem 
Umschreiben auf C kleiner war, als vorher das Assemblerprogramm.


Peter

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ich habe damals auch nicht schlecht gestaunt, als mein Programm nach dem
>Umschreiben auf C kleiner war, als vorher das Assemblerprogramm.

Lag das am Assembler- oder am C-Programm?

MfG Spess

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Lag das am Assembler- oder am C-Programm?

Am Assembler, als ich mit dem 8051 anfing.
Wenn man die Technik der Scratchpad-Register nicht kennt, pusht/popt man 
wie blöde, das ja alle Register erhalten bleiben.
Und es war auch Spaghetticode (wenig Unterfunktionen, riesige 
Umherspringerei).


Peter

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Am Assembler, als ich mit dem 8051 anfing.

Und was hat das jetzt mit aktuellen AVR-Assemblern/Compiler zu tun?

MfG Spess

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Und was hat das jetzt mit aktuellen AVR-Assemblern/Compiler zu tun?

Hab ich doch oben schon gesagt, Scratchpadregister vereinbaren.
Es erleichtert das Programmieren und verringert den Code.


Peter

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.