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.
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"
...
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
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.
...
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.
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.
...
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
>> 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.