Forum: Mikrocontroller und Digitale Elektronik Probleme mit Taktung AVR


von Jonas S. (j0s)


Lesenswert?

Hey Leute,

ich brauche eure Hilfe.
Nach einer längeren Pause habe ich mich wieder an ein neues 
Mikrocontrollerprojekt gewagt. Jetzt wollte ich mit den Basics anfangen, 
doch leider bekomme ich es scheinbar nicht mal gebacken eine einfache 
LED im Sekundentakt blinken zu lassen.

Mir ist leider mein Oszilloskop beim Umzug kaputt gegangen, sonst könnte 
ich den genauen Takt bestimmen. Ich habe aber über mein Handy eine 
Stoppuhr laufen lassen und konnte schon nach etwa sechs-mal-LED-blinken 
feststellen, dass die LED definitiv nicht annähernd im Sekundentakt 
blinkt. (Daher schließe ich aus, dass es an der Ungenauigkeit des 
internen Quarzes liegt)
Normalerweise sollte der interne Quarz von Werk aus mit 1Mhz takten 
(8Mhz mit CKDIV8 FuseBit gesetzt --> 1Mhz) oder? Leider blinkt die LED 
nicht annähernd im Sekundentakt. Auch nach anschließen eines externen 
Quarzes (8Mhz mit 2x22pF zu GND; CKDIV8 FuseBit gesetzt --> 1Mhz; 
SUT_CKSEL FuseBit auf Extern gestellt) blinkt die LED nicht annähernd im 
Sekundentakt. Das heißt ich kann den Fehler beim Quarz ausschließen. Nur 
wo liegt dann der Fehler? Habe auch anstatt der delays versucht das 
Problem mit Timern zu lösen - leider auch erfolglos. Habe auch schon 
einen anderen Controller vom selben Typ (Attiny2313A-PU) auf das Board 
gesteckt - auch ohne Erfolg. Nachstehend noch ein paar Infos. Ich hoffe 
ihr könnt mir helfen. Danke schon mal!

Controller: Attiny2313A-PU
Programmer: AVR Dragon in SPI mode
Nutze noch AVR-Studio 4

PINBELEGUNG: siehe Datenblatt (http://www.atmel.com/images/doc2543.pdf)
PIN01: RESET zu AVR Dragon
PIN10: GND
PIN12 (PINB0): LED mit Widerstand zu GND
PIN17: MOSI
PIN18: MISO
PIN19: SCK
PIN20: VCC mit 100nF zu GND

MEIN CODE:
1
#include <avr/io.h>
2
#define F_CPU 1000000UL
3
#include <util/delay.h>
4
int main(void)
5
{
6
  DDRB |= 1<<PINB0;
7
  while(1)
8
  {
9
    PORTB |= 1<<PINB0;
10
    _delay_ms(1000);
11
    PORTB &= ~(1<<PINB0);
12
    _delay_ms(1000);
13
  }
14
}

von Frank (Gast)


Lesenswert?

Mit was blinkt es denn dann?
Zähle mal die Anzahl blinken pro Minute.

von Jonas S. (j0s)


Lesenswert?

Es funktioniert endlich! Ich bin super erleichtert! Habe nochmal einen 
anderen externen Quarz angeschlossen. Der Quarz den ich davor 
angeschlossen hatte tickt wohl nicht mehr ganz richtig ;)

Ich finde die Ungenauigkeit des internen Quarzes ziemlich hoch, ist das 
normal?
In 5 Minuten wechselte die LED 288 mal ihren Zustand (an/aus) mit dem 
internen Oszillator. Normalerweise sollte sie 5Min x 60/Min=300 mal 
ein/aus schalten. Das ergibt eine Abweichung von 4% (bei 1Mhz immerhin 
40000Hz) Ist der interne Oszillator wirklich so ungenau?

von Falk B. (falk)


Lesenswert?

@  Jonas S. (j0s)

>Ich finde die Ungenauigkeit des internen Quarzes ziemlich hoch, ist das
>normal?

Es gibt keinen internen Quarz, nur einen internen RC-Oszillator.

>In 5 Minuten wechselte die LED 288 mal ihren Zustand (an/aus) mit dem
>internen Oszillator. Normalerweise sollte sie 5Min x 60/Min=300 mal
>ein/aus schalten. Das ergibt eine Abweichung von 4% (bei 1Mhz immerhin
>40000Hz) Ist der interne Oszillator wirklich so ungenau?

Ja. Kann man aber kalibrieren.

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment#Erg.C3.A4nzende_Hinweise_zur_Taktversorgung_.28kann_.C3.BCbersprungen_werden.29

von Jonas S. (j0s)


Lesenswert?

Danke Falk, das habe ich gesucht!

Hatte nach Quarz gesucht und konnte es hier nicht finden:
https://www.mikrocontroller.net/articles/Quarze_und_AVR

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.