mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anfängerhilfe, ASM, 7-Segment-Zähler


Autor: poahneeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfang diesen Jahres habe ich damit begonnen mich für ATMega 8 zu 
interessieren und habe zunächst mit BASCOM gearbeitet um Code für diesen 
Microprozessor zu erzeugen. Unter Windows 98 habe ich mit Hilfe von 
VBScript erfolgreich ein eigenes Flash-Tool geschrieben. Ebenfalls einen 
fehlerbehafteten Compiler für eine Art Assembler. Das ganze funktioniert 
wunderbar und hat mir gut geholfen den ATMega näher kennzulernen.

Vor einigen Tagen habe ich damit begonnen eigenen Code in Assembler zu 
erzeugen der nahezu kompatibel mit dem ist, den AVRASM32.EXE bzw. 
AVRASM2.EXE vertragen.

Aus einem alten TV Gerät baute ich vor Ewigkeiten eine Programmanzeige 
aus. Diese besteht aus zwei 7-Segment anzeigen und einem SAA2131. Das 
ganze habe ich bereits direkt am Druckerportt und unter BASCOM zum 
funktionieren bekommen. Die Reihenfolge der einzelnen Segmente ist für 
beide Anzeigen identisch. Hier die Ziffern von 0 bis 9: &HED, &H24, 
&HCE, &H6E, &H27, &H6B, &HEB, &H2C, &HEF, &H6F

Mit folgendem Code lasse ich mir die Zahl 75 anzeigen:
init_port:
  LDI R24, 0x00
  LDI R25, 0x1C
  OUT DDRD, R25
  OUT PORTD, R24

main_start:
  SBI PORTD, PORTD2

  RCALL data_off   ;2UL
  RCALL data_on    ;2UM
  RCALL data_on    ;2UR
  RCALL data_off   ;2DOT
  RCALL data_on    ;2OM
  RCALL data_off   ;2OR
  RCALL data_on    ;2MM
  RCALL data_on    ;2OL

  RCALL data_off   ;1UL
  RCALL data_off   ;1UM
  RCALL data_on    ;1UR
  RCALL data_off   ;1DOT
  RCALL data_on    ;1OM
  RCALL data_on    ;1OR
  RCALL data_off   ;1MM
  RCALL data_off   ;1OL

  CBI PORTD, PORTD2

main_exit:
  RJMP main_exit

data_on:
  SBI PORTD, PORTD4
  SBI PORTD, PORTD3
  CBI PORTD, PORTD3
  RET

data_off:
  CBI PORTD, PORTD4
  SBI PORTD, PORTD3
  CBI PORTD, PORTD3
  RET

Was ich jetzt möchte ist, dass mir irgendjemand zeigt, wie ich von 0 
oder 00 bis 99 oder umgekehrt zählen kann (INC/DEC etc), also von 0x00 
bis 0x63, und das ganze in zwei Teile/Ziffern zerlege und darstellen 
kann. Ich benötige ein Stück Code um diesen durch die Mangel nehmen zu 
können um Erfahrungen sammeln zu können.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo poahneeh,

weshalb möchtest Du Dich unbedingt mit dem SDA2131 quälen ?

Otto

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier wird ein Beispiel gezeigt, das zwar etwas komplexer ist, aber 
einige Deiner Probleme löst. Analysiere es und versuche die 
Vorgehensweise bzw. Algorithmen zu erkennen. Es ist zwar nicht die 
ultimative einzig richtige Lösung, sollte Dir aber trotzdem den Einstieg 
erleichtern.
Beitrag "Re: 7 Segmentanzeige falsch eingekauft, reagiert nur auf low"

...

Autor: poahneeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hauptsächlich weil die Anzeige so ist wie sie ist. Natürlich könnte ich 
die beiden gesockelten 7-Segment-Anzeigen auch entfernen und direkt an 
den ATMega anklemmen. Natürlich wäre das wesentlich einfacher. Da finde 
ich auch jede Menge Infos die mit Sicherheit brauchbar sind.

Mir kommt die Idee, dass ich das ganze auch mit BASCOM realisieren 
könnte. Dort könnte ich mich am erzeugten Hex-File bedienen, es 
decompilieren und mich da schlau machen. Ich habe jedoch die Vorahnung, 
dass da mehr Schrott bei herauskommt als mir lieb ist und ich vertragen 
kann.

Was ist denn an dem SAA2131 so schlimm? Schieberegister oder? Da finde 
ich viel mit 595 und co

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
poahneeh wrote:
> Hauptsächlich weil die Anzeige so ist wie sie ist. Natürlich könnte ich
> die beiden gesockelten 7-Segment-Anzeigen auch entfernen und direkt an
> den ATMega anklemmen. Natürlich wäre das wesentlich einfacher. Da finde
> ich auch jede Menge Infos die mit Sicherheit brauchbar sind.

Für die Schieberegister brauchst Du ja noch eine Routine, mit der Du ein 
Byte bitweise herausschieben kannst. Dazu gibt es die Shiftbefehle LSR 
und LSL, mit denen ein Bit ins Carry geschoben wird, um dann anhand des 
Carrys (brcc/brcs) zu entscheiden, ob der Portpin gesetzt (sbi) oder 
gecleart (cbi) werden muss. Der Aufruf dieser Routine klappert dann den 
Inhalt des Bytes seriell an das Schieberegister.

>
> Mir kommt die Idee, dass ich das ganze auch mit BASCOM realisieren
> könnte. Dort könnte ich mich am erzeugten Hex-File bedienen, es
> decompilieren und mich da schlau machen.

Das geht einfacher: Öffne die von BASCOM erzeugte Objektdatei mit dem 
AVR-Studio (erfordert das Anlegen eines neuen Projektes), aktiviere im 
Menü "View" das Fenster "Disassembler" und schau Dir BASIC und ASM 
gemeinsam an. Kannst es dabei auch simulieren, also schrittweise 
durchsteppen und Dir dabei alle I/O-Ports, Register, RAM-Zellen usw. 
anzeigen lassen.

> Ich habe jedoch die Vorahnung,
> dass da mehr Schrott bei herauskommt

Eigentlich nicht, ist gut lesbar.

> als mir lieb ist und ich vertragen
> kann.

Es kann allerdings passieren, dass Dein Verhältnis zu BASCOM dadurch 
etwas belastet wird. ;-)

>
> Was ist denn an dem SAA2131 so schlimm? Schieberegister oder? Da finde
> ich viel mit 595 und co

Daran ist nichts schlimm, es spart Portpins, erfordert aber eine kleine 
SPI-Routine oder die Nutzung von Hardware-SPI.

...

Autor: poahneeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja, da hast du mir jetzt was richtig tolles gezeigt. Dank dir.

Dann werde ich nun ganz viele kleine Einzeiler schreiben und auswerten 
bzw. vergleichen um zu lernen. Kein Tutorial der Welt kann diese Infos 
bieten.

Der Weg ist das Ziel.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
poahneeh wrote:
> Ah ja, da hast du mir jetzt was richtig tolles gezeigt. Dank dir.

Oh, ich bin jetzt nicht sicher, ob das Sarkasmus ist.

>
> Dann werde ich nun ganz viele kleine Einzeiler schreiben und auswerten
> bzw. vergleichen um zu lernen.

Du meinst vermutlich BASIC-Einzeiler.

> Kein Tutorial der Welt kann diese Infos
> bieten.

Naja, das AVR-Tutorial dieser Seite hier ist schon nicht zu verachten.

>
> Der Weg ist das Ziel.

Jaein... Der von BASCOM generierte Code ist in punkto ASM nicht gerade 
das Maß aller Dinge. Vieles lässt sich in handgeschriebenem ASM deutlich 
effektiver programmieren. Auf dem kleinen AVR verzichte ich daher 
freiwillig auf BASCOM, obwohl ich zu den "uncoolen" Typen gehöre, die 
den PC in BASIC programmieren.

> Der Weg ist das Ziel.

Wenn Du damit meinst, dass Du nur etwas lernst, wenn Du Dich intensiv 
damit beschäftigst, anderer Leute Quelltexte analysierst, den Dingen auf 
den Grund gehst, dann stimmt das natürlich. Dem steht BASCOM aufgrund 
mangelnder Transparenz aber entgegen. Mit BASCOM kann man zum schnellen 
Erfolg kommen, wenn für die verwendete Hardware (LCD, Temp-Sensor, ...) 
fertige Bibliotheken zur Verfügung stehen. Das ist aber nicht immer der 
Fall, man ist mit diesem "Baukasten" schnell am Ende.

...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
poahneeh wrote:
> Vor einigen Tagen habe ich damit begonnen eigenen Code in Assembler zu
> erzeugen der nahezu kompatibel mit dem ist, den AVRASM32.EXE bzw.
> AVRASM2.EXE vertragen.

Vergiß AVRASM32.EXE, der wird schon jahrelang nicht mehr erweitert 
(unterstützt keine neueren AVRS).


> Was ich jetzt möchte ist, dass mir irgendjemand zeigt, wie ich von 0
> oder 00 bis 99 oder umgekehrt zählen kann (INC/DEC etc), also von 0x00
> bis 0x63, und das ganze in zwei Teile/Ziffern zerlege und darstellen
> kann. Ich benötige ein Stück Code um diesen durch die Mangel nehmen zu
> können um Erfahrungen sammeln zu können.

Teile das Problem auf:

- Zählroutine
- Zerlegung in Dezimalzahlen (Subtrationsmethode oder Division mit Rest)
- Umwandlung der Ziffer per Tabelle in 7-Segment (LPM-Befehl)
- Serielle Byte-Ausgabe

Und mache dann Schritt für Schritt.


Peter

Autor: poahneeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Ah ja, da hast du mir jetzt was richtig tolles gezeigt. Dank dir.
>Oh, ich bin jetzt nicht sicher, ob das Sarkasmus ist.

Ne ne, war schon ernst gemeint. Ich finde es klasse, dass dort der Basic 
Code zwischen dem ASM code steht. Ich finde das enorm hilfreich.

Obwohl. Das was BASCOM da veranstaltet ist mehr als übersichtlicht. Hast 
schon recht.

Autor: poahneeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, wunderbar wie das hier klappt. Assembler in 5 Tagen. Wenn das mal 
nix is.

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.