Hallo,
ich habe ein Problem mit dem ATmega8.
Wenn ich ein einfaches Programm eingebe:
1
#include<avr/io.h>
2
3
intmain(void)
4
{
5
DDRB=0xFF;
6
PORTB|=(1<<PB0);
7
}
lauchten immer alle LEDs bis auf die welche eigendlich leuchten soll
nämlich die LED0.
Bei Blinkerprogrammen wie diesem hier:
1
#include<avr/io.h>
2
#include<util/delay.h>
3
4
5
voiddelay_ms(uint16_tms)
6
{
7
for(uint16_tt=0;t<=ms;t++)
8
_delay_ms(1);
9
}
10
11
intmain()
12
{
13
DDRB=0xFF;
14
while(1)
15
{
16
PORTB|=(1<<PB0);
17
delay_ms(250);
18
PORTB|=(1<<PB7);
19
delay_ms(250);
20
}
21
return0;
22
}
leuchtet die LED0 und sonst passiert garnichts.
Ich dachte das liegt evt an den Fuses und hab mal verschiedene
Frequenzen ausprobiert. Allerdings bekomme ich jetzt nichtmehr den
Standwert gesetzt welcher folgender war: "Ext. Crystal/Resonator High
Freq.; Start-up time: 16K CK + 64 ms;[CKSEL=1111 SUT=11]"
Es kommt immer wenn ich diesen Wert anwähle und auf 'Programm' klicke
"A problem occured when executing the commend. See the command output
for more info.
The Troubleshooting section in the help system contains more information
on what may have caused the problem. To open the help system, click the
Help button below.
Quick Tips: Verify that the device is playced in the correct socket, and
that the ISP cable is properly connected. Check that the ISP programming
frequency specified on the 'Board' page is well below 1/4 of the clock
frequency of the device. Extra precaution should be made when using the
CKDIV fuse and/or Clock Prescaler Register (CLKPR) on part supporting
this."
Ist natürlich auf dem richigen Sockel und das Kabel steckt auch.
Programmieren hat ja vorher auch funktioniert.
'Erase Device' funktioniert auch nichtmehr.
Kann mir irgendjemand bei einem der Probleme bitte helfen?
Du kannst den Controller also nicht mehr löschen und neu beschreiben?
Dann lies mal diesen Artikel: AVR Fuses
Vielleicht bekommst du den µC wieder hin. Vielleicht auch nicht. Wenn
nicht, dann solltest du den Artikel auch komplett lesen. Da steht
nämlich, warum du ihn abgeschossen hast.
> lauchten immer alle LEDs bis auf die welche eigendlich leuchten soll> nämlich die LED0.
Das liegt höchst wahrscheinlich daran, dass deine LED so angeschlossen
sind, dass sie bei einer 0 am Ausgabeport leuchten und bei einer 1 nicht
leuchten.
> Bei Blinkerprogrammen wie diesem hier:
Das ist kein Blinkprogramm.
Dein Programm schaltet immer nur Pins auf 1 aber nie wieder denselben
Pin auf 0
> leuchtet die LED0 und sonst passiert garnichts.
Das ist nicht logisch.
Weiter oben hat deine LED an 0 nicht gebrannt, als du den Port Ausgang
auf 1 gesetzt hast. Hier leuchtet sie plötzlich, wenn du den Pin auf 1
setzt.
Logisch passiert da nichts weiter.
Du kannst stundenlang den Lichtschalter einschalten (aber nicht wieder
aus). Das Licht wird deswegen immer weiterbrennen. Für jemandem vor dem
Haus sieht es dann so aus, als ob nichts weiter passiert. Das du das
Licht immer nur einschaltest (aber nie aus) sieht er ja nicht.
> Ich dachte das liegt evt an den Fuses und hab mal verschiedene> Frequenzen ausprobiert.
Was genau hast du als letztes bei den Fuses ausprobiert?
Wenn du Glück hast, hast du nur die Taktfrequenz des internen
RC-Oszillators soweit runtergedreht, dass die ISP Programmierfrequenz
jetzt zu hoch ist.
Danke Lord dein Artikel war sehr hilfreich. Zumindest weiß ich jetz
woran es liegt.
> Das liegt höchst wahrscheinlich daran, dass deine LED so angeschlossen sind,> dass sie bei einer 0 am Ausgabeport leuchten und bei einer 1 nicht> leuchten.
Geht leider nicht. Es handelt sich um ein STK500 board da kann ich
nichts selbst falsch anschließen.
> Das ist nicht logisch.> Weiter oben hat deine LED an 0 nicht gebrannt, als du den Port Ausgang> auf 1 gesetzt hast. Hier leuchtet sie plötzlich, wenn du den Pin auf 1> setzt.
Das hat mich eben auch gewundert, aber es ist so. Und immer wenn ich auf
Program geklickt habe, haben die LEDs 5,6,7 geleuchtet und sind mit
abgeschlossener Programmierung wieder ausgegangen bzw. die restlichen
noch an. (Ja ich habe vorher immer Erased.)
Momentan leuchtet nur die LED0, da ich das "Blinkprogramm" drin habe und
immer wenn ich auf Fuses klicke in dem Programfenster blinken kurz LED
5,6,7 und dann leuchtet wieder LED0.
> Das ist kein Blinkprogramm.
Hmm ich bin seit gestern dabei das zu lernen und hab dazu ein Buch in
dem das Programm so drinsteht und da steht drüber: "Es sollten die
beiden LEDs an PB0 und PB7 abwechselnd blinken."
> Was genau hast du als letztes bei den Fuses ausprobiert?
Jetzt steht er bei:
Int. RC 0sc. 1MHz;Start-up time: 6CK +0ms;[CKSEL=0001 SUT=00]
und da komme ich nichtmehr raus, da er sich nichtmehr Programmieren
lässt.
Da du STK500 verwendest, leuchtet die LED, wenn du in den Port eine 0
reinschreibst.
Wie schon oben von WeißNichtWeiter geschrieben, ist das kein
Blinkprogramm,was du da hast.
Hi
>Geht leider nicht. Es handelt sich um ein STK500 board da kann ich>nichts selbst falsch anschließen.
Beim STK500 leuchten die LEDs bei L.
MfG Spess
WeißNichtWeiter schrieb:>> Das ist kein Blinkprogramm.> Hmm ich bin seit gestern dabei das zu lernen und hab dazu ein Buch in> dem das Programm so drinsteht und da steht drüber: "Es sollten die> beiden LEDs an PB0 und PB7 abwechselnd blinken."
Dann hat das Buch entweder einen Fehler oder du hast beim Abtippen nicht
genau genug geschaut. Nicht alles was wie ein | aussieht ist auch eines.
Manchmal ist es auch ein ^
Und genau das macht den Unterschied.
> Jetzt steht er bei:> Int. RC 0sc. 1MHz;Start-up time: 6CK +0ms;[CKSEL=0001 SUT=00]> und da komme ich nichtmehr raus, da er sich nichtmehr Programmieren> lässt.
Wenn du die Fuses noch umstellen kannst, dann dreh sie zurück auf 8Mhz
Wenn nicht, dann such dir die ISP Programmierfrequenz und nimm die
kleinste Einstellung, die du finden kannst. Und dann drehst du die
Taktfrequenz wieder auf 8Mhz hoch.
Und für die Zukunft merkst du dir: Nicht alle Programmfehler, die du
verbrichst, lassen sich durch umstellen der Taktfuses lösen. Genau
genommen sind es sogar die wenigsten Probleme, die man auf die Art lösen
kann.
WeißNichtWeiter schrieb:> Das hat mich eben auch gewundert, aber es ist so. Und immer wenn ich auf> Program geklickt habe, haben die LEDs 5,6,7 geleuchtet und sind mit> abgeschlossener Programmierung wieder ausgegangen bzw. die restlichen> noch an. (Ja ich habe vorher immer Erased.)
Was während des Programmiervorgangs passiert, ist komplett
uninteressant, solange nur das Programm korrekt übertragen wird. An
irgendwelchen Pins muss ja auch das Programm in den µC flutschen. Und
wenn man an genau diese Pins ein paar LED anhängt, dann sieht man eben
wie sich der Programmer mit dem µC unterhält.
Für dich ist nur interessant, was passiert, nachdem das Programm
komplett übertragen wurde.
WeißNichtWeiter schrieb:>> Das ist kein Blinkprogramm.> Hmm ich bin seit gestern dabei das zu lernen und hab dazu ein Buch in> dem das Programm so drinsteht und da steht drüber: "Es sollten die> beiden LEDs an PB0 und PB7 abwechselnd blinken."
sicher das in dem Buch nicht
PINB |= (1<PB0)
oder
PORTB ^= (1<PB0)
stand?
WeißNichtWeiter schrieb:> Ich dachte das liegt evt an den Fuses und hab mal verschiedene> Frequenzen ausprobiert.
Ganz unsinnige Idee.
Warum sollte eine andere CPU-Geschwindigkeit Deine Programmfehler
beseitigen?
Wenn Du nicht weißt, was Du als letztes probiert hast, mußt Du den
parallel Programmiermodus verkabeln und benutzen.
Peter
Wow danke für die vielen Antworten. Das sieht man selten das in einem
Forum so viele Antworten in einer Stunde geschrieben werden.
Also wenn ich den ISP Takt runterdreh auf 1,206KHz dann kann ich
zumindest wieder die Fuses ändern und erasen.
Dann hab ich die Fuses so eingestellt wie es
http://www.engbedded.com/fusecalc sagt und ISP wieder auf
460,8KHz....Erase....OK.....Program....failure.
ISP auf 1,206KHz....Program...OK....leave programing mode....failure.
ISP auf 115,2KHz geht alles. Komisch aber es funktioniert jetzt wieder.
Dank euch.
Werde jetzt mal an dem script probieren zwecks ^ und |.
Muss ich jetzt etwa wenn ich sage DDRB = 0xFF; alle ausgänge erst
ausschalten indem ich sie auf 1 setze bevor ich sie "richtig verwenden"
kann?
WeißNichtWeiter schrieb:> ISP auf 115,2KHz geht alles. Komisch aber es funktioniert jetzt wieder.
Das ist das wichtigste.
Hauptsache du bist wieder im Rennen
> Werde jetzt mal an dem script probieren zwecks ^ und |.
Nicht probieren.
Kauf dir ein C Buch oder sieh in deinem Skript nach, ws es zum Thema
Bitmanipulationen zu sagen hat.
Es hat doch keinen Sinn, wenn du Zeichen für Zeichen abmalst und nicht
weißt, was sie bedeuten.
http://www.mikrocontroller.net/articles/Bitmanipulation
Auch die ersten paar Kapitel vom Gcc-Tutorial
AVR-GCC-Tutorial
sind als Ergänzung zu deinem Skript sicherlich hilfreich.
> Muss ich jetzt etwa wenn ich sage DDRB = 0xFF; alle ausgänge erst> ausschalten indem ich sie auf 1 setze bevor ich sie "richtig verwenden"> kann?
Nein.
WeißNichtWeiter schrieb:> Sollte doch blinken oder nicht?
Ja, das sollte blinken. Ob es tatsächlich mit 1 Hz blinkt oder nicht,
sei erst mal dahingestellt. Aber selbst wenn es mit der 8-fachen
Frequenz blinkt, sind das erst 8 Hz und das flackern würdest du nicht
übersehen können.
> Tut es bei mir auf jedenfall nicht...
Dann hast du wohl ein Hardware Problem irgendwo.
Das Programm hast du schon mal vom µC wieder auslesen lassen, bzw. beim
Programmieren den Verify dabei. Nur so, um sicherzugehen, dass es auch
richtig gebrannt wurde.
Ach, da fällt mir noch was ein.
Da du _delay_ms verwendest: Die Optimierung des Compilers ist auf -Os
gestellt?
Du verwendest AVR-Studio?
Menüpunkt "Project" / "Configuration Options"
Im Dialog unten die Optimierungsstufe auswählen.
Und wenn du schon dabei bist, schreibst du bei Taktfrequenz auch noch
8000000 (für 8Mhz) rein, oder was du dann auch immer über die Fuses
eingestellt hast.
Und du kontrollierst auch gleich noch, ob in diesem Dialog der richtige
µC bei "Device" eingestellt ist.