Forum: Mikrocontroller und Digitale Elektronik Fehler nach PowerUp


von Ralph P. (autodidakt)



Lesenswert?

Hallo an alle,

ich bin hier neu und auch noch nicht so lange am programmieren. Ich habe 
mir in diesem Forum schon sehr viele Dinge aneignen können - super Sache 
- aber jetzt geht es irgendwie nicht weiter...
Ich benutze ein Board von ET-EASY mit einem Atmega1280 und einem FT232 
zum Programmieren über USB.
(http://www.thaieasyelec.net/archives/Manual/ET-EASY%20MEGA1280-1.pdf)
Meine Anwendung habe ich im AVR-Studio in Assembler geschrieben. 
Programmierschnittstelle ist AVRdude-GUI.

Seit ca. 2 Wochen versuche ich nun schon eine Lösung für mein Problem zu 
finden - habe sehr viel im Forum gelesen und das Datenblatt durchsucht. 
Leider ist mein Englisch nur sehr mangelhaft deshalb ist es sehr 
schwierig bei kniffeligen Sachen das richtige aus dem Datenblatt 
rauszulesen.

In diesem Beitrag geht es um ein ähnliches Problem - nur habe ich nicht 
ganz verstanden, wie es gelöst wurde...
Beitrag "ATmega168: Fehler nach Power-Up"

nun zu meinem Problem:
In meiner Anwendung werden 8 ADC abgefragt und dann an ein LCD (4x16) 
ausgegeben. Die Ausgabe habe ich in mehrere Seiten unterteilt, die über 
einen Taster umgeschaltet werden können um alles anzuzeigen.
Das Programm läuft nach dem flashen auch einwandfrei und ohne Fehler - 
wenn ich aber die Betriebsspannung (vo USB oder extern) wegnehme und 
dann wieder anstecke bekomme ich auf dem Display nur Hyroglyphen.
Nach allem, was ich bisher darüber gelesen habe, liegt es wahrscheinlich 
am Power-up Reset. Ich habe im Programm nach dem Stack initialisieren 
schon eine Wartezeit von bis zu 1sek. eingebaut, um auf das Display zu 
warten aber ich denke eher, dass das Problem vom SRAM kommt...
Meine erste Menuseite zeigt einen Text, der aus dem Flash gelesen wird - 
der wird immer richtig angezeigt - auf den anderen Seiten wird der Text 
aus dem SRAM gelesen (Ziffen werden Teilweise richtig angezeigt?).
Wenn ich beim Anstecken der Betriebsspannung den Reset-Knopf gedrückt 
halte und den richtigen Zeitpunkt zum loslassen erwische (nicht zu lang 
und nicht zu kurz), funktioniert auch alles fehlerfrei...
Außerdem ist mir noch aufgefallen, dass die Zeilen, die aus dem SRAM 
gelesen werden, alle den gleichen Inhalt haben. Wenn ich das Schreiben 
aus dem Flash in den SRAM im Programm ausblende, werden alles gleiche 
Hyroglyphen angezeigt - scheint also die richtige Stelle im SRAM zu 
sein, von der gelesen wird...
Es könnte auch sein, dass es ein Problem mit den Fuses ist - nur damit 
kenne ich mich überhaupt noch nicht aus.
Trotzdem hier mal die Werte, die ich ausgelesen habe:
LFuse:   FF h
HFuse:   DA h
EFuse:   F5 h
LockBit: 3F h

Ich hoffe, ich habe nichts vergessen euch zu schildern und würde mich 
sehr über eure Hilfe freuen. Den Quellcode habe ich absichtlich noch 
nicht angehängt, weil der ziemlich umpfangreich ist und noch nicht so 
gut sortiert.
Wenn noch Informationen fehlen werde ich diese natürlich nachliefern.
Vielen Dank schon mal für eure Hilfe!

Gruß Ralph

von spess53 (Gast)


Lesenswert?

Hi

>Ich hoffe, ich habe nichts vergessen....

Doch. Dein Programm.

MfG Spess

von Ralph P. (autodidakt)


Angehängte Dateien:

Lesenswert?

... Ok hier ist es ...
hab nur gedacht, dass das Problem vielleicht auch ohne Programm schon 
bekannt ist und es ne simple Lösung dafür gibt... - ist ja oft so...

habe einmal das Kpmplette Projekt und extra die .asm und .inc gezippt

ist aber wie gesagt noch nicht so gut sortiert...

Gruß
Ralph

von Ralph P. (autodidakt)


Lesenswert?

fällt mit gerade noch ein...

ADC-LCD-KOMBI.asm ist das Hauptprogramm, der Rest sind Routinen und 
Definitionen...

Gruß Ralph

von Falk B. (falk)


Lesenswert?

@  Ralph Pfeiffer (autodidakt)

>      Fuse.gif
>      94.9 KB, 12 Downloads

Wie schafft man so einen verschwommenen Schreenshot? Lies mal was über 
Bildformate.

>wenn ich aber die Betriebsspannung (vo USB oder extern) wegnehme und
>dann wieder anstecke bekomme ich auf dem Display nur Hyroglyphen.

NUR?

>Nach allem, was ich bisher darüber gelesen habe, liegt es wahrscheinlich
>am Power-up Reset. Ich habe im Programm nach dem Stack initialisieren
>schon eine Wartezeit von bis zu 1sek. eingebaut, um auf das Display zu
>warten

Guter Ansatz.

>aber ich denke eher, dass das Problem vom SRAM kommt...
>Meine erste Menuseite zeigt einen Text, der aus dem Flash gelesen wird -
>der wird immer richtig angezeigt -

Also NICHT nur Hyroglyphen!

> auf den anderen Seiten wird der Text
>aus dem SRAM gelesen (Ziffen werden Teilweise richtig angezeigt?).
>Wenn ich beim Anstecken der Betriebsspannung den Reset-Knopf gedrückt
>halte und den richtigen Zeitpunkt zum loslassen erwische (nicht zu lang
>und nicht zu kurz), funktioniert auch alles fehlerfrei...

Klingt nach nicht initialisierten Pointern.

>Es könnte auch sein, dass es ein Problem mit den Fuses ist - nur damit
>kenne ich mich überhaupt noch nicht aus.

Die scheinen OK.

>nicht angehängt, weil der ziemlich umpfangreich ist und noch nicht so
>gut sortiert.

Schlechter Ansatz. Quellode sorttiert man nicht hinterher, sondern beim 
Schrieben. Denn sonst verliert man selber schnell den Überblick.
Siehe Strukturierte Programmierung auf Mikrocontrollern.

Ich hab mal dein Programm überflogen. Für den Anfang OK, wenn gleich 
noch verbesserungsfähig.

Du vermischst noch zuviel Funktionalität in einer ungünstigen Weise. 
Beispiel Menus anzeigen. So einer Funktion übergibt man einen Pointer 
oder Zahl auf das Menu und es wird gezeichnet. Das Weiterschalten von 
Menus hat dort nichts zu suchen.

Konstante Strings lässt man im Flash und gibt sie direkt aus, ein 
Kopieren in den SRAM ist sinnlos und verschwendet Speicher.

Dein srsk und die Sicherung von SREG in Funktionen ist Unsinn, das macht 
man nur in der ISR.

MfG
Falk

von Falk B. (falk)


Lesenswert?

@  Ralph Pfeiffer (autodidakt)

>ADC-LCD-KOMBI.asm ist das Hauptprogramm, der Rest sind Routinen und
>Definitionen...

Geh mal davon aus, dass das ein geüber ASMer erkennt. Und noch viel 
besser, in einem solide strukturierten und dokumentierten Quelltext 
erkennt es ein Blinder . . .

MFG
Falk

von Ralph P. (autodidakt)


Lesenswert?

@ Falk Brunner

> Wie schafft man so einen verschwommenen Schreenshot? Lies mal was über
> Bildformate.

Sorry für den schlechten Screenshot, hab ich schon gelesen - wollte es 
so klein wie möglich machen - das nächste mal kommts besser...

> Klingt nach nicht initialisierten Pointern.

meiner Meinung nach habe ich die schon initialisiert???

oder muss ich das vorher schon mal im Hauptprogramm machen als erdt in 
der Routine in der Datei Sram-routines.asm?
Store_Au_Name:
  ldi   ZL, LOW(Aussen*2)         ; Adresse des Strings in den
  ldi   ZH, HIGH(Aussen*2)        ; Z-Pointer laden
  ldi   YL, LOW(Au_Name)
  ldi   YH, HIGH(Au_Name)
  call   Load_SRAM
  ret
wenn die Pointer nicht initialisiert sind würde es doch nach dem flashen 
auch nicht funktionieren - oder hab ich da nen Denkfehler?

> Schlechter Ansatz. Quellode sorttiert man nicht hinterher, sondern beim
> Schrieben. Denn sonst verliert man selber schnell den Überblick.
> Siehe Strukturierte Programmierung auf Mikrocontrollern.
>
> Ich hab mal dein Programm überflogen. Für den Anfang OK, wenn gleich
> noch verbesserungsfähig.

Dass das Programm noch verbesserungsfähig ist, ist mir schon völlig 
bewußt. Ich bin schon sehr glücklich darüber, dass es "so gut" 
funktioniert... für mich waren für den Anfang die verschiedenen Dateien 
mit den Routinen am einfachsten zu überschauen - vielleicht sollte ich 
da noch ein paar Sachen zusammenfassen...

> Du vermischst noch zuviel Funktionalität in einer ungünstigen Weise.
> Beispiel Menus anzeigen. So einer Funktion übergibt man einen Pointer
> oder Zahl auf das Menu und es wird gezeichnet. Das Weiterschalten von
> Menus hat dort nichts zu suchen.

das verstehe ich jetzt nicht ganz - das war halt für mich am 
logischsten, alles in eine "Menu-Routine" zu packen und diese Routine 
dann von der Tasterabfrage anzuspringen...?
Vielleicht kannst du mir das etwas näher erläutern, wie du das meinst - 
soll der gesamte "Seitentext" auf einmal ausgelesen werden? Ich wollte 
es halt Zeile für Zeile machen um flexibel umbauen zu können innerhalb 
der Seite...

> Konstante Strings lässt man im Flash und gibt sie direkt aus, ein
> Kopieren in den SRAM ist sinnlos und verschwendet Speicher.

das hatte ich ursprünglich im SRAM gemacht, weil ich dann mit einmal 
Zeiger setzen einfacher an meine zusammenhängenden Daten rankomme - hab 
aber auch schon drüber nachgedacht, hab nur noch nicht so ganz 
herausgefunden, wie ich die einzelnen Texte im Flash mit der 
"Channel-Nr." anspringen kann - ähnlich wie die Tabelle für den SRAM?

Ch_Tab: .dw 
Au_Name,St_Name,Sl_Name,Ba_Name,Ku_Name,Ra_Name,Li_Name,Du_Name

> Dein srsk und die Sicherung von SREG in Funktionen ist Unsinn, das macht
> man nur in der ISR.
>
diese Sicherungen hatte ich eingebaut, weil ich irgendwann Probleme mit 
meinen Anzeigen der Temperaturen hatte - war aber eventuell doch ein 
anderes Problem und ist schon gelöst - dann werde ich mal anfangen, das 
wieder zurückzubauen (wobei das ja außer Rechenzeit und Stack eigentlich 
nicht schaden kann - oder?)

Auf jeden Fall schon mal vielen Dank für die Denkanstöße - mal sehen, 
wann ich dazu komme - momentan ist bei mir ziemlich was los, so als 
werdender Papa (am Montag ist Termin) - eigentlich wollte ich ja fertig 
sein wenn es so weit ist - aber da hab ich mich wohl ganz schön 
verkalkuliert...

Gruß Ralph

PS: der Hinweis mit dem Hauptprogramm war eigentlich nur, dass man nicht 
erst alle Dateien öffnen muß. Ist denn die Kommentierung OK, für 
jemanden der das Prog zum ersten mal sieht?

von Peter D. (peda)


Lesenswert?

Beim LCD ist es sehr wichtig, es korrekt zu initialisieren.
Leider ist das Datenblatt zwar nicht falsch, aber etwas nebulös.
Nach jeder Instruktion muß das Min-Delay gewartet werden, auch wenn das 
nicht immer explizit dasteht. Erst nach korrekter Moduseinstellung darf 
auch Busy gelesen werden, falls man den extra Pin opfern will.

Hier mal ein Code, der immer funktionieren sollte (Einloggen nicht 
vergessen, sonst sieht man den Link nicht):

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=102296



Peter

von Ralph P. (autodidakt)


Lesenswert?

@ Peter

kann es sein, dass ein nicht richtig initialisiertes Display nach dem 
flashen funktioniert und nach dem Spannung anlegen nicht???
selbst nach dem Spannung neu anlegen wird ja der Flash-Text korrekt 
ausgegeben...
das dürfte ja dann auch nicht der Fall sein - oder irre ich mich da?

ich denke eher, dass der Text irgendwie nicht richtig in den Ram 
geschrieben wird???

habe gerade noch einmal im AVR-Studio simuliert - dabei ist mir 
aufgefallen, dass der Z-Pointer für den Flash-String bei meinem ersten 
Text auf hex 096A steht - die Adresse des Stings ist aber bei hex 04B5 
(im Flash *2 ist 096A) - sollte also stimmen - wird beim weiter 
simulieren auch richtig ausgegeben.

kann es auch sein, dass es ein Problem mit dem Bootloader ist, der 
irgendwie nicht richtig zum Programmstart springt? oder die Pos. des 
Interrupt-Vectors am Anfang des Programms?

Gruß Ralph

von Falk B. (falk)


Lesenswert?

@  Ralph Pfeiffer (autodidakt)

>meiner Meinung nach habe ich die schon initialisiert???

Der Meinung ist jeder Programmierer, bis er den Fehler findet ;-)

>funktioniert... für mich waren für den Anfang die verschiedenen Dateien
>mit den Routinen am einfachsten zu überschauen - vielleicht sollte ich
>da noch ein paar Sachen zusammenfassen...

Nein, das passt soweit.

>das verstehe ich jetzt nicht ganz - das war halt für mich am
>logischsten, alles in eine "Menu-Routine" zu packen und diese Routine
>dann von der Tasterabfrage anzuspringen...?

Ja, kann man schon machen, die Komplexität ist ja noch überschaubar.

>Vielleicht kannst du mir das etwas näher erläutern, wie du das meinst -
>soll der gesamte "Seitentext" auf einmal ausgelesen werden? Ich wollte
>es halt Zeile für Zeile machen um flexibel umbauen zu können innerhalb
>der Seite...

Eine Funktion zum Weiterzählen der Menuseite
Jeweils eine zum Anzeigen einer Seite

>das hatte ich ursprünglich im SRAM gemacht, weil ich dann mit einmal
>Zeiger setzen einfacher an meine zusammenhängenden Daten rankomme

Geht bei Flash genauso einfach.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Speicher#Flash-ROM_2

>diese Sicherungen hatte ich eingebaut, weil ich irgendwann Probleme mit
>meinen Anzeigen der Temperaturen hatte - war aber eventuell doch ein
>anderes Problem

Sicher.

>wieder zurückzubauen (wobei das ja außer Rechenzeit und Stack eigentlich
>nicht schaden kann - oder?)

Eigentlich nicht.

>erst alle Dateien öffnen muß. Ist denn die Kommentierung OK, für
>jemanden der das Prog zum ersten mal sieht?

Einigermassen.

Ich glaube ich habe eine heiße Spur. Du überfährst dein LCD beim Enable. 
Wenn dein Controller auf wahnsinnigen 16 MHz läuft, dann sind drei NOPs 
für den Enable-Puls zu wenig. Das will mindestens 450ns sehen, das sind 
mindestens 7 NOPs. Ich würde ihm wenigstens 10 NOPs gönnen.

Die Initialisierung ist ausreichend "langsam", dort sind genug 
Wartezeiten drin.

MFG
Falk

von Ralph P. (autodidakt)


Lesenswert?

@ Falk

Danke erstmal für die ausführliche Zusammenarbeit und deine Mühen
Am LCD Enable-Puls lag es nicht... den habe ich gerade auf 15 Nop's, 
dann sogar auf 30 und zu guter letzt mit delay50us verlängert - keine 
Besserung :-(

das mit den Flash-Strings habe ich versucht, funktioniert aber noch 
nicht da werde ich mich (wenn ich Zeit habe) morgen mal dran machen - 
vielleicht bringt das ja was...

was mich allerdings wundert - nach dem Flashen sind die Anzeigen der 
Temperatur in den Zeilen unterschiedlich, aber nach dem PowerUp sind 
diese Anzeigen in allen Zeilen gleich - auch die "Hyroglyphen" sind in 
allen zeilen gleich...
sieht fast so aus, als würden da immer die selben Zeilen ausgegeben...

Ich denke, es liegt entweder daran, dass die Falschen Werte in den SRAM 
gelesen werden oder dass von einer falschen stelle im SRAM gelesen (oder 
geschrieben) wird.
vielleicht sollte ich mir auch noch einmal die Channel-Umschaltung 
ansehen,
nur komisch, dass es nach dem Flashen geht?

was hälst du von dem Ansatz mit dem Bootloader und Einsprung zum 
Programm (siehe oben)?

Vielen Dank noch einmal
Gruß Ralph

von Falk B. (falk)


Lesenswert?

Ich denke ich hab den Fehler. Deine Initialisierung für Y kurz vor 
Call_SRAM_String_to_LCD geht schief in

1
Channel_Set:
2
  ldi    YL,LOW(Channel)
3
  ldi    YH,HIGH(Channel)          
4
  st    Y,Ch            ;schreibt den aktuellen Kanal in den SRAM
5
6
  ldi    ZL,LOW(Ch_Tab*2)
7
  ldi    ZH,HIGH(Ch_Tab*2)
8
  cli
9
  add    ZL,Ch
10
  adc    ZH,R0
11
  add    ZL,Ch
12
  adc    ZH,R0
13
  
14
  lpm    YL,Z+
15
  lpm    YH,Z
16
  sei
17
18
ret

R0 ist nicht initialisiert, nur manchmal zufällig Null. Und um das 
Doppelte zu addieren kann man vorher einfach schieben. Ist aber nicht 
entscheidend.

Ein

sub r0,r0

nach dem cli sollte das fixen. Das es manchmal funktioniert liegt daran, 
dass der SRAM-Inhalt nach dem Reset zufällig ist, manchmal zufällig Null 
;-)

MFG
Falk

PS Initialisierungsfehler. Q E D

von Ralph P. (autodidakt)


Lesenswert?

@ Falk

> Ein
>
> sub r0,r0
>
> nach dem cli sollte das fixen.

hab ich gerade eingebaut und ausprobiert - das war es leider auch nicht
wäre auch zu schön gewesen...

Trotzdem vielen Dank erst mal
Muss jetzt mal wieder zu meiner Liebsten...

Gruß Ralph

von Ralph P. (autodidakt)


Lesenswert?

@ Falk

vielleicht habe ich gestern Abend irgendwas falsch gemacht...
Du hattest Recht es war das Register R0...

jetzt funktioniert alles - Danke für die gute Hilfe

noch was allgemeines zum Forum:
wenn hier alle so qualifiziert und "geduldig" helfen würden wie Du, 
hätte ich mich schon viel eher angemeldet... - aber da habe ich leider 
schon ganz andere Sachen gelesen.
Schließlich sind die, die hier ein Problem schildern nicht zum Spaß 
hier, sondern weil sie allein nicht mehr weiter kommen...

großes Lob an dich und vielen Dank

Gruß Ralph

PS: Danke auch an Peter Dannegger - deine Posts haben schon in anderen 
Situationen viel geholfen!

von Falk B. (falk)


Lesenswert?

@Ralph Pfeiffer (autodidakt)

>vielleicht habe ich gestern Abend irgendwas falsch gemacht...

Du bist im Stress, verständlich.

>Du hattest Recht es war das Register R0...

>jetzt funktioniert alles - Danke für die gute Hilfe

De nada.

>noch was allgemeines zum Forum:
>wenn hier alle so qualifiziert und "geduldig" helfen würden wie Du,
>hätte ich mich schon viel eher angemeldet...

Darf ich mir das ausdrucken und golden einrahmen? ;-)

MfG
Falk

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.