www.mikrocontroller.net

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


Autor: Merthin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Merthin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hm, der Anhang wurde nicht gespeichert, sorry

Autor: Felix Bonjour (e-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab den Code betrachtet, sieht schön aus.

Gruss,
Felix

Autor: Schwurbl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Merthin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Merthin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wo sind:

lcd_enable
delay5ms
lcd_command

Otto

Autor: Kachel - Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Merthin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kachel - Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Merthin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
 ; Sendet den Befehl zur Löschung des Displays
lcd_clear:
           ldi   temp1, 0b00000001      ; Display löschen
           rcall lcd_command
           rcall delay5ms

MFG
Falk

Autor: J. K. (rooot)
Datum:

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

zb
AVR LCD programmierprobleme

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

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

Autor: Gast3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jens G. (jensig)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz nützlich zum debuggen:

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

Autor: Kachel - Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haste hier schonmal geschaut?

Beitrag "Das LCD-Problem / Lösungsansatz"

KH

Autor: Gast3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_Codesa...) 
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.

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es ist mal wieder Zeit, Dein Programm zu posten.....

Otto

Autor: Kachel - Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> es ist mal wieder Zeit, Dein Programm zu posten.....

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

KH

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.