Könntet ihr einen Blick auf meinen Code werfen?

Gast #979271
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.
Gast #979291
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.
Gast #979307
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
Gast #979322
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.
Gast #979339
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
Gast #979624
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.
Gast #979690
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
Gast #979897
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...
#979906
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
Gast #980190
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
Gast #980506
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?
#980517
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.
Gast #981064
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.
Gast #981541
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 :-(

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren