Hallo Leute,
mein Atmega8 treibt mich zum Wahnsinn, ich hoff einer von euch weiß
Rat..
Bisher hatte ich AtTinys genommen, die waren ganz problemlos:
anstöpseln, flashen, läuft.
Dasselbe hab ich jetzt mit nem Atmega8 probiert, aber der tut kurz
gesagt gar nix. Ich weiß leider nicht ob es am Programm liegt oder an
der Schaltung an sich. Muß man den anders programmieren? Die Doku sagt
das der nen Bootloader hat. Braucht der ne Extra Behandlung oder fängt
mein Programm wie gewohnt bei int main() an?
Ich hab Programm und Schaltung mittlerweile auf eine Minimalversion
zusammengeschrumpft, trotzdem passiert nix.
In der Schaltung sind jetzt nur noch die beiden VCCs und Massen
beschaltet, mitsamt ihren Cs und der Reset-Pin wie gewöhnlich mit einem
R und einem C.
Das Programm macht nur noch
1
intmain(void){
2
DDRB=1<<PB0;//B.0 auf Ausgang
3
PORTB=1;//B.0 auf High
4
while(1);
5
return0;
6
}
An B.0 hängt ne LED.
Wenn ich direkt an den Beinen nachmesse, dann sind wie erwartet die VCCs
und Reset auf 5V, die GNDs sind auf Masse und alle andren Beine scheinen
potentiallos zu sein. So als würde ich ein nicht angeschlossnes Stück
Draht messen. Das kommt mir komisch vor... Wäre das der Fall wenn alle
Eingänge auf Input stehen würden? Falls ja, dann würde das je bedeuten,
dass das Programm nicht ausgeführt wird. -> Warum
Gefused hab ich ihn auf internen RC 8MHz mit großer Startup Time,
Brownout off, Bootreset off, Watchdog off, ResetDisabled off.
Am Atmega liegts denk ich nicht. Hab ihn schon ausgewechselt und der
neue verhält sich ganz genauso.
Irgendwelche Ideen was ich noch probieren könnt? :-/
Danke euch
Steve
Ja programmieren lässt er sich. Ich kann auch die Signatur auslesen,
seine Spannung auslesen usw. Nur starten tut er nich.
Ja, Reset ist auf 5V gepullupt.
Das mit dem Bootloader steht zunächst mal bei den Fuse-Bits. Man kann
ihn nicht ausschalten, nur die Größe konfigurieren. In der Spec steht
dann dies und jenes Detail zum Bootloader, aber eigentlich nicht ob/wie
man ihn benutzen muss.
> In der Spec steht dann dies und jenes Detail zum Bootloader,> aber eigentlich nicht ob/wie man ihn benutzen muss.
Nöö. Da ist kein Bootloader drin. Die Fusebits besagen lediglich, dass
es einen Speicherbereich definierbarer Größe gibt, von welchem aus man
Schreibzugriff auf den restlichen Flash hat. Da kannst du dann deinen
eigenen Bootloader reinschreiben und die Fusebits sagen dann, wo der
Controller nach dem Einschalten hinspringt.
Wenn die Bootloader-Fuses aus sind, geht es ganz normal beim
Reset-Vektor 0x0000 los. Da steht dann die Interruptvektor-Tabelle
und...ach steht doch alles im Datenblatt :-/
Ideen:
1.) Falscher Controller im Makefile angegeben. Dann stimmen
die SFR-Addressen nicht und der Controller macht....nix.
2.) Takt falsch gefused. Manche Programmer geben dem Target einen
Takt zum Flashen und wenn der Controller dann wieder zurück
in die Fassung auf der Platine steckt geht nix mehr.
3.) Schaltungsfehler. Poste mal den Schaltplan.
4.) Kalte Lötstelle. Das passiert sogar den Erfahrenen hier ab und
zu mal ;)
Wie kompilierst du denn dein Programm? Makefile?
@Hannes:
Stimmt, der interne reicht völlig. Solang der Prototyp nur auf dem
Labortisch steht. Im Feld hatte ich u.a. schon Attiny2313 die aufgrund
fehlender Reset-Pullups sporadisch Resets hingelegt haben.
> Nöö. Da ist kein Bootloader drin. Die Fusebits besagen lediglich, dass> es einen Speicherbereich definierbarer Größe gibt, von welchem aus man> Schreibzugriff auf den restlichen Flash hat. Da kannst du dann deinen> eigenen Bootloader reinschreiben und die Fusebits sagen dann, wo der> Controller nach dem Einschalten hinspringt.
Ok brauch ich nich. Kann ich dieses Feature also einfach ignorieren oder
muss ich das explizit dem Compiler sagen, dass meine main()-Funktion
bitteschön an die Stelle hingepackt werden soll die er automatisch
anspringt?
> Wenn die Bootloader-Fuses aus sind, geht es ganz normal beim> Reset-Vektor 0x0000 los. Da steht dann die Interruptvektor-Tabelle> und...ach steht doch alles im Datenblatt :-/
Die Bootloader-Fuses hätt ich schon ausgeschaltet wenn das denn ginge.
Aber der Boot-Bereich ist immer an. Man kann nur die Größe einstellen
zwischen 128 und 1024 Worten. Bleibt noch zu erwähnen das ich alle der
Varianten schon ausprobiert hab.
> Ideen:>> 1.) Falscher Controller im Makefile angegeben. Dann stimmen> die SFR-Addressen nicht und der Controller macht....nix.
MCU = atmega8
-DF_CPU=8000000UL
> 2.) Takt falsch gefused. Manche Programmer geben dem Target einen> Takt zum Flashen und wenn der Controller dann wieder zurück> in die Fassung auf der Platine steckt geht nix mehr.
Taktfuse stimmt
> 3.) Schaltungsfehler. Poste mal den Schaltplan.
attached
> 4.) Kalte Lötstelle. Das passiert sogar den Erfahrenen hier ab und> zu mal ;)
Breadboard :)
Ich hab die Potenziale direkt am Bein gemessen um "Verdrahtungs"fehler
auszuschließen. Die sind wie oben beschrieben.
> Wie kompilierst du denn dein Programm? Makefile?
Indirekt sicher schon. Aber automatisch ausm AVR-Studio raus.
Danke nochma
> Ok brauch ich nich. Kann ich dieses Feature also einfach ignorieren oder> muss ich das explizit dem Compiler sagen, dass meine main()-Funktion> bitteschön an die Stelle hingepackt werden soll die er automatisch> anspringt?
Ein neuer Mega8 sollte die Boot Reset Fuse nicht gesetzt haben, d.h.
normal beim Reset-Vektor anfangen. In dem Fall musst du deinem Linker(!)
nix sagen.
Welche Fusebits hast du denn verstellt? Wie sind sie gesetzt?
> Die Bootloader-Fuses hätt ich schon ausgeschaltet wenn das denn ginge.> Aber der Boot-Bereich ist immer an. Man kann nur die Größe einstellen> zwischen 128 und 1024 Worten. Bleibt noch zu erwähnen das ich alle der> Varianten schon ausprobiert hab.
Stichwort Boot Reset Fuse. siehe oben.
> Taktfuse stimmt
Stimmt, von hier aus sehen alle 4 Fusebits richtig aus. Könnte aber auch
ein Kratzer in der Kristallkugel sein.
> MCU = atmega8> -DF_CPU=8000000UL
Passt. Wie includest du den die SFR-Headerdatei?
> attached
Passt auch. Nur die 27pF am Reset-Pin kannste auch weglassen, die sind
im Breadboard schon eingebaut. ;)
Nimm da mal lieber 47nF oder 100nF.
> Steht das hier in deiner Main oder Config?>> #define OUTB 0xFF
Ähm, wofür soll das denn deiner Meinung nach gut sein?
Der Port B wird beim AVR über PORTB, PINB und DDRB gesteuert....
> Ein neuer Mega8 sollte die Boot Reset Fuse nicht gesetzt haben, d.h.> normal beim Reset-Vektor anfangen. In dem Fall musst du deinem Linker(!)> nix sagen.
ja richtig.. der Linker. Für mich aber ein Klickdialog, also mir egal
wers macht :)
> Welche Fusebits hast du denn verstellt? Wie sind sie gesetzt?
ein Bild sagt mehr als... - habs mal attached
> Stichwort Boot Reset Fuse. siehe oben.
Jetzt check ich was du meinst (und was die Doku wohl auch so meint und
ich nich verstanden hab).. Wenn die Fuse gesetzt ist, dann ist die
Reset-Behandlungsroutine bei 0x00, sonst bei sizeof(bootloader)?
>> Taktfuse stimmt>> Stimmt, von hier aus sehen alle 4 Fusebits richtig aus. Könnte aber auch> ein Kratzer in der Kristallkugel sein.
das angehängte Bild ist kratzerfrei.
>> MCU = atmega8>> -DF_CPU=8000000UL>> Passt. Wie includest du den die SFR-Headerdatei?
wissentlich gar nicht. Ist das die die Definitionen für PORTB und Co
enthält?
In meiner Dependency-Liste hab ich eine sfr_defs.h und eine iom8.h.
Ich hab im .lss file mach nachgeschaut. Der Compiler übersetzt
mein
1
DDRB=1<<PB0;
in
1
ldi r24, 0x01
2
out 0x17, r24
0x17 ist DDRB beim atmega8. Die Defines scheinen also zu stimmen
> Passt auch. Nur die 27pF am Reset-Pin kannste auch weglassen, die sind> im Breadboard schon eingebaut. ;)>> Nimm da mal lieber 47nF oder 100nF.
:)
100nF hatte ich auch schonma drin. Hab sie auf 27p geändert wegen
irgendeinem Tip irgendwo hier im Forum. Jetzt sinds wieder 100. Bringen
leider keine Besserung.
> ja richtig.. der Linker. Für mich aber ein Klickdialog, also mir egal> wers macht :)
Benutz das AVR-Studio nich, aber in den meisten Toolchains sind so
Sachen wie Memory-Sections in einem eigenen Linker-Tab versteckt.
Egal...
> ein Bild sagt mehr als... - habs mal attached
Das Bild schaut soweit ok aus.
> Jetzt check ich was du meinst (und was die Doku wohl auch so meint und> ich nich verstanden hab).. Wenn die Fuse gesetzt ist, dann ist die> Reset-Behandlungsroutine bei 0x00, sonst bei sizeof(bootloader)?
Fast. Schau mal in Tabelle 82 im Datenblatt. Da steht wo der
Bootloader-Bereich anfängt. Hängt von den BOOTSZx Fusebits ab.
-> FLASH_END-sizeof(bootloader)
> wissentlich gar nicht. Ist das die die Definitionen für PORTB und Co> enthält?
Jap. Dazu wird allerdings beim GCC / WINAVR nur die "avr/io.h"
eingebunden, der Prozessortyp ergibt sich dann aus einem #define bzw.
dem Compiler-Aufruf.
> Benutz das AVR-Studio nich, aber in den meisten Toolchains sind so> Sachen wie Memory-Sections in einem eigenen Linker-Tab versteckt.> Egal...
Es gibt da einen Dialog mit Memory Segments. Aber keine Ahnung was ich
da eintragen soll oder ob man da überhaupt was eintragen muss.
> Fast. Schau mal in Tabelle 82 im Datenblatt. Da steht wo der> Bootloader-Bereich anfängt. Hängt von den BOOTSZx Fusebits ab.
Hmm da steht bei mir das Timer/Counter Kapitel. Aber egal,
wenn BOOTRST ausgeschaltet ist, dann sollte alles sein wie immer wenn
ich das richtig versteh?
SOmit bräucht ich auch keine Speichersegment-Geschichten.
>> wissentlich gar nicht. Ist das die die Definitionen für PORTB und Co>> enthält?>> Jap. Dazu wird allerdings beim GCC / WINAVR nur die "avr/io.h"> eingebunden, der Prozessortyp ergibt sich dann aus einem #define bzw.> dem Compiler-Aufruf.
ok, die hab ich eingebunden.
Unterm Strich sind mittlerweile alle Fehlermöglichkeiten ausgeräumt.
Hast sonst noch Ideen?
Und gud n8 erstma :)
> Hmm da steht bei mir das Timer/Counter Kapitel. Aber egal,> wenn BOOTRST ausgeschaltet ist, dann sollte alles sein wie immer wenn> ich das richtig versteh?
Nöö, nicht SEITE 82, ich meine Tabelle 82 auf Seite 220 ;)
> Es gibt da einen Dialog mit Memory Segments. Aber keine Ahnung was ich> da eintragen soll oder ob man da überhaupt was eintragen muss.
Nö, im Normalfall nicht.
> Unterm Strich sind mittlerweile alle Fehlermöglichkeiten ausgeräumt.> Hast sonst noch Ideen?
Heut nicht mehr. Werd auch erstmal pennen gehen. ;)
Viel Erfolg trotzdem noch....und nicht vergessen: Ein neuer Tag bringt
neue Ideen....
> Prüf mal ob das Teil wirklich auf PB0 ist. Vielleicht hast du dich> verzählt.
's ist wirklich PB0. Hab extra den genommen weils das äußerste Bein ist
und ich mich nicht verzählen kann..
> Nöö, nicht SEITE 82, ich meine Tabelle 82 auf Seite 220 ;)
oh:) right :)
Was mich da aber wundert.. Die Adresse des Resetvektors ist ja abhängig
von den Fuse Bits. Und der Linker kennt meine Fuses ja nicht. Woher weiß
er wohin er den Code legen soll? Ich wunder mich ob man da nich doch
irgendwo was einstellen muss. Was schreibst du immer ins Makefile um
vorzuschreiben wohin der den Code legen soll? Ich könnt ja mal versuchen
ihn auf 0 zu zwingen.
Andrerseits.. DIe .lss Datei sagt "00000000 <__vectors>:", also schätz
ich mal das sie schon auf 0 liegt
> Viel Erfolg trotzdem noch....und nicht vergessen: Ein neuer Tag bringt> neue Ideen....
Ich bin gespannt ob sich der Tag an diese Regel hält :)
>> Viel Erfolg trotzdem noch....und nicht vergessen: Ein neuer Tag bringt>> neue Ideen....>> Ich bin gespannt ob sich der Tag an diese Regel hält :)
AARGHH! O Gott..
Also manchmal braucht es wohl zwei Tage um die Erkenntnis zu gewinnen...
Ihr macht euch ja kein Bild wieviele Verdrahtungsmöglichkeiten,
Spannungsversorgungen und Programm-, Fuse- und Settings-Alternativen ich
ausprobiert hab - alles ohne Erfolg. Heut hatte ich die Schnauze voll
und wollt wieder meinen bewährten Attiny2313 nehmen - und siehe da -
geht auch nicht..
Immerhin hat mich der 2313er dann auf das Übel aufmerksam gemacht..
Also falls auch mal jemand von euch vor meinem Problem steht:
Dieser bekloppte Flash-Dialog des AVR-Studios schlägt NICHT
standardmäßig das .hex file des aktuellen Projekts vor, sondern das was
man das letzte mal geflasht hatte (auch wenn es zu einem andren Projekt
gehört).
Erschwerenderweise steht diese Textbox am Zeilenanfang, zeigt also
meinen (etwas langen) Verzeichnispfad und nicht den Name des Hexfiles.
Ich hatte die ganze Zeit das Hexfile eines anderen Projekts geflasht...
GRRR!
Verdammte Scheiße.. Backspace Backspace Backspace Backspace Backspace
Backspace Backspace Backspace