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
... 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
fällt mit gerade noch ein... ADC-LCD-KOMBI.asm ist das Hauptprogramm, der Rest sind Routinen und Definitionen... Gruß Ralph
@ 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
@ 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
@ 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?
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
@ 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
@ 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
@ 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
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
@ 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
@ 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!
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.