Jag sitter med en atmega88 på en STK500 med en 32Khz kristall. Målet är att blinka en led med något exakt tidsintervall. Vanliga interrupts kan jag få till, men lyckas inte intiera/fånga från kristallen.
På STK500 har jag endast satt i kristallen och flyttat OSCEL-jumpern ett snäpp. Är det något mer som krävs. Manualen var lite förvirrande, för vad jag vill är alltså att ha en assynkron klocka med 32khz, systemklockan ska fortfarande rulla på sin vanliga interna.
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/iomx8.h>
/* From crystal */
SIGNAL(SIG_OVERFLOW2){
PORTB=PORTB^0x01;
}
/* If timer/counter 0 is overflowed (counted to 255) */
SIGNAL(SIG_OVERFLOW0){
PORTB=PORTB^0x02;
}
int main( void )
{
int i;
DDRB=0xFF;
PORTB=0xFF;
// Timer0 (normal)
TCCR0B=_BV(CS00) | _BV(CS02); // CLK/1024, overflow
TIMSK0=_BV(TOIE0); // only interrupt on overflow
// Timer2 (crystal)
// wait for external crystal to stabilise
for(i = 0; i < 10; i++)
_delay_loop_2(30000);
cli(); // disabel global interrupt
TIMSK2= TIMSK2 & (~_BV(TOIE2)); // disable OCIE2A and TOIE2
ASSR = (1<<AS2); // select asynchronous operation of Timer2
TCNT2 = 0; // clear TCNT2A
// select precaler: 32.768 kHz / 128 = 1 sec between each overflow
TCCR2A |= (1<<CS22) | (1<<CS20);
// wait for TCN2UB and TCR2UB to be cleared
while((ASSR & 0x01) | (ASSR & 0x04));
TIFR2 = 0xFF; // clear interrupt-flags
TIMSK2 = _BV(TOIE2); // enable Timer2 overflow interrupt
sei(); // enable global interrupt
while(1);
}
Interrupt assynkron räknare (32khz kristall) (AVR)
Du kanske kan hitta något användbart i Atmels app note om RTC:
http://www.atmel.com/dyn/resources/prod ... oc1259.pdf
Jag vet inte hur ett STK500 fungerar. Men om AVR:en på STK500:an som standard klockas från en kristall så måste du ställa om några fuse-bitar i AVR:en så att den kör på den interna RC:n istället. Det görs via programmeringsmjukvaran.
http://www.atmel.com/dyn/resources/prod ... oc1259.pdf
Jag vet inte hur ett STK500 fungerar. Men om AVR:en på STK500:an som standard klockas från en kristall så måste du ställa om några fuse-bitar i AVR:en så att den kör på den interna RC:n istället. Det görs via programmeringsmjukvaran.