Forum: Mikrocontroller und Digitale Elektronik Atmega8 startet nicht


von Steve K. (kreidel)


Lesenswert?

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
int main(void){
2
   DDRB = 1 << PB0;  //B.0 auf Ausgang
3
   PORTB = 1;        //B.0 auf High
4
   while(1);
5
   return 0;
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

von spess53 (Gast)


Lesenswert?

Hi

>Die Doku sagt das der nen Bootloader hat.

Wo steht das? Wäre mir neu.

> Muß man den anders programmieren?

Nein.

MfG Spess

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Geht das Programmiern oder wird das Programm einfach nur nicht 
ausgeführt?

von Analog (Gast)


Lesenswert?

Reset mit Pullup auf VDD ?

von Steve K. (kreidel)


Lesenswert?

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.

von Hannes (Gast)


Lesenswert?

Den Pullup auf Reset braucht man nicht.

von Hmm... (Gast)


Lesenswert?

> 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?

von Hmm... (Gast)


Lesenswert?

@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.

von Steve K. (kreidel)


Angehängte Dateien:

Lesenswert?

> 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

von Hmm... (Gast)


Lesenswert?

> 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.

von Hobbyloet (Gast)


Lesenswert?

Steht das hier in deiner Main oder Config?

#define OUTB     0xFF

von Hmm... (Gast)


Lesenswert?

> 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....

von Steve K. (kreidel)


Angehängte Dateien:

Lesenswert?

> 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.

von Hmm... (Gast)


Lesenswert?

> 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.

von Steve K. (kreidel)


Lesenswert?

> 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 :)

von Gast (Gast)


Lesenswert?

Prüf mal ob das Teil wirklich auf PB0 ist. Vielleicht hast du dich 
verzählt.

von Hmm... (Gast)


Lesenswert?

> 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....

von Steve K. (kreidel)


Lesenswert?

> 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 :)

von Steve K. (kreidel)


Lesenswert?

>> 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

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.