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
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
thx für den hinweiß bin noch blutiger anfänger grad mal die 3te woche dran an assemblerprogrammierung. gruß peter
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?
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.
: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..
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
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.
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.
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.
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
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
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.
>>ldi r16, 1 ist ungleich ldi r16, 0x01!!
Wer erzählt denn sowas? Natürlich ist das gleich.
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.
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?
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 ;)
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
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..
wo is der unterschied und den source von dir check ich auch net so recht
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:
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.
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
ldi r18, ADCL ;ADCL einlesen ldi r17, ADCH ;ADCH einlsesen wo hast du das her?? :D
in r18, ADCL in r18, ADCH ...wäre angebrachter. Hab ich auch glatt übersehen. Gut gemacht, Jens...
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
schon richtig ich hatte auch scho in drinstehn sorry für den harschen ton gerade war net so gemeint bin halb am durchdrehn ^^
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
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
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ß!
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.
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!
@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
@Philipp Karbach so in der art gehts mir mit C ;) schade, dass C und ASM so verschieden sind, einige dinnge wuerden sich gut ergaenzen
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.
Gut Strukturieren ausgliedern und kommentieren schau dir mal an, was c zum teil macht ;)
@Jens: Auf die m8def.inc wollte ich oben schon verweisen. War mir aber zu dumm.
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
>>woran bin ich dann gescheitert, wenn des geht grml @ Simon
weiß ich nicht :-) Falsche Schieberichtung benutzt? Nicht korrekt
gesprungen usw..
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.