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.
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?
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; }
> 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).
Und das Compilat dazu sieht wie aus? Wenn das ohne Optimierungen compiliert ist kann so eine Read-Modify-Write Operation schonmal diverse Taktzyklen dauern.
hfuse auf C9 setzen, dann noch einmal testen.
》 Ich nutze einen 14.7456 MHz Quartz. Quarz oder Oszillator ?
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..
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.
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.
Hmm, da kommt das Richtige raus... Danke, aber ich verstehe immer noch nicht, wo vorher der Fehler war.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.