> Erstens, wie kann ich EIN Ergebnis auslesen, wenn das in zwei
> Registern liegt (ADCH und ADCL).
Das Ergebnis liegt in zwei I/O-Registern. Man kann es in zwei
Arbeitsregister (r0..r31) einlesen und diese beiden Register als eine
16-Bit-Zahl betrachten.
> Zweitens, wie kann ich dann wenn ich EIN Ergebnis habe, dieses
> (möglichst einfach)in einen Hexwert umwandeln?
Nehmen wir an, du hast ADCL nach r16 eingelesen und ADCH nach r17.
Das entspräche dem ASM-Code:
in r16,adcl
in r17,adch
Nun willst du den Wert an einem dreistelligen 7-Segment-Display (LEDs)
in HEX-Schreibweise per Multiplex anzeigen.
In r16 liegen die unteren zwei Nibbles, in r17 das obere Nibble und ein
unbenutztes Dummy-Nibble. Du musst also erstmal die drei benötigten
Nibbles isolieren (andi, swap) und in 3 Registern oder RAM-Zellen
ablegen.
Dann musst du dir im Flash eine Tabelle mit 16 Einträgen anlegen, in
der für jede Hex-Ziffer das Bitmuster der Segment-LEDs eingetragen ist.
Der genaue Inhalt der Tabelle richtet sich danach, wie das Display an
den AVR angeschlossen ist, ob mit gemeinsamer Anode je Digit oder mit
gemeinsamer Kathode. Dann spielt auch noch die Zuordnung Segment zu
Portpin eine Rolle.
Um die Zahlenwerte nun kontinuierlich anzuzeigen, richtest du dir einen
Timer ein, der alle etwa 1..3ms einen Interrupt auslöst. In dieser ISR
(Interrupt-Service-Routine) zählst du einen Merker hoch, der dir sagt,
welches Digit gerade angezeigt wird. Dann
- deaktivierst du erstmal alle Digit-Treiber (es war nur einer
aktiv),
- setzt du den Z-Pointer auf die Bitmustertabelle,
- addierst den Wert des anzuzeigenden Nibbles dazu,
- holst mittels LPM das Bitmuster aus der Tabelle,
- um es dann an den Segment-Port auszugeben.
- Nun aktivierst du den entsprechenden Digit-Treiber, um diese eine
Anzeigestelle (Digit) leuchten zu lassen.
...