Forum: Mikrocontroller und Digitale Elektronik Wie schnell blinkt die Led


von xBlinker (Gast)


Lesenswert?

Hallo
Ich versuche gerade herauszufinden wie schnell meine Led blinkt... Also 
ich verwende aus dem Pollin Board den ATmega8 an dem ein Quarz 
angeschlossen ist(steht K16.000 drauf ich geh davon aus, damit ist 16 
MHz gemeint...). Hab als Prescaler 1024 eingestellt und Timer 0 ( 8 Bit) 
verwendet. Aber dafür blinkt die Led viel zu langsam! Ich würd jetzt auf 
6 Hz höchstens tippen wobei rein rechnerisch ca 30 Hz rauskommen 
müssten! Wie kann das sein? Hat das Quarz gar keine 16 MHz oder 
verwendet der Controller das gar nicht sondern i-wie was internes?
Danke

von Falk B. (falk)


Lesenswert?

@  xBlinker (Gast)

>verwendet. Aber dafür blinkt die Led viel zu langsam! Ich würd jetzt auf
>6 Hz höchstens tippen wobei rein rechnerisch ca 30 Hz rauskommen
>müssten!

6x8 = 48.

> Wie kann das sein?

CLKDIV Fuse?

Siehe AVR Fuses

MfG
Falk

von Julian (Gast)


Lesenswert?

Falk Brunner schrieb:
> CLKDIV Fuse?

hat der Mega8 nicht.

Kannst du den Quarz ablöten? Dann siehst du sofort ob der AVR den 
internen Takt verwendet oder nicht.

Alternativ kannst du natürlich auch mal das Datenblatt zu Rate ziehen 
und im Kapitel "System Clock and Clock Options" nachgucken

von Karl H. (kbuchegg)


Lesenswert?

xBlinker schrieb:
> Hallo
> Ich versuche gerade herauszufinden wie schnell meine Led blinkt... Also
> ich verwende aus dem Pollin Board den ATmega8 an dem ein Quarz
> angeschlossen ist(steht K16.000 drauf ich geh davon aus, damit ist 16
> MHz gemeint...).

Letzten endes ist das auch egal, wenn der Quarz gar nicht benutzt wird.

Probier mal
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <utils/delay.h>
5
6
#define LED_DDR   DDR....     // du setzt ein, wo die LED hängt
7
#define LED_PORT  PORT...     // du setzt ein, wo die LED hängt
8
#define LED_PIN   P...        // du setzt ein, wo die LED hängt
9
10
int main()
11
{
12
  LED_DDR = ( 1 << LED_PIN );
13
14
  while( 1 ) {
15
    LED_PORT |= ( 1 << LED_PIN );
16
    _delay_ms( 1000 );
17
18
    LED_PORT &= ~( 1 << LED_PIN );
19
    _delay_ms( 1000 );
20
  }
21
}

Die LED sollte 1 Sekunde an sein und 1 Sekunde aus sein. Es geht nicht 
darum, ob das jetzt auf die Millisekunde genau 1 Sekunde sind. Aber wenn 
dein Mega mit 8Mhz läuft, dann ist die LED 2 Sekunden an und 2 Sekunden 
aus und das kannst du mit freiem Auge sehen. Läuft der Prozessor 
hingegen mit nur 1Mhz, also dem Auslieferungszustand, dann ist die LED 
16 Sekunden an und 16 Sekunden aus. Und den Unterschied kann ein Blinder 
greifen.

Da muss man nichts auslöten. Einfach nur einen möglichst einfachen 
Prozess benutzen (zb LED blinken) und den so aufbauen, dass er von der 
tatsächlich vorliegenden Taktfrequenz abhängt (in dem Fall _delay_ms) 
und das ganze so in den Werten zurechtbiegen, dass man auch ohne 
Messinstrumente eine einigermassen vernünftige Aussage machen kann.

von Rene Zimmermann (Gast)


Lesenswert?

_delay_ms( 1000 );

bei

#define F_CPU 16000000UL

das geht nicht!

Gruß Rene

von Karl H. (kbuchegg)


Lesenswert?

Rene Zimmermann schrieb:
> _delay_ms( 1000 );
>
> bei
>
> #define F_CPU 16000000UL
>
> das geht nicht!

sagt wer?
Schon mal ins Header File reingeschaut, welches seit über einem Jahr 
ausgeliefert wird?

von Falk B. (falk)


Lesenswert?

@  Rene Zimmermann (Gast)

>das geht nicht!

Kommt drauf an.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#avr-libc_Versionen_ab_1.6

von xBlinker (Gast)


Lesenswert?

Hat vll jemand so nen Code für Assembler? Vll hilft euch ja mein 
Programmcode weiter:
1
.include "m8def.inc"
2
.def temp = r16
3
.def led = r17
4
5
 
6
.org 0x0000
7
        rjmp    main                  ; Reset Handler
8
.org OVF0addr
9
        rjmp    timer0_overflow       ; Timer Overflow Handler
10
 
11
main:
12
    ldi     temp, LOW(RAMEND)     ; Stackpointer initialisieren
13
    out     SPL, temp
14
    ldi     temp, HIGH(RAMEND)
15
    out     SPH, temp
16
17
    ldi   led, 0b01100000
18
    out    DDRD, led
19
    ldi   led, 0b00100000
20
    out    PORTD, led
21
22
    ldi     temp, (1<<CS00) | (1<<CS02)       ; CS00 setzen: Teiler 64
23
    out     TCCR0, temp
24
 
25
    ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer Overflow
26
    out     TIMSK, temp
27
28
    sei
29
30
loop: rjmp loop
31
32
timer0_overflow:
33
    cpi   led, 0b00100000
34
    BREQ  ausschalten
35
    BRNE  einschalten
36
    reti
37
    
38
ausschalten:
39
      ldi    led, 0b01000000
40
      out   PORTD, led
41
      sei
42
      ret
43
44
einschalten:
45
      ldi    led, 0b00100000
46
      out   PORTD, led
47
      sei
48
      ret

von MarioT (Gast)


Lesenswert?

Hallo xBlinker
Falk Brunner schrieb
>Siehe AVR Fuses
Wenn Du die Fuses nicht Setzt, läuft der µC mit dem Internem Takt und 
nicht mit dem Quarz.

von xBlinker (Gast)


Lesenswert?

Danke jetzt funktionierts! Aber woher kann man genau wissen was man für 
ein Quarz hat? Hab im Datenblatt was gelesen von "Crystal Oscillator, 
fast rising power" und "Crystal Oscillator, slowly rising power"...?

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

"power" wie in "power supply"

ansonsten gibts noch "full swing" (Oszillator voll aussteuern) und einen 
Stromsparmodus (CKOPT unprogrammed)

von xBlinker (Gast)


Lesenswert?

Ok danke! Hab jetz noch ne Frage:
Wenn Ich geh mal jetzt davon aus das ich ein 16 MHz Quarz hab! Wenn ich 
jetzt das CKOPT mit dem Wert 0 belege, würde das laut datenblatt heißen 
das nur ein 8 MHz Quarz verwendet werden kann! Was passiert wenn ich das 
auf 0 setze obwohl ich ein 16 MHz Quarz angeschlossen habe?

von Karl H. (kbuchegg)


Lesenswert?

xBlinker schrieb:
> Ok danke! Hab jetz noch ne Frage:
> Wenn Ich geh mal jetzt davon aus das ich ein 16 MHz Quarz hab! Wenn ich
> jetzt das CKOPT mit dem Wert 0 belege, würde das laut datenblatt heißen
> das nur ein 8 MHz Quarz verwendet werden kann! Was passiert wenn ich das
> auf 0 setze obwohl ich ein 16 MHz Quarz angeschlossen habe?

Im schlimmsten Fall schwingt der Quarz nicht an.

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

wird wahrscheinlich nicht sicher anschwingen, vielleicht nur sporadisch 
... üble Sache, macht viel Kopfzerbrechen.



und gleich vorweg: bei den Fuses aufpassen "mit dem Wert 0 belegen" ist 
im Datenblatt "programmed" und ist im Programmier Tool damit oft mit 1 
anzugeben.
Sicherheitshalber den Link von Falk oben konsultieren.

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

Karl heinz Buchegger schrieb:
> Im schlimmsten Fall schwingt der Quarz nicht an.

ich halte das sporadische Aussetzen für den schlimmsten Fall :-)

von xBlinker (Gast)


Lesenswert?

Ok danke dann versuch ichs lieber nicht :-)

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.