ATtiny 13a taktet falsch

Gast #5393394
Lesenswert?

Hey hey! :)

ich bin neu hier und habe erst angefangen mit Atmel Studios zu arbeiten. 
Jetzt habe ich mich mit den Timer-Overflow beschäftigt. Leider musste 
ich feststellen, dass wohl meine Taktfequenz nicht ganz passend zu 
meinen ATtiny läuft. Ich habe eine Betriebsspannung von 5.5 Volt vom USB 
Port. Ich habe den Prescaler gesetzt und auch die Interrupt Service 
Routine definiert. Komischer weiße, dauert alles ewig lang. Ich habe 
dann erstmal die LED blinken lassen mit einen delay von 100ms in der 
while-loop. Das komischer ist, das es sich wie 1 Sekunde verhält, statt 
0,1 Sekunden ?
1
Hier mein Code:
2

3
/*
4
 * Test.c
5
 *
6
 * Created: 13.04.2018 21:47:04
7
 * Author : Robin Gerstmann
8
 */ 
9

10
#ifndef F_CPU
11
#define F_CPU 20000000UL //20MHz
12
#endif
13

14

15
#include <avr/io.h>
16
#include <util/delay.h>
17
#include <avr/interrupt.h>
18

19
ISR(TIM0_COMPA_vect)
20
{
21
  PINB ^=(1<<PB0); //LED AN oder  AUS ^= -> XOR
22
  
23
}
24

25
int main(void)
26
{
27
  //LED Ausgang
28
  DDRB = (1<<PB0);
29

30
  //Timer konfigurieren 
31
  TCCR0B |= (1<<WGM01) | (1<<CS00)| (1<<CS02);//CTC Mode + Prescaler
32
  TIMSK0 |= (1<<OCIE0A); //Interrupt aktiviert
33
  
34
  sei();
35
    while (1) 
36
    {
37
    
38
    
39
    }
40
}

Der ATtiny13a taktet doch laut Datenblatt mit 20MHz bei 5.5 Volt?
Gast #5393412
Lesenswert?

Michael U. schrieb:
> Hallo,
>
> Carotinbombe schrieb:
>> Der ATtiny13a taktet doch laut Datenblatt mit 20MHz bei 5.5 Volt?
>
> wenn Du ihm die 20MHz extern an CLKI anlegst ja.
> Ansonsten dürfte er im Lieferzustand wie üblich miz intern 9,6MHz und
> gesetzter CDIV8 laufen, also mit 1,2MHz.
>
> Gruß aus Berlin
> Michael

Oha!

Das wusste ich nicht....
Einmal sagst du intern mit 9.6 aber insgesamt mit 1,2 MHz :'D? Ich komme 
da noch nicht ganz mit.
#5393420
Lesenswert?

Hallo,

Carotinbombe schrieb:
> Einmal sagst du intern mit 9.6 aber insgesamt mit 1,2 MHz :'D? Ich komme
> da noch nicht ganz mit.

schau im Datenblatt nach unter ClockSource.
Die gängigen AVR haben ein Fusebit CDIV8, daß den Takt durch 8 teilt und 
die ist im Lieferzustand gesetzt.
Der interne RC-Oszillator kann 4,8 und 9,6MHz und sollte im 
Lieferzustand auf 9,6MHz sein, macht dann / 8 = 1,2MHz.

Man kann bei den aktuellen AVR auch per Software das 
Clockteilerverhältnis umstellen, müßte ich aber auch erst im Datenblatt 
nachschauen.

Falls die Frage nach #define F_CPU 20000000UL //20MHz kommt:
damit sagst Du dem Compiler mit welchen Takt Dein AVR tatsächlich läuft, 
damit z.B. _delay() usw. richtig berechnet werden können.
Am Takt ändern kannst Du mit dieser Angabe nichts.

Gruß aus Berlin
Michael
Gast #5393434
Lesenswert?

Der Tiny13A wird so ausgeliefert, dass ein interner RC-Oszillator
einen Takt von ungefähr (!) 9,6 MHz liefert. Zusätzlich ist eine
"Fuse" mit dem Namen CKDIV8 so voreingestellt, dass
F_CPU = 9,6 MHz / 8 = ungefähr (!) 1,2 MHz ist.

Damit kann man doch schon mal loslegen...

Die Programmzeile:
    #define F_CPU 20000000UL //20MHz
bewirkt GARNIX.

Sie hilft als KONSTANTE nur beim Berechnen von z.B. Baudratenteilern,
wenn (!) denn auch diese 20 MHz als CPU-Frequenz anliegen.

- Du wirst wohl nicht um das Studium des Datenblatts drumherum-
kommen!

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