Pages: [1]   Go Down
Author Topic: Verständnisfrage zum Takt  (Read 611 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe folgendes kleines Problem beim Programmieren des Attiny45. Ich habe den gekauft und habe aus dem Internet entnommen, dass der standdardmäßig mit 8MHz internem Oszillator getaktet wird. Ich habe mir mit AVR Studio 5.1.208 die Fuses angeschaut, und es sieht wie folgt aus:


Code:
SELFPRGEN = [ ]
RSTDISBL = [ ]
DWEN = [ ]
SPIEN = [X]
WDTON = [ ]
EESAVE = [ ]
BODLEVEL = DISABLED
CKDIV8 = [X]
CKOUT = [ ]
SUT_CKSEL = INTRCOSC_8MHZ_6CK_14CK_64MS

EXTENDED = 0xFF (valid)
HIGH = 0xDF (valid)
LOW = 0x62 (valid)

Daraus geht meines Erachtens hervor, dass das Ding tatsächlich mit 8MHz läuft.
Jetzt habe ich folgenden Programmteil ausprobiert und festgestellt, dass die richtigen Zeiten nur rauskommen, wenn ich anstelle von 8MHz 1MHz angebe. Frage, Läuft der Chip mit 8 oder mit einem MHz?

Code:
    #define F_CPU 1000000                    // clock 1.0 MHz, internal oscillator

    #include <avr/io.h>
    #include <util/delay_basic.h>
    #include <avr/interrupt.h>

    #define LED PB4

void delay_ms(uint16_t ms){
  while (ms > 0) {
    _delay_loop_2(F_CPU/4000);
    ms--;
  }
}
   
    ISR (PCINT0_vect)               // Interrupt on PCINT0 vector
    {
    PORTB ^= (1 << LED);               // Toggle LED
    delay_ms (500);
    PORTB ^= (1 << LED);               // Toggle LED

    }




int main(void)
{

    GIMSK = _BV (PCIE); // Pin Change Interrupt Enable
    PCMSK = _BV (PCINT3); // Enable external interrupts PCINT3, PB3
    // MCUCR = 0x00;    // PCINT0 is triggered on rising edge
    sei(); // int - Global enable interrupts
    DDRB |= (1 << LED); // Set direction register output

        for (;;) {                  // loop (endless)
          asm("NOP");
        }

    return 0;
}

In dem ganzen Codeschniplsel geht es nur um die Zeile #define F_CPU und delay_ms(500). Wenn ich 8.000.000 angebe, dann dauert das nicht eine halbe Sekunde, sondern ganze vier Sekunden.
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 58
Posts: 3044
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
CKDIV8 = [X]
Vermutlich wird der Takt nochmal durch 8 geteilt.
Dieses Fusebit ändern oder es sollte woanders berücksichtigt werden ???
Logged

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 505
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schau dir mal die Seite http://www.engbedded.com/fusecalc/ an und gib Attiny45 ein.
Ausgegeben werden die Fuses im Auslieferungszustand. CKDIV8 = 0 ( "0" heißt gesetzt) bedeutet, dass der Takt intern durch 8 geteilt wird.
Die Definition     #define F_CPU 1000000  sagt dem Compiler, dass der Chip auf 1 MHz läuft, also stimmen die Zeiten im Programm.
Ändern kannst du das nur, wenn du die Fuses änderst.
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3031
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Daraus geht meines Erachtens hervor, dass das Ding tatsächlich mit 8MHz läuft.

Nö.

Und es gibt Datenblätter, in denen Du das nachlesen kannst.

> Clock Selection
> The AVR fuse settings control the system clock source being used.
> The device is hipped with internal RC oscillator at 8.0MHz and
> with the fuse CKDIV8 programmed, resulting in 1.0MHz system clock.

So werden die Dinger von Atmel ausgeliefert.
Und so schreibt Atmel das ins Datenblatt.
Logged

Pages: [1]   Go Up
Jump to: