Forum: Mikrocontroller und Digitale Elektronik Könntet ihr einen Blick auf meinen Code werfen?


von Merthin (Gast)


Lesenswert?

Hallo,

ich versuch grade die spannung in zahlen zw. 0 und 1023 am LCD 
auszugeben, aber es will nicht so klappen. Könntet ihr mal meinen Code 
betrachten?

von Merthin (Gast)


Angehängte Dateien:

Lesenswert?

Hm, der Anhang wurde nicht gespeichert, sorry

von Felix B. (e-b)


Lesenswert?

Hab den Code betrachtet, sieht schön aus.

Gruss,
Felix

von Schwurbl (Gast)


Lesenswert?

"nicht klappen". Das heisst so viel wie: Findet mal raus, was hier 
schief läuft und warum. Geht's noch? Zerleg das Programm und nimm es 
stückweise in Betrieb.

von Merthin (Gast)


Lesenswert?

>"nicht klappen". Das heisst so viel wie: Findet mal raus, was hier
>schief läuft und warum. Geht's noch? Zerleg das Programm und nimm es
>stückweise in Betrieb.

Hallo,

Wenn ich das Programm zerlege... wie soll ich dann rausfinden ob es 
klappt? Dann hab ich ja keine Anzeige oder sonstiges.

von Otto (Gast)


Lesenswert?

Die Frage ist, was nicht geht:

1. wird das Programm ohne Fehlermeldungen compiliert
2. Klappt das Flshen nicht
3. Was macht das Display
4. Wie sieht die Hardware aus

Otto

von Merthin (Gast)


Lesenswert?

Hallo,

1.) Also da kommt:
Assembly complete, 0 errors. 2 warnings

Hier die Warnungen:
C:\Users\Michael\Documents\ADC.asm(14): warning: Register r26 already 
defined by the .DEF directive
C:\Users\Michael\Documents\ADC.asm(15): warning: Register r27 already 
defined by the .DEF directive

2.) Das Flashen selbst klappt einwandfrei.

3.) Das Display zeigt einfach einen schwarzen Streifen an.

4.) Falls du das meinst: Hab einen ATmega8 und ein "Displaytech" 
Display. Der Controller ist mit dem Display (4bit) richtig verbunden, da 
die Textausgabe funktioniert. Dann ist noch AREF über einen 0,1µF 
Kondensator an Masse geschaltet, GND rechts auch an Masse und ADC0 geht 
über einen Poti an einen 7805, an welchem 5V probeweise gemessen werden 
sollen.

von Otto (Gast)


Lesenswert?

und wo sind:

lcd_enable
delay5ms
lcd_command

Otto

von Kachel - Heinz (Gast)


Lesenswert?

R26 und R27 haben bereits Namen, nämlich XL und XH.

Der AVR hat aber nicht nur 16 Register, sondern 32. Es gibt nämlich auch 
noch die Register R0 bis R15. Die meisten Arbeiten lassen sich damit 
auch erledigen, nur eben keine Konstanten-Zugriffe.

Dumme Frage:
Was soll das LCD mit Steuerzeichen 13 (CR) machen?

Wenn Du schon Code aus verschiedenen Programmen zusammenkopierst, dann 
solltest Du auch versuchen, ihn zu verstehen. Ansonsten wird das nix.

KH

von Merthin (Gast)


Lesenswert?

Hallo,

>lcd_enable
>delay5ms
>lcd_command

Die sind schon dabei. ich dachte, alle Routinen kopier ich nicht mit hin


>Der AVR hat aber nicht nur 16 Register, sondern 32. Es gibt nämlich auch
>noch die Register R0 bis R15. Die meisten Arbeiten lassen sich damit
>auch erledigen, nur eben keine Konstanten-Zugriffe.

naja, das ist ja egal. Is ja register R26 & R27 und nicht eins von 0-15

Dann lösch ich das mit dem Carriage Return am besten mal wieder, wenns 
nix bringt.

von Otto (Gast)


Lesenswert?

1. prüfe ob der Controller läuft:

- lasse eine LED blinken


2. prüfe, ob das LCD funktioniert

- nimm ein unverändertes Programm, dass ein LCD ansteuert


3. Modifiziere es erst dann

Otto

von Kachel - Heinz (Gast)


Lesenswert?

Naja, wenn es egal ist, dann ist es ja gut.

Ich würde Pointerregister (r26..r31) jedenfalls nicht für Variablen zur 
Zeitzählung verschwenden. Das geht mit unteren Registern oder RAM 
genausogut.

Auf die unteren Register hatte ich nur hingewiesen, weil ich den 
Eindruck hatte, dass Du sie meidest wie der Teufel das Weihwasser. Die 
sind nicht zum Spaß da, man kann sie auch benutzen.

Ansonsten muss ich Otto beipflichten, geh' systematisch ran, wildes 
Herumstochern bringt nix.

KH

von Merthin (Gast)


Lesenswert?

Hallo,

>Naja, wenn es egal ist, dann ist es ja gut.

g natürlich weiß ich nicht genau obs egal ist.

>Ich würde Pointerregister (r26..r31) jedenfalls nicht für Variablen zur
>Zeitzählung verschwenden. Das geht mit unteren Registern oder RAM
>genausogut.

Also gut. Dann werde ich versuchen, auch untere Register mit 
einzubringen, ich dachte nur man braucht die gar nicht unbedingt, wenn 
obere auch frei sind.

>1. prüfe ob der Controller läuft:

>- lasse eine LED blinken

Ja, das hab ich schon getestet. Der Mega8 ist in Ordnung


>2. prüfe, ob das LCD funktioniert

>- nimm ein unverändertes Programm, dass ein LCD ansteuert

Hm, ein Programm nur mit Textausgabe funktioniert schon einmal.


>3. Modifiziere es erst dann

Ich kann jetzt natürlich probieren, das Programm schrittweise zu 
modifizieren. Nur weiß ich dann ja nie, ob es soweit noch funktioniert.

von Otto (Gast)


Lesenswert?

> Nur weiß ich dann ja nie, ob es soweit noch funktioniert.

weshalb - lass die Textausgabe (so wie sie funktioniert) drin und 
ergänze zuerst das Programm für die ADC-Abfrage und dann für die 
Umrechnung -

Läuft es dann immer noch, gib das Ergebnis hinter dem Text auf dem LCD 
aus.....

Wenn es ab einem Punkt nicht mehr läuft, untersuche woran es liegt.

Otto

von Gast3 (Gast)


Lesenswert?

Hallo,

OK, habe das nun gemacht - das Display zeigt immer brav "Test" an, bis 
zu der Stelle:

;an LCD Senden

    mov     zeichen, ztausend   ; Zehntausender Stelle
    rcall   lcd_data
    mov     zeichen, tausend    ; Tausender Stelle ausgeben
    rcall   lcd_data
    mov     zeichen, hundert    ; Hunderter Stelle ausgeben
    rcall   lcd_data
    mov     zeichen, zehner     ; Zehner Stelle ausgeben
    rcall   lcd_data
    mov     zeichen, adlow      ; Einer Stelle ausgeben
    rcall   lcd_data
    ldi     zeichen, 10         ; LF, Line Feed (Neue Zeile)
    rcall   lcd_data

Wenn ich das mit hinzufüge, erscheinen nun das ganze Display über immer 
das gleiche wirre Zeichen...

von Falk B. (falk)


Lesenswert?

@Gast3 (Gast)

>Wenn ich das mit hinzufüge, erscheinen nun das ganze Display über immer
>das gleiche wirre Zeichen...

Es fehlt zum Beginn der LCD-Ausgabe ein LCD-Home bzw. LCD Clear.
1
 ; Sendet den Befehl zur Löschung des Displays
2
lcd_clear:
3
           ldi   temp1, 0b00000001      ; Display löschen
4
           rcall lcd_command
5
           rcall delay5ms

MFG
Falk

von J. K. (rooot)


Lesenswert?

Könntest du bitte das nächste mal einen ausagekräftigeren Betreff 
wählen?

zb
AVR LCD programmierprobleme

von Uwe (Gast)


Lesenswert?

Hi!
mal ne blöde Frage, wo eigentlich verwendest du in "lcd_data" das 
Register
"zeichen?"
In eine neue Zeile springt man aber auch nicht mit:
>    ldi     zeichen, 10         ; LF, Line Feed (Neue Zeile)
>    rcall   lcd_data
jedenfalls nicht auf einem LCD.

Wenn du kein fauler Sack bist solltest du mit den letzten Hinweisen 
deine Fehler finden.
merke: Fehler die du selbst gefunden hast merkst du dir bis in die 
Steinzeit.

Viel Erfolg, Uwe

von Gast3 (Gast)


Lesenswert?

Hallo,

Prima, ich bin schon weiter ich danke euch :-)

Nun erscheinen schon mal Zahlen: 00000    .... aber 0V wollt ich eig. 
net messen

von Gast3 (Gast)


Lesenswert?

Hallo,

So, mittlerweile hab ich den Controller so weit, dass er ab und an eine 
Zahl anzeigt. Die hab ich mit verschiedenen Spannungen überprüft und mit 
einem MM verglichen - stimmt ungefähr.

Jedoch passiert eigentlich immer etwas anderes, wenn ich den Strom 
anschalte.. mal sind Fragezeichen dabei, mal sind Vierecke, die eine 
Reihe bilden (meist 5) und oft springen die Dinge immer 5 Kästchen 
weiter, oder verdecken irgendwann die Zahlen.... etc.

Komischerweisse funktioniert das Programm auch nur, wenn ich vorher 
einmal einen Text ausgeben lasse.. der is natürlich auch so schnell 
wieder weg, dass man ihn nicht sehen kann.


Hat noch jemand Ideen?

von Jens G. (jensig)


Lesenswert?

klingt nach einem Resetproblem. Lasse mal dem LCD erstmal etwas Zeit zum 
"Einleben", also mal paar 10ms oder 100ms oder so, dann erst dessen 
Initialisierung machen.
Falls Du das Problem beim relativ schnellen Aus/Einschalten bekommst, 
dann evtl. einen Entlade-R über Ub schalten, oder den Elko kleiner 
machen, wenn da ein dickerer ist. Daselbe für den Reset-C/R - die 
Zeitkonstante nicht unnötig groß machen. Oder einen Reset-IC verwenden.
Das letzt Problem könnte vielleicht was mit 'nem fehlenden LCD-Home bzw. 
LCD Clear zu tun haben (wie Falk schon vermutete), was Du bei 
Textausgabe vermutlich mit drin hast, im anderen Fall vielleicht nicht.

von Peter (Gast)


Lesenswert?

Ganz nützlich zum debuggen:

http://www.helmix.at/hapsim/

von Kachel - Heinz (Gast)


Lesenswert?

Haste hier schonmal geschaut?

Beitrag "Das LCD-Problem / Lösungsansatz"

KH

von Gast3 (Gast)


Lesenswert?

Hallo,

also das Zeit lassen vor dem Einleben hat leider nichts gebracht. Den 
Reset-Pin habe ich gar keinen Kondensator... nur einen 10k Widerstand. 
Ich versuchs mal mit einem C noch parallel dazu.

Zumindest das letzte Problem scheint beseitigt zu sein, nachdem ich bei 
der Init Cursor on eingestellt habe.

>Haste hier schonmal geschaut?

ja, habe ich mal durchgelesen. Ich habe auch die ASM-Routinen, die dort 
vorgestellt wurden, 
(http://www.mikrocontroller.net/articles/LCD_Codesammlung_f%C3%BCr_AVR) 
getestet.... die funktionieren bei mir gar nicht.

Da es dort anscheinend oft zu Problemen kommt, sollte ich noch erwähnen, 
dass ich einen KS0070B Chip am LCD habe. Die Init ist ein bisschen 
umgeschrieben, sollte aber ja in Ordnung gehen, wenn die Textausgabe 
funktioniert.

von Stephan H. (stephan-)


Lesenswert?

mit "Zeit lassen" ist was anderes gemeint.
Dein Controller soll erstmal ein paar Ehrenrunden drehen, bevor er das 
Display mit Daten befeuert.

JMP Anfang

Anfang:   warte zB. 100ms
          Initialisiere Dispay
          Main

So ist das gemeint

von Gast3 (Gast)


Lesenswert?

>mit "Zeit lassen" ist was anderes gemeint.
>Dein Controller soll erstmal ein paar Ehrenrunden drehen, bevor er das
>Display mit Daten befeuert.

Ja, das hab ich schon richtig verstanden... hat aber leider nichts 
gebracht, der Kond. auch nicht. Immer noch das gleiche Problem :-(

von Otto (Gast)


Lesenswert?

es ist mal wieder Zeit, Dein Programm zu posten.....

Otto

von Kachel - Heinz (Gast)


Lesenswert?

> es ist mal wieder Zeit, Dein Programm zu posten.....

Oder auch nicht, die Luft ist eh raus. ;-)

KH

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.