Forum: Mikrocontroller und Digitale Elektronik Wert des ADU auf Display ausgeben / ATtiny / Assembler


von Christian K. (juppes)


Lesenswert?

Hallo!

Ich habe im Moment ein kleines Problemchen und zwar komm ich bei meinem 
Projekt im Moment so gar nicht vorran ... habe irgendwie den Überblick 
verloren und weiss auch nicht so Recht wonach ich suchen soll ...
Lange Rede, kurzer Sinn...

Mein ADU gibt mir ein 10Bit Wert aus:

mov     adlow, temp3
mov     adhigh, temp4

Da ich nicht die komplette 10Bit Auflösung benötige wollte ich das ganze 
auf die obersten 8Bit reduzieren, die kann man dann ja auch leichter zum 
Display schicken.Ich möchte am Ende einfach nur von meinem Display die 
8Bit Zahl (0 bis 256) angezeigt bekommen)

1) Wie mache ich aus meinen 10Bit in 2 Registern eine 8Bit Zahl in einem 
Register und...
2) .. mit welcher Routine steuer ich am besten mein WINTEK 
WD-C2704M-1HNN an.

- ich progge in Assembler
- ATtiny26
- da ich es mir mit dem proggen recht schwer tue, bitte ich ganz 
freundlich um eine gute Beschreibung ohne viele Verweise auf andere 
Codesammlungen usw ... wäre super


Vielen vielen Dank im Vorras!
Juppes

von Karl H. (kbuchegg)


Lesenswert?

Christian K. schrieb:

> - da ich es mir mit dem proggen recht schwer tue, bitte ich ganz
> freundlich um eine gute Beschreibung ohne viele Verweise auf andere
> Codesammlungen usw ... wäre super

Wie wärs mit dem
AVR-Tutorial

von Ralf2008 (Gast)


Lesenswert?

Zu Beginn sollte man sich die Port-Aufteilung am Mikrocontroller
überlegen. An welchen Port soll das Display angeschlossen und in
welchem Modus (4/8-Bit) soll es angesteuert werden?
Kompletten Schaltplan zeichnen.

Zur ASM-Programmierung:
Das Steuerregister ADLAR des ADC in ADMUX so einstellen (1),
dass das Ergebnis in den Registern ADCH/ADCL linksbündig
ausgerichtet ist. Die 8 höchstwertigen Bits stehen dann in ADCH.
Auslesen u. fertig.

Dann benötigt man noch eine Routine zur Initialisierung des
Displays (HD-44780 kompatibel), sowie eine Routine zur Ausgabe
einer 8 Bit-Zahl. Beides ist in den AVR-Tutorials in ASM zu finden
und muss nur noch an die verwendeten Ports angepasst werden ...


Ralf2008

von Wayne M. (vibra)


Lesenswert?

moin

siehe Datenblatt
• Bit 5 – ADLAR: ADC Left Adjust Result
The ADLAR bit affects the presentation of the ADC conversion result in 
the ADC Data Register. If ADLAR is cleared, the result is right 
adjusted. If ADLAR is set, the result is left adjusted. Changing the 
ADLAR bit will affect the ADC Data Register immediately,regardless of 
any ongoing conversions. For a complete description of this bit, see 
“ADC Data Register – ADCL and ADCH” on page 106.

mfg

von spess53 (Gast)


Lesenswert?

Hi

Was hast du denn bis jetzt an Code?

MfG Spess

von Christian K. (juppes)


Angehängte Dateien:

Lesenswert?

Hallo!

Vielen Dank schon mal für eure Bemühungen!
Habe soweit versucht alle eure Tipps umzusetzen.
Bezüglich ADLAR hatte ich so meine Probleme da ich eigentlich erst den 
Mittelwert aus der Addition von 256 Messungen weiterverarbeiten wollte. 
Jetzt nehm ich einfach die 8 höchsten Bit der 10 Bit Messung ....

Habe mir aus allen Foren usw schon ein Programm zusammengebastelt ... 
siehe Anhang.
Allerdings weiss ich nicht genau wie ich mit Hilfe der Routinen mein 8 
Bit Register an den LCD schicken kann. Ganz unten hab ich eine 
Dual-Dezimal-Umwandlund eingebaut, aber auch hier keine Ahnung wie ich 
die aufrufe.

Juppes

von spess53 (Gast)


Lesenswert?

Hi

Einige unvollständige Bemerkungen:

>.equ BAUD  = 9600                               ; Baudrate

Wozu? Oder benutzt du die serielle Schnittstelle?

An dieser Stelle fehlt die Initialisierung des Stackpointers. Sonst 
stürzt dein Programm bei jedem Unterprogrammaufruf unweigerlich ab


>  ldi     temp1, (1<<REFS0)              ;  interne Referenzspannung 2,56v
>  out     ADMUX, temp1

Diese Zeilen sind unnötig

>  ldi     temp1, (1<<REFS1)
>  out     ADMUX, temp1
>  ldi     temp1,(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADLAR)|(1<<ADPS0)

Dein Vorteiler beträgt (ADPS3...0) 128. Damit ist der ADC-Takt mit 
ca.31kHz eigentlich schon zu langsam.

>  out     ADCSRA, temp1

>Main:
>    clr     temp1   ;temp1 löschen

Wozu?

>; ADC einlesen:

    in      adlow, ADCL      ; immer zuerst LOW Byte lesen
    in      adhigh, ADCH     ; danach das mittlerweile gesperrte High 
Byte

Du hast ADLAR gesetzt. Damit befinden sich die acht höherwertigen Bits 
der Wandlung in ADCH und es reicht ADCH einzulesen.

> ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden

Und wo ist die?

MfG Spess

von Christian K. (juppes)


Lesenswert?

spess53 schrieb:
>> ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
>
> Und wo ist die?

Gute Frage, wie soll die aussehen und an welcher Stelle?
Den Rest habe ich soweit abgeändert ....
- Baud komplett gelöscht
- Vorteiler auf 32 gesenkt
- nur noch das highbyte wird ausgelesen

Wie rufe ich jetzt die Unterprogramme auf um meine 8Bit-Zahl auszugeben?

von spess53 (Gast)


Lesenswert?

Hi

>Gute Frage, wie soll die aussehen

Was verstehst an 'lcd_init:' nicht?

>...und an welcher Stelle?

Vor der Benutzung des Displays und nach der Stackpointerinitialisierung 
und dem Setzen der der Pins von PortB, an dem die Daten- und 
Steuerleitungen des Displays hängen, als Ausgang.

>Wie rufe ich jetzt die Unterprogramme auf um meine 8Bit-Zahl auszugeben?

Mal langsam. Bevor dein Display nicht läuft, gar nicht. Bekomme erst mal 
die Displayinitialisierung und die Ausgabe eines Zeichens in die Reihe. 
Am einfachsten macht du dir ein Programm das nur Stackpointer-Init, 
Datenrichtung für PortB, LCD-Init und LCD-ata enthält. Also ohne den 
ADC-Kram.

MfG Spess

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.