mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik adch und adcl an display ausgeben ??


Autor: Peter B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
tag die damen und herrn
hab schon wieder ein problem ich will jetzt die ergebnisse der Messung
als binärzahl auf ein lcd display ausgeben ich bekomm aber immer nur
1en geschrieben :(. anbei hab ich den code angefügt. wäre höchst
freundlich wenn mir irgend jemand von euch sagen könnt wo mein
denkfehler ist.

zum gruße

peter

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur so nebenbei:
> cbi ADCSRA, ADIF  ;interuptflag deaktivieren
Interrupt-Flags kann man erstens nicht 'deaktivieren' und zweitens
löscht man sie, indem man eine '1' hineinschreibt. Wenn man das ADIF
löschen will, dann so:
sbi ADCSRA, ADIF

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thx für den hinweiß bin noch blutiger anfänger grad mal die 3te woche
dran an assemblerprogrammierung.

gruß peter

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War ja nur ein Hinweis...
Habe jetzt auf Anhieb nichts fatales gefunden, was das Problem
verursachen könnte. Liegt aber auch daran, dass Dein Code sehr spärlich
kommentiert ist.

Frage: Deine LCD-Ausgabe funktioniert aber ansonsten?

Autor: Peter B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt noch bissi kommentiert lcd ausgabe funktioniert er gibt mir
nur lauter 1en aus spannung liegt an an adc 0,15 V (hab an poti500
davor)  das an der hardware der fehler liegt könnte auch sein. als
referenzspannung benutze ich im moment am arefpin anliegende 5 V. die
messroutine bringt er eigentlich scho des kontrollier ich ja über des
led und des blinkt auf fröhlich nur bekomm ich keinen vernünftigen
wert.
hab noch bissi kommentiert.

Autor: Peter B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
sry falsches komment

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:020000020000FC
:1000000000E004BB0FEF07BB0FEF01BB0FEF08BB16
:100010000FE50DBF04E00EBF79D08FD03E9A3F9818
:100020003D9A3B983A9839983898379A329A319A4B
:10003000309A3598349A3398369A3699FECF24E020

Gute Kommentare ;)


Du weisst aber, dass wenn du eine 1 sendest keien 1 auf dem display
bekommst?

Schau dir mal die ASCII Tabelle an und denke auch an die 3te
Grundschulklasse Thema das Teilen von Zahlen..

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
muss ich das jetzt verstehen ?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Angenommen, du hast die Zahl 6 und schickst diese direkt an das Diaplay,
dann erscheint keine 6 auf dem Display, sondern das ACSII zeichen zum
Dezimalwert 6

Schau dir mal die ASCII Tabelle an

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bekomm ja eine 1 auf dem display und wenn ich ein o stadt eine 1
rein mache bekomme ich auch ein o des is ja normal in der lcd-routine
geregelt oder täusch ich mich da.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorschlag:
Mach mal ein einfacheres Testprogramm:
Lies die Werte vom ADC ein und gib sie
auf einem anderen Port einfach mal an 8 LED's
aus. Wenn du am Poti drehst mueste sich an den
LED's was ändern.

Damit könnte man mal die Hardware durchprobieren
bzw. den ADC Grundaufsatz.

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
des wäre ne möglichkeit aber ich bräucht ja dann 16 leds da ich ja adch
UND Adcl hab oder. aber keine schlechte idee hab atm nur 4 dran aber
des müsst ich ja gleich auf 6 erweitern am d port müsst ich auch noch 2
ham.
werd ich mal versuchen.

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
des wäre ne möglichkeit aber ich bräucht ja dann 16 leds da ich ja adch
UND Adcl hab oder. aber keine schlechte idee hab atm nur 4 dran aber
des müsst ich ja gleich auf 6 erweitern am d port müsst ich auch noch 2
ham.
werd ich mal versuchen. aber dann kann immer noch sein das ich den adch
oder adcl wert net bekomm aber have a try

peter

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also habs jetzt gerade gemacht und des testprogramm funktioniert habs
jetzt nur mit 6 leds am laufen aber funktioniert trotzdem also muss es
fast am prog liegen beim display beschreiben

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi r16, 1 ist ungleich ldi r16, 0x01!!

ich kapier deine Ausgabe nicht...

Du wartest, bis die AD Wandlung fertig ist, ok.
Dann willst du den Wert ausgeben richtig?

Was willst du ausgeben? die 2 Werte ADCL und ADCH?
versuch es erst einmal mit 200 pur auf dem Display auszugeben..

Du kannst nicht ldi temp1, 200 machen und dann erwarten, dass 200 auf
dem Display erscheint, nach dem du lcd_write aufgerufen fast.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>ldi r16, 1 ist ungleich ldi r16, 0x01!!


Wer erzählt denn sowas? Natürlich ist das gleich.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi r16, '1' war gemeint
verzeihung

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schon klar das des mit 200 net geht aber

ldi temp1, '2'
rcall lcd_data

ldi temp1, '0'
rcall lcd_data

ldi temp1, '0'
rcall lcd_data

dann steht auf dem lcd display 200

und ich will zuerst nur den adcl als binärzahl ausgeben und dazu brauch
ich ja nur zu checken welche bits gesetzt sind und dann dementsprechen 0
oder 1 reinsetzten aber irgendwie will er das nicht so machen.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, so hast du natürlich recht.


>>Du kannst nicht ldi temp1, 200 machen und dann erwarten, dass 200
auf
dem Display erscheint, nach dem du lcd_write aufgerufen fast.

Kann er vielleicht doch. Vielleicht wandelt die lcd_write Routine ja
Dezimalzahlen automatisch in einen ASCII String.

;) Aber da würde ich auch eher nicht von ausgehen. Wo hast du die LCD
Routinen denn geklaut?

Autor: Peter B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
von dem tutorial ich häng se euch mal an

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja..
da musst nun mal in die 3te Klasse wandern :D

also angenommen r16 = 222 dann:

clr temp1
weiter_hundert:
cpi r16, 100
brlo weiter_zehner
subi r16, 100
inc temp1
rjmp weiter_hundert
rcall lcd_send

weiter_zehner:
.
.
.

So kannst schnell und einfach 222 ausgeben ;)

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaub du hast die problematik net ganz erfasst ich will keine 3
stellige zahl ausgeben sondern eine binärzahl des is des zahlensystem
mit 0 und 1 und die will ich auch als binärzahl ausgeben es sollen also
nur 1en und 0en auf dem display stehn. und net irgend 222 oder was weiß
ich

peter

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi r16, 222

start:
cpi r17, 0x08
brsh ende
ldi temp1, '0'
sbis r16, 0x00
ldi temp1, '1'
rcall lcd_send
lsr r16
inc r17
rjmp start
ende:


also sowas..

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nicht cpi r17, 0x08
sondern cpi r17, 0x08

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo is der unterschied und den source von dir check ich auch net so recht

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
r16               Dein DAC Wert
clr r17           r17 löschen
start:
cpi r17, 0x07     ist die Schleife schon 8 mal durchlaufen?
brsh ende         wenn ja springe zu ende
ldi temp1, '0'    lade temp1 mit '0'
sbis r16, 0x00    ist das 0te Bit 1?
ldi temp1, '1'    wenn ja schreib in temp1 eine '1'
rcall lcd_send    schick die temp1 auf das lcd
lsr r16           schiebe das register nach rechts
inc r17           erhoehe r17
rjmp start        sprinnge nach start
ende:

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich seh auch keinen Unterschied in den beiden Varianten.

Allerdings ist der Code nicht wirklich anders aufgebaut
als deiner (Peter). Die Grundidee ist dieselbe.
Hast du deine Bit-Pfriemel Funktion mal mit einem
Testprogramm überprüft? Irgendwas ala: bekannten Wert
in Register schreiben und deine Ausgabe aufrufen.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter
Simulier deinen Kram mal im AVR Studio..

und gib dem ADCL mal 0b10101010

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne des macht er eben auch net irgendwo beim schreiben auf des lcd muss
es sein des problem mit lampen gehts ja aber bei dem testprog schreibt
er mir jetzt ne 1 und dann nullen ich habs jetzt mal umgedreht das er
des bit 7 abfrägt und dann nach links rollt dann schreibt er nur nullen

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi r18, ADCL   ;ADCL einlesen
ldi r17, ADCH   ;ADCH einlsesen

wo hast du das her??
:D

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in r18, ADCL
in r18, ADCH

...wäre angebrachter. Hab ich auch glatt übersehen. Gut gemacht,
Jens...

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo hast jetzt scho wieder ein problem ? darf ich das net ins register
r18 adcl laden an dem liegts auch net da ich ja wenn ich eine binärzahl
ins r18 lad funsts ja auch net

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:
Du hast das Problem, nicht Jens!

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schon richtig ich hatte auch scho in drinstehn sorry für den harschen
ton gerade war net so gemeint bin halb am durchdrehn ^^

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
^^
kennt man ja

Autor: Gerd Vg (gerald)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

ich würde es einfach so machen, indem ich das Carrybit abfrage.
Schiebe die Daten vom DAC einfach nach rechts, jedes Byte natürlich
einzeln.
Ist das BIT eine NULL gewesen beim Schieben nach rechts, wird das
Carrybit nicht gesetzt, also sende ans LCD eine Null (hex 30), war das
BIT-0 eine EINS wird das Carrybit gesetzt, also sende eine EINS (hex
31) ans LCD.
hier ein Beispiel, wie man es machen könnte, ohne Zählroutine

Abfrage:
ror   DAC_Byte            ; schieben nach rechts
brcs  Write_1             ; springe wenn Bit gesetzt nach Write_1
ldi   temp, '0'           ; lade den Wert für Null, Carry war 0
rcall out_irgendwieLCD    ; senden einer Zahl, hier 0
zurück zur Abfrage        ; nächstes Bit abfragen, 7mal wiederholen

Write_1:
ldi   temp, '1'           ; Carry war EINS, also 1 senden
rcall out_irgendwieLCD
zurück zur Abfrage

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja verdamte axt bist du gott des gibts ja net it works bissi noch
abgeändert und scho läufts ich will ein kind von dir ^^

1000 dank

gruß peter

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach ma Punkt und Komma, mein Jung.

Die Routine ist aber nicht sehr viel anders, als die oben, wo es
angeblich nicht funktioniert hat.. Naja wer weiß!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hauptsache du hast verstanden, wie die Sache funktioniert.

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja des is eigentlich des gleiche prinzip wie ich nur das er net des
nullte bit abfrägt sondern des carrybit und dann in die schleife
springt ich wollt es ohne schleife lösen.

warscheinlich geht des mit dem lsl und lsr net das ich immer des nullte
bit abfrage.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar geht das.

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in 15 jahren programmiererfahrung kann ich assembler wieder mal nichts
abgewinnen :). aber vielleicht habe ich einfach mit C laufen gelernt.
diese ganzen abkürzungen bei asm kann ich mir gar nicht merken!

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@johnny.m
>ldi r18, ADCL   ;ADCL einlesen
>ldi r17, ADCH   ;ADCH einlsesen
glaub er hats noch net kapiert ^^
.equ  ADCL  = 0x04
.equ  ADCH  = 0x05
aus der m8def.inc

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Philipp Karbach

so in der art gehts mir mit C ;)

schade, dass C und ASM so verschieden sind, einige dinnge wuerden sich
gut ergaenzen

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hehe, ich frag mich echt wie es möglich ist mit asm große anwendungen
oder spiele zu schreiben, also ich müsste da nach 1000 zeilen ins
irrenhaus.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut Strukturieren
ausgliedern und kommentieren

schau dir mal an, was c zum teil macht ;)

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens:
Auf die m8def.inc wollte ich oben schon verweisen. War mir aber zu
dumm.

Autor: Peter B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habs scho abgeändert von ldi nach in @ jens


es funktioniert jetzt auch so weit, er schreibt mir nullen und einsen
auf des display und wenn ich am podi dreh verändert sich die binärzahl,
also des was ich wollte. wie gesagt ich bin jetzt grad mal gute 2 wochen
an assembler dran und is hald scho a großer unterschied zu vb, was bis
jetzt meine einzigen programmierkenntisse sind. und ich will jetzt mal
step by step mich da bissi reinvertiefen.

woran bin ich dann gescheitert, wenn des geht grml @ Simon

zum gruße peter

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>woran bin ich dann gescheitert, wenn des geht grml @ Simon

weiß ich nicht :-) Falsche Schieberichtung benutzt? Nicht korrekt
gesprungen usw..

Autor: Peter B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich habs jetzt selber rausgefunden ich hab den scroll einfach vergessen
und dann hat er mit der 2ten schleife immer die 2 bits von adch
drübergeschrieben und dann ham sich nur 2 bits verändert logisch.
(10bit auflösung) funktioniert jetzt auch mit meiner schleife die war
korrekt bis auf das er hald danach net in die 2te zeile gesprungen ist.
hab jetzt die korrigierte vers angehängt

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.