mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler Befehl für Do Loop in Bascom


Autor: MichlM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich benutze in einem Bascom-Programm sehr oft
   Do
   Loop Until Spsr.spif = 1
um die SPI-Schnittstelle zu prüfen solange die Daten noch im Puffer 
sind.
Ich würde gerne einen Assembler Befehl dafür einbauen um 
Programm-Speicher zu sparen.

Kann mir jemand sagen wie diese Do Loop in Assembler aussieht?

Vielen Dank

Michl

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MichlM wrote:
> Ich würde gerne einen Assembler Befehl dafür einbauen um
> Programm-Speicher zu sparen.

Was genau verleitet dich jetzt zu dieser Annahme?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich würde gerne einen Assembler Befehl dafür einbauen um
> Programm-Speicher zu sparen.

Man kann in Assembler genauso speicherplatzverschwendend (oder 
rechenzeitverschwendend) programmieren wie in jeder anderen 
Programmiersprache. Effiziente Algorithmen sind nicht unbedingt von der 
Programmiersprache abhängig, wobei es in BASCOM etwas schwieriger ist, 
effizient zu programmieren, weil BASCOM viel unnötiges Zeugs macht (z.B. 
sichern aller Register (auch der unbeteiligten) in der ISR).

Du möchtest DO - LOOP in ASM haben... - Ist ganz einfach, setzt zu 
Beginn ein Label (Sprungmarke) und springst mit rjmp (sowas wie Goto) 
zum Label zutück. Und zwischendurch prüfst Du die Abbruchbedingung und 
springst ggf. aus der Schleife raus.

Die Frage, ob das effizient wird, wird aber woanders entschieden.

Man kann auf ein Ereignis warten, indem man es in einer Schleife prüft, 
bis es eingetreten ist. Der Controller kann in dieser Zeit nix anderes 
machen.

Man kann aber auch das Ereignis prüfen, wenn es nicht eingetreten ist, 
etwas anderes sinnvolles tun und später nochmal prüfen. Dazu müssen aber 
die Jobs der Mainloop so organisiert werden, dass sie recht kurz sind 
und die Ereignis-Abfrage nicht zu lange blockieren.

Man kann aber auch Interrupts nutzen, um auf ein Ereignis zu reagieren. 
Auch hier sind natürlich gewisse Regeln einzuhalten (z.B. kurze ISR), 
was in BASCOM allerdings etwas schwieriger ist, weil es zuviel 
Eigenleben entwickelt.

Also wenn Du schon aus Gründen der Rechenzeit oder des 
Speicherverbrauchs in ASM programmieren willst, dann solltest Du 
versuchen, das Programm komplett in ASM zu schreiben, also auf BASCOM zu 
verzichten.

...

Autor: W. Bl (wb1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn sprs das register und spif das bit im register ist:

loop:
      sbis sprs,spif ;überspringe den folgenden befehl wenn spif=1
      rjmp warte     ;wenn spif=0 dann verbleibe im loop
      ret            ; fertig, Rücksprung oder weitere Befehle

Autor: Anonymous (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bascom AVR already does that for you, see below.

  * *

Bascom AVR help file "SPIOUT"

When SPI is used in HW(hardware) mode, there might be a
small delay/pause after each byte that is sent. This is
caused by the SPI hardware and the speed of the bus.
After a byte is transmitted, SPSR bit 7 is checked.
This bit 7 indicates that the SPI is ready for sending
a new byte.

  * *

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.