Forum: Mikrocontroller und Digitale Elektronik Umstieg von Atmega8 auf Atmega168 LCD initialisiert nicht mehr


von Sven (Gast)


Lesenswert?

Hallo,

ich habe eine LCD mit HD44780 Controller. Der Code ist aus dem Tutorial 
und an meine Port Belegung angepasst. Die Schaltung hat einen 8Mhz 
Quarz, Frequenz ist entsprechend eingestellt.
Auf dem Atmega8 läuft das Ganze hier problemlos, Display initialisiert 
und ich kann Dinge ausgeben.

Nun habe ich im M-File statt dem Mega8 einen Mega168 eingetragen, da 
später alles darauf laufen soll und den Prozessor getauscht. Mega168 
entsprechend die Fusebits gesetzt, dass er mit 8Mhz Quarz läuft, CDIV 
Fuse nicht aktiv.

Leider initialisiert das Display dort nicht mehr. Habe auch den internen 
Oszi (8Mhz CDIV nicht aktiv) erfolglos versucht. Rückgbau auf Mega8 und 
Display läuft wieder. Da die beiden Pin-kompatibel sind und ich an der 
Ansteuerung nichts geändert habe, weiß ich im Moment nicht, wo der 
Fehler sein kann. Richtiger Takt ist 100% eingestellt, daher sind die 
delay Zeiten identisch.

Hat einer einen heißen Tipp, wo man noch nach einem Fehler suchen 
könnte?

Gruß

von Hondo Schnell (Gast)


Lesenswert?

Pin kompatibel heisst nicht zwingend Code kompatibel, auch wenn der 
Befehlssatz der Gleiche ist. Den ploetzlich sind die Register an einem 
anderen Ort, und wenn man die Register anspricht, geht

Out Reg,Data
nicht mehr, sonder man muss ueber

STS ...

raus. Schau mal ins manual der beiden controller.

von Peter D. (peda)


Lesenswert?

Sven schrieb:
> Hat einer einen heißen Tipp, wo man noch nach einem Fehler suchen
> könnte?

Ja.
Im nicht gezeigten Code.

Ich finds lustig, daß man die Leute hier immer für Gedankenleser hält.


Peter

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

So anbei der Code in der main.c. In der lcd.h sind die Ports angepasst 
auf meine Display-Belegung (diese Datei ist UNVERÄNDERT und wird so auch 
beim Mega8 verwendet).
Ebenso die Datei main.c ist unverändert.
Die einzige Änderung die ich gemacht habe, ist im m-file den Typ von 
Atmega8 auf Atmega168 umgestellt.

von Sammy-1 (Gast)


Lesenswert?

Schau mal Deine Fuses an und setz mal JTAGEN auf disable. Damit solltest 
Du PORTC wie gewohnt verwenden können.

Gruß,
Sam

von Martin (Gast)


Lesenswert?

Hallo Sam,

meinst du die SPIEN fuse?
Diese kann ich mit meinem normalen ISP nicht verändern.

War auch so von Werk, der Chip war gestern noch jungfräulich...

von Martin e. C. (eduardo)


Lesenswert?

Martin schrieb:
> meinst du die SPIEN fuse?

Der Atmega168 hat kein JTAG. Wenn du den SPIEN deaktivierst dann kannst 
du den Atmega nicht mehr über ISP flashen.

von Martin (Gast)


Lesenswert?

Ok, habe nämlich gerade das Datenblatt danach abgesucht und auch nichts 
gefunden. Ebenso wir mir ja keine Fuse angezeigt.

Das Problem ist aber dennoch ungelöst :-(

von Karl H. (kbuchegg)


Lesenswert?

Martin schrieb:

> Die einzige Änderung die ich gemacht habe, ist im m-file den Typ von
> Atmega8 auf Atmega168 umgestellt.

Und du hast hoffentlich auch darauf geachtet, dass nach dem Make dann 
auch tatsächlich alles neu kompiliert und gelinkt wurde?


Ob deine Fuse-Umstellung für die Taktfrequenz geklappt hat, hast du 
kontrolliert?
(Nicht glauben das ... sondern kontrollieren. IM einfachstn Fall ein 
Testprogramm schreiben, welche mittels _delay_ms( 1000 ) eine LED 
blinken lässt. Dann sieht man sehr schnell ob die Geschwindigkeit passt)

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Karl Heinz Buchegger schrieb:
> Und du hast hoffentlich auch darauf geachtet, dass nach dem Make dann
> auch tatsächlich alles neu kompiliert und gelinkt wurde?

Ja, ich habe nochmal sämtltiche Dateien außer .c, .h und das Makefile 
gelöscht.

Habe zwei LEDs an PORTB eine und an PORTD eine und den angehängten Code. 
LEDs leuchten abwechseln jede für 1 Sekunde, aber das Display streikt 
weiterhin.
Stecke ich den Mega8 auf mit gleichem Code wird das Display 
initialisiert.

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Der Vollständigkeit halber auch gerne noch das Makefile anbei...

von Bernd E. (berecke)


Lesenswert?

Ich meine, dass F_CPU vor dem Aufruf der Datei delay.h definiert sein 
muss. Delay.h hat so seine Tücken. Bin mir aber nicht sicher!
1
#ifndef F_CPU
2
#define F_CPU           8000000UL   
3
#endif
4
#include <util/delay.h>

von Martin (Gast)


Lesenswert?

Danke für den Tipp, leider hat es nichts gebracht.
Die LEDs haben ja den richtigen "Blinkrythmus", daher sollte die delay 
Funktion klappen. Ebenso bin ich der Ansicht, dass wenn die Frequenz im 
makefile angegeben ist, dieses #define sowieso hinfällig ist...

Aber dennoch nochmals danke, bin für jeden Hinweis froh, da das hier 
echt zum Mäuse melken ist. Gleiche Schaltung, gleicher Code, nur anderer 
Prozessor und es geht nicht mehr.
Habe auch mittlerweile einen zweiten fabrikneuen Mega168 versucht, 
gleiches Phänomen.

von Martin e. C. (eduardo)


Lesenswert?

Mal mit andere LCD routine probiert?

von Martin (Gast)


Lesenswert?

Hallo,

nein, aber die Routine initialisiert ja das LCD mit dem Mega8 und exakt 
identischem Code. Daher glaube ich nicht, dass es an der Routine liegt.
Habe auch mal die delay-Zeiten der Routine um 25% erhöht, hat aber auch 
nichts gebracht (es ist ja auch imho die gleiche Schaltung, d.h. auch 
gleicher Quarz...)

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Probier mal diese HEX Datei.

von Martin (Gast)


Lesenswert?

Hallo Holger,

deine HEX-Datei funktioniert.
Display zeigt in Zeile1 "Line1" und in Zeile2 "Line2".
Wenn du mir jetzt noch verätst, wo der Unterschied zwischen deiner und 
meiner Routine genau liegt, wäre ich für heute Abend wohl der 
glücklichste Mensch :-)

von Karl H. (kbuchegg)


Lesenswert?

Meistens sind's ganz banale Dinge, wie zb das falsche Hex-File in den µC 
geflasht.

von Martin (Gast)


Lesenswert?

Leider kann ich diesen Fehler auch ausschließen.
Habe eben mal noch einen Mega88 genommen, gleiches Programm. Läuft dort 
ebenfalls nicht. Nehme ich das für Mega88 kompilierte HEX-File und 
spiele dieses HEX (compiliert für Mega88!) auf den Mega8, initialisiert 
er das Display ohne Weiteres.

Das Mysterium lässt sich wohl nur durch Holger klären, also muss ich 
mich gedulden :-)

von holger (Gast)


Angehängte Dateien:

Lesenswert?

>deine HEX-Datei funktioniert.
>Display zeigt in Zeile1 "Line1" und in Zeile2 "Line2".
>Wenn du mir jetzt noch verätst, wo der Unterschied zwischen deiner und
>meiner Routine genau liegt, wäre ich für heute Abend wohl der
>glücklichste Mensch :-)

Erst noch mal dein eigenes Programm probieren, siehe Anhang.
Habs mal für dich übersetzt mit deinem makefile.

von Martin (Gast)


Lesenswert?

Hallo Holger,

zunächst noch einmal hierfür vielen Dank.
Ich kann auch hier positive Rückmeldung geben, das Programm 
funktioniert. LEDs blinken, Display Zeigt TEST und Hallo Welt wie es 
soll...
Aber wo liegt nun mein Fehler?!?

von holger (Gast)


Lesenswert?

>Aber wo liegt nun mein Fehler?!?

Nirgends, ich hab alles so gelassen wie es war.

So wie es aussieht hast du nach Änderung des makefiles
dein Programm nicht komplett neu übersetzt (oder ein anderes?).
Oder wie Karl Heinz schon sagte die falsche HEX Datei gebrannt.

Wenn du selber am makefile was änderst machst du am besten
erstmal "make clean". Das entsorgt alte Dateien die dann
neu übersetzt werden müssen.

von Karl H. (kbuchegg)


Lesenswert?

Ist zwar unwahrscheinlich, aber die Compilerversion könnte es auch noch 
sein. Ich hab allerdings auf die Schnelle keine Errata gefunden, die 
irgendwie weiter Licht ins Dunkel bringen.

Ich denke auch, dass du die ganze Zeit das Mega8-Hex erstellst/brennst.

Das hier
> Nehme ich das für Mega88 kompilierte HEX-File und spiele
> dieses HEX (compiliert für Mega88!) auf den Mega8, initialisiert
> er das Display ohne Weiteres.

passt genau in das Schema.

von Martin (Gast)


Lesenswert?

Also ich komm nicht weiter.
Ich nutze avr-gcc (WinAVR 20100110) 4.3.3.

Habe nun make_clean und neu kompiliert. Habe das Verzeichnis geändert 
und aus dem neuen Verzeichnis geflasht.
Habe vom festen PC auf Laptop umgestellt, dort nochmals WinAVR 
installiert, neu kompiliert, das gleiche.

von holger (Gast)


Lesenswert?

>Ich nutze avr-gcc (WinAVR 20100110) 4.3.3.

Mein Compiler ist noch 4.3.0.

>Habe nun make_clean und neu kompiliert. Habe das Verzeichnis geändert
>und aus dem neuen Verzeichnis geflasht.

>Habe vom festen PC auf Laptop umgestellt, dort nochmals WinAVR
>installiert, neu kompiliert, das gleiche.

Hört sich alles sehr komisch an.
Pack dein aktuelles Verzeichnis doch mal in ein ZIP und poste es hier.
Aber bitte nichts daran ändern!

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Anbei das komplette Verzeichnis inkl. meiner HEX-Datei und Makefile.
Danke.

von Martin (Gast)


Lesenswert?

Also ich habe es jetzt mal in AVRStudio kompiliert, darin gehts.
Zuvor hatte ich es direkt aus dem Programmers Notepad aus dem WinAVR 
kompiliert und damit ging es nicht.
Trotzdem ein wenig seltsam, da ich bisher alle Projekte problemlos im 
Programmers Notepad erstellt und kompiliert hatte...

Falls jemand eine Idee hat, woran das liegt oder warum dies so ist, wäre 
ich noch dankbar.
Ansonsten habe ich zu danken, bei allen die versucht haben zu helfen.

von holger (Gast)


Lesenswert?

>Zuvor hatte ich es direkt aus dem Programmers Notepad aus dem WinAVR
>kompiliert und damit ging es nicht.

Na dann zeig mal deine Projektdatei für Programmers Notepad.
Ich denke das es daran liegt.

von Martin (Gast)


Lesenswert?

Hmm, ich habe dort keine Projektdatei.
Ich öffne einfach die main.c und gehe oben auf Tools und Make All. Dann 
compiliert es mir.

von Bernd E. (berecke)


Lesenswert?

Nach meiner Erfahrung sind das oft Optimierungsprobleme in den 
Zeitschleifen (Timing). Nimm mal die Optimierung des Compilers heraus. 
In deinem Make-File steht sie auf OPT=s:
1
# Optimization level, can be [0, 1, 2, 3, s]. 
2
#     0 = turn off optimization. s = optimize for size.
3
#     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
4
OPT = s

Probier mal O0, O1, O2 oder O3 aus.

von Peter D. (peda)


Lesenswert?

Bernd Eckebrecht schrieb:
> Nach meiner Erfahrung sind das oft Optimierungsprobleme in den
> Zeitschleifen (Timing).

Ganz im Gegenteil, die Delay.h des AVR-GCC benötigt die Optimierung, 
vorzugsweise -Os.
Mit -O0 geht sie total falsch.


Peter

von Martin (Gast)


Lesenswert?

Richtig, das habe ich über die Suche auch schon herausgefunden als 
Fehlerursachen mit der Optimierung, aber die ist ja richtig 
eingestellt...
Das komische ist ja, dass das identische makefile im AVRStudio geht, im 
Programmes Notepad ja nicht, sprich auch mit gleicher 
Optimierungseinstellung.
Mir ist es immernoch rätselhaft, aber nun ja. Werde ich es eben im 
AVRStudio kompilieren. Falls jemand noch eine Idee hat, woran es liegt, 
gerne her damit.
Das Programm hat übrigens im Programmers Notepad ein paar byte weniger 
(0,2% weniger Speicher) als in AVRStudio kompiliert.... Auch seltsam, 
aber wohl der kleine Unterschied...

von holger (Gast)


Lesenswert?

>Das komische ist ja, dass das identische makefile im AVRStudio geht, im
>Programmes Notepad ja nicht, sprich auch mit gleicher
>Optimierungseinstellung.

Wenn ich die main.lss von dir und mir vergleiche fehlen da folgende
Zeilen bei dir:

00000084 <__do_copy_data>:
  84:  11 e0         ldi  r17, 0x01  ; 1
  86:  a0 e0         ldi  r26, 0x00  ; 0
  88:  b1 e0         ldi  r27, 0x01  ; 1
  8a:  e4 e2         ldi  r30, 0x24  ; 36
  8c:  f3 e0         ldi  r31, 0x03  ; 3
  8e:  02 c0         rjmp  .+4        ; 0x94 <.do_copy_data_start>

00000090 <.do_copy_data_loop>:
  90:  05 90         lpm  r0, Z+
  92:  0d 92         st  X+, r0

00000094 <.do_copy_data_start>:
  94:  a0 30         cpi  r26, 0x00  ; 0
  96:  b1 07         cpc  r27, r17
  98:  d9 f7         brne  .-10       ; 0x90 <.do_copy_data_loop>

0000009a <__do_clear_bss>:
  9a:  11 e0         ldi  r17, 0x01  ; 1
  9c:  a0 e0         ldi  r26, 0x00  ; 0
  9e:  b1 e0         ldi  r27, 0x01  ; 1
  a0:  01 c0         rjmp  .+2        ; 0xa4 <.do_clear_bss_start>

000000a2 <.do_clear_bss_loop>:
  a2:  1d 92         st  X+, r1

000000a4 <.do_clear_bss_start>:
  a4:  a0 30         cpi  r26, 0x00  ; 0
  a6:  b1 07         cpc  r27, r17
  a8:  e1 f7         brne  .-8        ; 0xa2 <.do_clear_bss_loop>
  aa:  0e 94 63 00   call  0xc6  ; 0xc6 <main>
  ae:  0c 94 90 01   jmp  0x320  ; 0x320 <_exit>


Also im Prinzip der komplette Startupcode der data und bss 
initialisiert.
Warum das bei Programmers Notepad so ist kann ich dir aber auch nicht 
sagen. Ich hab das einfach ohne Änderung mit "make clean" und dann "make 
all" aus deinem Code übersetzt.

von asdf (Gast)


Lesenswert?

Hallo,
Hatte vor kurzem ein aehnliches problem mit avg-gcc in linux. Es hat 
sich herausgestellt, das nach einem update des compilers und der 
avr-libc, die delay-routinen ploetzlich etwas ahem.. 'kuerzere' 
millisekunden benutzten, was dazu fuehrte, dass das display nicht 
initialisierte. Den code fuers display hatte ich urspruenglich aus einer 
avr-libc beispieldatei. Ein oberflaechlicher vergleich war recht 
erleuchtend, denn es waren ploetzlich neue delays vorhanden, die im von 
mir benutzten(alten) code noch fehlten.

Ein anderer belieber stolperdraht, den Ich auch schon ausprobieren 
durfte, betrifft 'nop' Instruktionen. Neuere compiler versionen, meinen 
mehrere 'nop's in einzelnen asm-statements wegoptimieren zu duerfen. Mit 
einem einzelnen asm statement und mehreren 'nop's hingegen funktioniert 
es.

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.