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


von poahneeh (Gast)


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:
1
init_port:
2
  LDI R24, 0x00
3
  LDI R25, 0x1C
4
  OUT DDRD, R25
5
  OUT PORTD, R24
6
7
main_start:
8
  SBI PORTD, PORTD2
9
10
  RCALL data_off   ;2UL
11
  RCALL data_on    ;2UM
12
  RCALL data_on    ;2UR
13
  RCALL data_off   ;2DOT
14
  RCALL data_on    ;2OM
15
  RCALL data_off   ;2OR
16
  RCALL data_on    ;2MM
17
  RCALL data_on    ;2OL
18
19
  RCALL data_off   ;1UL
20
  RCALL data_off   ;1UM
21
  RCALL data_on    ;1UR
22
  RCALL data_off   ;1DOT
23
  RCALL data_on    ;1OM
24
  RCALL data_on    ;1OR
25
  RCALL data_off   ;1MM
26
  RCALL data_off   ;1OL
27
28
  CBI PORTD, PORTD2
29
30
main_exit:
31
  RJMP main_exit
32
33
data_on:
34
  SBI PORTD, PORTD4
35
  SBI PORTD, PORTD3
36
  CBI PORTD, PORTD3
37
  RET
38
39
data_off:
40
  CBI PORTD, PORTD4
41
  SBI PORTD, PORTD3
42
  CBI PORTD, PORTD3
43
  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.

von Otto (Gast)


Lesenswert?

Hallo poahneeh,

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

Otto

von Hannes L. (hannes)


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"

...

von poahneeh (Gast)


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

von Hannes L. (hannes)


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.

...

von poahneeh (Gast)


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.

von Hannes L. (hannes)


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.

...

von Peter D. (peda)


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

von poahneeh (Gast)


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.

von poahneeh (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.