Forum: Mikrocontroller und Digitale Elektronik Microcontroller ATmega8 macht nicht was er soll


von WeißNichtWeiter (Gast)


Lesenswert?

Hallo,
ich habe ein Problem mit dem ATmega8.
Wenn ich ein einfaches Programm eingebe:
1
#include <avr/io.h>
2
 
3
int main( 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
void delay_ms(uint16_t ms)
6
{
7
  for(uint16_t t=0;t<=ms;t++)
8
    _delay_ms(1);
9
}
10
11
int main()
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
  return 0;
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?

von Lord Z. (lordziu)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

WeißNichtWeiter schrieb:

> Wenn ich ein einfaches Programm eingebe:
>
1
> #include <avr/io.h>
2
> 
3
> int main( void )
4
> {
5
>   DDRB = 0xFF;
6
>   PORTB |= (1<<PB0);
7
> }
8
>
> 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.

von Lord Z. (lordziu)


Lesenswert?

Wenn du dann wieder einen funktionierenden Controller hast, können wir 
dir bei deinem eigentlichen Programmierproblem helfen.

von WeißNichtWeiter (Gast)


Lesenswert?

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.

von ich (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von WeißNichtWeiter (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von WeißNichtWeiter (Gast)


Lesenswert?

Habs mir durchgelesen und dabei entstand dann folgende Idee:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
int main()
5
{
6
  DDRB = 0xFF; //portB als ausgang
7
  PORTB = 0xFF; //alle LEDs aus 0b11111111
8
  while (1) //endlosschleife
9
  {
10
    PORTB &= 0b11111101; //LED1 an
11
    _delay_ms (500); //warte 500ms
12
    PORTB |= 0b00000010; //LED1 aus
13
    _delay_ms (500); //warte 500ms
14
  }
15
  return 0;
16
}

Sollte doch blinken oder nicht?
Tut es bei mir auf jedenfall nicht...

von Karl H. (kbuchegg)


Lesenswert?

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?

von WeißNichtWeiter (Gast)


Lesenswert?

Das mach ich wie?
Google sagt OPT = -0s;
Das gibt mir aber fehler aus:
../bg.c:6: error: 'OPT' undeclared (first use in this function)

von Karl H. (kbuchegg)


Lesenswert?

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.

von WeißNichtWeiter (Gast)


Lesenswert?

Danke Danke Danke es blinkt :)
Vielen herzlichen Dank für eure super gute hilfe und das Verständnis für 
einen anfänger wie mich.

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.