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:
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?
#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.