Forum: Mikrocontroller und Digitale Elektronik Einstellung Fuse Ati841 - Zeit stimmt nicht


von Klaas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
ich arbeite mich gerade in einen Attiny 841 ein. Habe zum Anfang 8 
Ausgänge mit LEDs angezeigt. Es wurde die Fuse auf intern mit 8 MHz 
eingestellt. Die LEDs werden nacheinander 0,5 Sekunden eingeschaltet und 
0,5 Sekunden ausgeschaltet. Damit ergibt sich für jede LED 1 Sekunde, 
bei 8 LEDs müssten sich 8 Sekunden für den durchlauf ergeben. Leider 
sind die LEDs weit aus schneller. Gefühlt ca. 1 bis 2 Sekunden.
Das Programm für die LEDs:
1
// Pin 1  
2
    PORTA &= ~(1<<PA0);    // Schaltet Pin aus
3
    _delay_ms(500);      // Pause 500 ms
4
    PORTA |= (1<<PA0);    // Schaltet Pin ein
5
    _delay_ms(500);      // Pause 500 ms
6
    
7
    // PIN 2
8
    PORTA &= ~(1<<PA1);    // Schaltet Pin aus
9
    _delay_ms(500);      // Pause 500 ms
10
    PORTA |= (1<<PA1);    // Schaltet Pin ein
11
    _delay_ms(500);      // Pause 500 ms
12
    
13
    // PIN 3
14
    PORTA &= ~(1<<PA2);    // Schaltet Pin aus
15
    _delay_ms(500);      // Pause 500 ms
16
    PORTA |= (1<<PA2);    // Schaltet Pin ein
17
    _delay_ms(500);      // Pause 500 ms
18
    
19
    // PIN 4
20
    PORTA &= ~(1<<PA3);    // Schaltet Pin aus
21
    _delay_ms(500);      // Pause 500 ms
22
    PORTA |= (1<<PA3);    // Schaltet Pin ein
23
    _delay_ms(500);      // Pause 500 ms
24
    
25
    // PIN 5
26
    PORTA &= ~(1<<PA5);    // Schaltet Pin aus
27
    _delay_ms(500);      // Pause 500 ms
28
    PORTA |= (1<<PA5);    // Schaltet Pin ein
29
    _delay_ms(500);      // Pause 500 ms
30
    
31
    // PIN 6
32
    PORTA &= ~(1<<PA7);    // Schaltet Pin aus
33
    _delay_ms(500);      // Pause 500 ms
34
    PORTA |= (1<<PA7);    // Schaltet Pin ein
35
    _delay_ms(500);      // Pause 500 ms
36
    
37
    // PIN 7
38
    PORTB &= ~(1<<PB1);    // Schaltet Pin aus
39
    _delay_ms(500);      // Pause 500 ms
40
    PORTB |= (1<<PB1);    // Schaltet Pin ein
41
    _delay_ms(500);      // Pause 500 ms
42
    
43
    // PIN 8
44
    PORTB &= ~(1<<PB0);    // Schaltet Pin aus
45
    _delay_ms(500);      // Pause 500 ms
46
    PORTB |= (1<<PB0);    // Schaltet Pin ein
47
    _delay_ms(500);      // Pause 500 ms
48
49
#include <util/delay.h>      // Einbindung Datei Pause
50
#include <avr/io.h>        // Einbindung Datei Ausgänge
In den Bildern habe ich die Einstellung der Fuse dargestellt. 
Wahrscheinlich was falsch eingestellt. Könnte mal jemand drüber schaun.
LG Kl

: Verschoben durch Moderator
von Sebastian R. (sebastian_r569)


Lesenswert?

Hast du F_CPU in den Symbols definiert oder bekommst du eine Warnung von 
der delay.h, dass F_CPU nicht definiert ist?

: Bearbeitet durch User
von Klaas (Gast)


Lesenswert?

Habe die F_CPU nicht definiert. Bekomme keine Warnung von delay.h
Muss die F_CPU noch mal angegeben werden, stehen doch im den Fuse drin.
Sorry für die Fragen, habe bisher immer mit einem Quarz gearbeitet.

von Sebastian R. (sebastian_r569)


Lesenswert?

Ja, F_CPU muss immer definiert/angegeben sein.

Auch wenn du den int. Oszillator mit 8 MHz nutzt, kann z.B. während der 
Laufzeit der Prescaler umgeschaltet werden, wodurch die Annahme "Wenn 
int. Oszillator, dann F_CPU = 8MHz" falsch ist. Dementsprechend wird 
nichts automatisch angenommen.

Und gerade bei der Verwendung von ext-. Quarzen/Oszillatoren muss F_CPU 
angegeben werden. Der Controller kann ja nicht riechen, welche Frequenz 
er bekommt.

: Bearbeitet durch User
von HildeK (Gast)


Lesenswert?

Klaas schrieb:
> Habe die F_CPU nicht definiert. Bekomme keine Warnung von delay.h
Die Taktfrequenz kann dem Projekt über
#define F_CPU
oder im Makefile oder je nach IDE auch dort irgendwo eingegeben werden 
(kommt dann in den automatisch erstellten Makefile).

> Muss die F_CPU noch mal angegeben werden, stehen doch im den Fuse drin.
Die Fuse programmiert nur den Teiler, damit wird keine Taktfrequenz 
angegeben.
Intern laufen viele AVRs auf 8MHz, mit Teiler CKDIV8 auf 1MHz. Das muss 
über F_CPU dem Programm mitgeteilt werden.

Bei einem externen Taktgenerator oder Quarz hast du wieder die 
Möglichkeit, über die CKDIV8 den Originaltakt oder 1/8 davon zu 
verwenden.
Das Programm weiß aber davon gar nichts, weder welchen Oszillator du 
angeschlossen hast noch ob der Teiler gesetzt ist oder nicht.

von Klaas (Gast)


Lesenswert?

Danke für eure Info

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.