Forum: Mikrocontroller und Digitale Elektronik Interner Oszillator genutzt statt Quarzoszillator ?


von Christophe S. (cschmol)


Lesenswert?

Hallo,
Ich bin gerade dabei, mit UART und der seriellen Schnittstelle 
rumzuspielen am Atmega8.
Ich habe aber das Problem, dass der AVR als Taktsignal den internen 1MHz 
Oszillator nimmt, statt dem externen Quartz.

Die Fuses habe ich richtig gesetzt

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D9

Den Oszillator habe ich auch richtig angeschlossen.
Ich nutze einen 14.7456 MHz Quartz.

Danke für eure Hilfe.

von Kevin K. (nemon) Benutzerseite


Lesenswert?

Das glaube ich nicht, dass der Mega einen Teil aus dem externen Quarz 
und einen Teil aus dem internen Oszillator speist. Wie bist du denn 
darauf gekommen / wie hast du das gemessen?

von Christophe S. (cschmol)


Lesenswert?

Gemessen habe ich es mit diesem Programm und einem Oszilloskop.
Das Ausgangssignal ändert mit jede us den Pegel.

#include <avr/io.h>
#define BAUD 9600
#include <util/setbaud.h>

int main() {

        DDRB |= (1<<PB0);

while(1) {

        PORTB ^= (1<<PB0);
}

        return 0;

}

von g457 (Gast)


Lesenswert?

> Das Ausgangssignal ändert mit jede us den Pegel.

Wie compiliert? Mit ohne Optimierungen klingt das plausibel.

Besser(tm) macht man das übrigens mit einem der Timer (mit Pinwackeln in 
Hardware, behelfsweise in einer ISR).

von Rudolph (Gast)


Lesenswert?

Und das Compilat dazu sieht wie aus?

Wenn das ohne Optimierungen compiliert ist kann so eine 
Read-Modify-Write Operation schonmal diverse Taktzyklen dauern.

von Egon R. (egon_r35)


Lesenswert?

hfuse auf C9 setzen, dann noch einmal testen.

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

》 Ich nutze einen 14.7456 MHz Quartz.

Quarz oder Oszillator ?

von Rene T. (Gast)


Lesenswert?

Mach ein LEd blinken und dann nimm das Quarz ab..leibt die LED 
stehen..arbeitet das Quarz und alles ist gut...anders...Du hast die 
Fuses falsch..

von Christophe S. (cschmol)


Lesenswert?

Ich habe auf Grösse optimiert (-Os).
Ich habs jetzt nicht mit timer gemacht, weil ich dachte, das hier wäre 
leichter, um mal schnell die Frequenz zu überprüfen.
Hfuse auf c9 setzen hat auch nichts gebracht, Pin toggelt immer noch 
jede us.
Ich nutze einen Quartz, den ich an XTAL1 und XTAL2 angeschlossen habe 
mit jeweils 22p kerKo nach Masse.
Komisch, der Quarz scheint schon zu arbeiten, denn das Pin toggeln hört 
auf, sobald ich den Quarz entferne.
Die Frequenz ist bloss die Falsche.

von Thomas E. (thomase)


Lesenswert?

Christophe Privat schrieb:
> Komisch, der Quarz scheint schon zu arbeiten, denn das Pin toggeln hört
> auf, sobald ich den Quarz entferne.
> Die Frequenz ist bloss die Falsche.

Dann miss deine Frequenz vernünftig.
1
int main(void)
2
{
3
  DDRB |=  (1 << PB0);
4
5
  while(1)
6
  {
7
    PORTB ^= (1 << PB0);
8
    _delay_ms(500);
9
  }
10
}

Blinkt im Sekundentakt. Kannst du mit der Armbanduhr stoppen.

mfg.

von Christophe S. (cschmol)


Lesenswert?

Hmm, da kommt das Richtige raus...
Danke, aber ich verstehe immer noch nicht, wo vorher der Fehler war.

von Thomas E. (thomase)


Lesenswert?

Christophe Privat schrieb:
> Hmm, da kommt das Richtige raus...
> Danke, aber ich verstehe immer noch nicht, wo vorher der Fehler war.

In deiner falschen Erwartung.

> while(1) {
>
>         PORTB ^= (1<<PB0);
> }

Die Schleife braucht ein paar Takte zum Durchlauf. Deshalb setzt man ein 
Delay rein. Damit spielen diese Takte prozentual keine Rolle mehr.

mfg.

: Bearbeitet durch User
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.