Wie schnell blinkt die Led

Gast #1626455
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
Gast #1626490
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
#1626494
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.
Gast #1626569
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
Gast #1626737
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"...?
Gast #1626781
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?
#1626796
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren