mikrocontroller.net

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


Autor: WeißNichtWeiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe ein Problem mit dem ATmega8.
Wenn ich ein einfaches Programm eingebe:
#include <avr/io.h>
 
int main( void )
{
  DDRB = 0xFF;
  PORTB |= (1<<PB0);
}
lauchten immer alle LEDs bis auf die welche eigendlich leuchten soll 
nämlich die LED0.
Bei Blinkerprogrammen wie diesem hier:
#include <avr/io.h>
#include <util/delay.h>


void delay_ms(uint16_t ms)
{
  for(uint16_t t=0;t<=ms;t++)
    _delay_ms(1);
}

int main()
{
  DDRB = 0xFF;
  while (1)
  {
    PORTB |= (1<<PB0);
    delay_ms (250);
    PORTB |= (1<<PB7);
    delay_ms (250);
  }
  return 0;
}
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?

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WeißNichtWeiter schrieb:

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

Autor: Lord Ziu (lordziu)
Datum:

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

Autor: WeißNichtWeiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: WeißNichtWeiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: WeißNichtWeiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs mir durchgelesen und dabei entstand dann folgende Idee:
#include <avr/io.h>
#include <util/delay.h>

int main()
{
  DDRB = 0xFF; //portB als ausgang
  PORTB = 0xFF; //alle LEDs aus 0b11111111
  while (1) //endlosschleife
  {
    PORTB &= 0b11111101; //LED1 an
    _delay_ms (500); //warte 500ms
    PORTB |= 0b00000010; //LED1 aus
    _delay_ms (500); //warte 500ms
  }
  return 0;
}

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: WeißNichtWeiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: WeißNichtWeiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.