Forum: Mikrocontroller und Digitale Elektronik ATmega16 ext. Quarz lässt sich nicht einstellen


von Flo K. (flo86)


Lesenswert?

Hi @ all,
seit einigen Wochen versuche ich vergeblich meinen ATmega16 auf externen 
Quarz einzustellen. Bin momentan auf den Atmega16L umgestiegen, weil ich 
von dem Anderen keine mehr hatte.
Ich weiß das Thema Fuse-Bist kommt hier regelmäßig und viele werden 
vermutl. genervt wenn ich schon wieder damit anfange, aber ich habe 
folgendes Problem:
Ich möchte meinen µC mit externen Quarz laufenlassen, die Fusebits habe 
ich mir anhand des Datenblattes ermittelt und mit dem Fuse Calculator 
hier aus dem Forum bestätigt. Zum Proggen benutze ich Ponyprog. Das 
auslesen der Fusebits funktioniert, sobald ich diese entsprechend 
schreiben möchte kommt die bekannte Fehlermeldung: "Device missing or 
unknown device (-24)"
Danach kann ich weder die Fusebits auslesen noch den Quellcode 
aufspielen, jedes mal kommt die selbe Fehlermeldung.
Zum Testen habe ich den µC mal mit dem internen RC Oscillator laufen 
lassen, die Fusebits dafür konnte ich entsprechend einstellen!

Aus anderen Berichten zu dem Thema habe ich erfahren, dass es teilweise 
Problem gab wenn man einen Quarz > 8 MHz verwendet hat, aber das habe 
ich auch schon ausprobiert, ohne Erfolg.

Jetzt weiß ich nicht mehr weiter was ich noch versuchen könnte. Ich 
brauche den externen Takt, da beim Senden und Empfangen über UART am 
Hyperterminal nur blödsinn ankommt, sofern ich den µC mit dem internen 
Oscialltor laufen lasse.

Ich hoffe ihr könnt mir weiterhelfen.

von Peter R. (pnu)


Lesenswert?

Welche Frequenz hat denn der Quarz? Ist es eine baudrate-Frequenz oder 
eine mit ganzzahligen MHz? sind die USART-Register auf diese Frequenz 
eingestellt? (siehe Datenblatt)

Ist die Bedingung fISP < 1/4 ftakt beim Programieren erfüllt, dabei auch 
den prescaler des Oszillators beachten?

über 8MHz sind halt für den Kontroller schon "high frequency". Wenn dann 
die Oszillatorbeschaltung so am Rande des Dimensionierungsbereichs 
liegt, kanns schon soweit kommen, dass die Schaltung nicht schwingt.
Man sollte daher die fuse für "full swing" (CKOPT) setzen, um den 
Oszillator auf volle Schwingfreudigkeit zu bringen.

Es ist auch möglich, den internen RC-Oszillator so zu adjustieren, dass 
die Übertragung mit RS232 klappt (Da muss fsoll bis auf wenige Prozent 
genau sein).

Dass sich ein verfuster atmega16 mit Fremdtakt wieder zugänglich machen 
lässt, ist Dir bekannt?

von Flo K. (flo86)


Lesenswert?

Mit diesen Quarzen: 11.0592 MHz; 9.216 MHz und 7.3725 MHz habe ich es 
jeweils probiert.
Die USART-Register sind folgendermaßen gesetzt:

#ifndef F_CPU
#define F_CPU 7372800L
#endif
#define BAUD 9600L
#define ubrr ((F_CPU+BAUD*8)/(BAUD*16)-1)

 //############# Initialisierung der µC-Hardware #######################

static void hardwareInit(void)
{


    //Festlegen der Baud Rate High & Low
  UBRRH = (unsigned char)(ubrr>>8);
    UBRRL = (unsigned char)ubrr;

   //Einschalten Receiver und Transmitter
    UCSRB = (1<<RXEN)|(1<<TXEN);

    /* Set frame format: 8data, 1stop bit */
    UCSRC = (1<<URSEL)|(3<<UCSZ0);
...
}

//##################### Empfangen und Senden per USART 
##################
int receiveData(char Zufallszahl)
{
  //Empfangen der gewuenschten Stimulation
  while ( !(UCSRA & (1<<RXC)) );    //warte auf daten
  return UDR;      //gibt daten aus buffer wieder
}

int transmitData(char senden)
{
  while ( !(UCSRA & (1<<UDRE)) );  //warte bis transmit-buffer leer
  UDR = senden;  //daten in transmit-buffer und senden der daten
}
int main(int argc, char *argv[])
{

  hardwareInit();
     while (1)
  {
       receiveData(Zufallszahl);
       empfangen = atoi (UDR);
       itoa (empfangen, senden, 10);
       transmitData(senden);
        }
        return 0;
}

Über 8 MHz hab ich die Fuses als ext.Crystal high freq. eingestellt, 
bzw. wollte ich. Sowohl mit als auch ohne CKOPT. Aber es kam jedes mal 
die Fehlermeldung s.o.

Ja ich weiß das ich die µC mit Fremdtakt zurück ins Leben holen kann.

Das mit fISP habe ich nicht bedacht, werde es aber direkt mal 
ausprobieren. Hab dafür die Einstellung bei PonyProg: SPIBusSpeed=NORMAL 
auf LOW gestellt.

Was meinst du mit fSoll bis auf wenige % genau sein?

von Flo K. (flo86)


Lesenswert?

Also fISP < 1/4 fCPU hat auch keinen Erfolg gebracht.
Den Code kann ich, wie auch vorher schon, übertragen, aber sobald ich an 
die Fuses gehe kommt wieder die Fehlermeldung.

von Jens (Gast)


Lesenswert?

Bei PonyProg gibt es eine Kästchen mit Calibrieren und Synchrinisieren 
glaube ich. Hast du das gemacht? Damit wird der Computer auf den 
Prozessortakt abgeglichen.
Und du kannst deine Verbindung schon vor dem Zugriff auf den Controller 
testen. Hast du das schon versucht?

Gruß

von Flo K. (flo86)


Lesenswert?

Ich habe jetzt versucht mit ext. Quarzoscillator die µCs zurück ins 
Leben zu holen. PonyProg erkennt den µC wieder und ich kann die 
Fuse-bits auslesen. Wenn ich diese allerdings dann auf ext. 
Quarzoscillator stellen möchte kommt erneut die Fehlermeldung!

von Jens (Gast)


Lesenswert?

Bei PonyProg sind alle Fuses invertiert! Versuch das mal genau anders 
herum. Das hat mich auch verwirrt!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Flo K. schrieb:
> Wenn ich diese allerdings dann auf ext.
> Quarzoscillator stellen möchte kommt erneut die Fehlermeldung!

Welche Werte für die Fuses schreibst Du denn? An welchen Pins hängt der 
Quarz, welche Werte haben die beiden Kondensatoren am Quarz? Hast Du die 
Verbindungen µC -> Quarz -> Kondensatoren geprüft?

von Flo K. (flo86)


Lesenswert?

Jepp Calibration mache ich jedes mal.
Und Probe funzt auch.

von Flo K. (flo86)


Lesenswert?

Der Quarz hängt an XTAL1&2 mit jeweils 22pF. Das kann man ja direkt so 
aus dem Datenblatt übernehmen.

Die Fuses für ext. Quarz:
High: 0110 0110
Low:  0000 0000

Fuses für ext. Oscillator:
High: 0110 0110
Low:  0001 1111

[0=unprogrammed; 1=programmed]

von Jens (Gast)


Lesenswert?

und welche nimmst du jetzt? Die für Quarz oder für den Oszillator?

von Flo K. (flo86)


Lesenswert?

Aktuell den für Oscillator, da ich den auch grad dran hab.
Aber ich habe beide ausprobiert und immer das selbe Problem.
Mit Quarz und entsprechenden Fuses und auch mit Osicllator

von Jens (Gast)


Lesenswert?

Ich hab grad bei meinem mega16 die Register ausgelesen.
bei 16MHz steht:
HIGH: 0x19
LOW: 0xFF

Versuch die mal!

von Karl H. (kbuchegg)


Lesenswert?

Flo K. schrieb:
> Der Quarz hängt an XTAL1&2 mit jeweils 22pF. Das kann man ja direkt so
> aus dem Datenblatt übernehmen.
>
> Die Fuses für ext. Quarz:
> High: 0110 0110
> Low:  0000 0000
>
> Fuses für ext. Oscillator:
> High: 0110 0110
> Low:  0001 1111
>
> [0=unprogrammed; 1=programmed]

Und was stellst du im PonyProg ein?
Machst du ein Häkchen oder machst du keines bei den CKSEL Bits?

Bei PonyProg ist alles invertiert! Wenn du laut Datenblatt also 
rausbekommst, dass du lauter 0 bei CKSEL einstellen musst, dann heißt 
das das du im Dialog die Häkchen setzen musst. Und umgekehrt.

von Flo K. (flo86)


Lesenswert?

Ja ich kenne das Problem von PonyProg. Ich habe mich bevor ich mit den 
Fuses anfing hab ich mich hier im Forum schlau gemacht. So wie ich das 
oben angegeben hab entspricht die 1 einem Häkchen und 0 kein Häkchen.

von Jens (Gast)


Lesenswert?

Deine Werte stimmen nich!

Siehe oben!

von Karl H. (kbuchegg)


Lesenswert?

Flo K. schrieb:
> Ja ich kenne das Problem von PonyProg. Ich habe mich bevor ich mit den
> Fuses anfing hab ich mich hier im Forum schlau gemacht. So wie ich das
> oben angegeben hab entspricht die 1 einem Häkchen und 0 kein Häkchen.

In der Zeit, in der ich noch mit Pony gebrannt habe, hab ich das so 
gemacht:

Ich hab mir das Datenblatt geschnappt und hab mir angesehen welches 0/1 
Muter der Atmel-Einstellung entspricht, so wie der µC geliefert wird.
Ich weiß ja, dass der mit 1Mhz internem Oszi daherkommt.

Also schau ich mir das im Datenblatt an, lese die Fusebits aus und schau 
nach, wie sich diese Datenblatt Einstellung im Fusedialog präsentiert 
(was ist 0, was ist 1). Und erst dann, als ich das entschlüsselt habe, 
hab ich mir die gewünschte Einstellung zusammengesucht und dann die 
Häkchen danach gestellt.
Ich hab von Anfang an keinen einzigen µC je verfust.

von Flo K. (flo86)


Lesenswert?

Wieso stimmen meine Werte nicht?

Ich hab mich auch sehr intensiv mit dem Datenblatt beschäftigt und 
anschließend meine Einstellungen noch mit dem Fuse Calculator überprüft 
und kam auf das selbe

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Flo K. schrieb:
> Ja ich kenne das Problem von PonyProg. Ich habe mich bevor ich mit den
> Fuses anfing hab ich mich hier im Forum schlau gemacht. So wie ich das
> oben angegeben hab entspricht die 1 einem Häkchen und 0 kein Häkchen.
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Lies nochmal Beitrag von Karl Heinz:

0 = Häkchen
1 = kein Häkchen

Also umgekehrt wie Du das geschrieben hast.

von Michael U. (amiga)


Lesenswert?

Hallo,

richtig, PonyProg macht es so wie es im AVR-Datenblatt steht (stand?).

1 unprogrammed, 0 programmed. Haken -> programmiert -> 0

Es wird eben das übliche Verhalten einer EPROM-/Flashzelle angenommen 
und da ist gelöscht -> unprogrammiert eben 1

Gruß aus Berlin
Michael

von Matthias (Gast)


Lesenswert?

Flo K. schrieb:
> Wenn ich diese allerdings dann auf ext.
> Quarzoscillator stellen möchte kommt erneut die Fehlermeldung

Warum versuchst du, das Ding auf ext. Quarzoszillator zu stellen, obwohl 
du einen Quarz angeschlossen hast?

von Flo K. (flo86)


Lesenswert?

Also jetzt nochmal ganz langsam:
Laut Datenblatt Tabelle 2 gilt:
External Clock (Quarzoscillator):   0000 CKSEL3..0
External Crystal (Quarz): 1111 CKSEL3..0

dabei gilt: [1=unprogrammed; 0=programmed]

Wie ihr schon sagt ist das bei PonyProg anders, was bedeuten würde:
External Clock (Quarzoscillator):   1111 CKSEL3..0 also 4 Häkchen
External Crystal (Quarz): 0000 CKSEL3..0 also kein Häkchen

Demnach müsste ich es doch richtig gemacht haben oder???

@ Matthias: Ich hab den Quarz abgeklemmt weil ich es mal mit dem 
Quarzoscillator testen wollte. Aber wie gesagt auch ohne Erfolg.

von Flo K. (flo86)


Lesenswert?

Ich habe alles nochmals verglichen und bin der Meinung das meine 
Einstellungen korrekt sind.
Und dennoch erscheint die Fehlermeldung.
Nur wenn ich auf internal Oscialltor stelle klappt es.

von Flo K. (flo86)


Lesenswert?

Peter R. schrieb:
> Es ist auch möglich, den internen RC-Oszillator so zu adjustieren, dass
> die Übertragung mit RS232 klappt (Da muss fsoll bis auf wenige Prozent
> genau sein).

Wie kann ich denn den internen RC-Oszillator so adjustieren, das die 
Übertragung funktioniert?
Bzw. hat jemand ein Idee warum PonyProg so Probleme mit den Fuses hat?

von Flo K. (flo86)


Lesenswert?

Zur Programmierung benutze ich das Parallele-Interface für AVR und 
PonyProg:
http://s-huehn.de/elektronik/avr-prog/avr-prog-alt.htm

Kann das Problem damit zusammenhängen?

von Flo K. (flo86)


Lesenswert?

Quarz läuft jetzt endlich, aber ich empfange im HTerm weiterhin nur 
Blödsinn. Woran kann das denn noch liegen?

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.