Interrupt assynkron räknare (32khz kristall) (AVR)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Nimzo
Inlägg: 6
Blev medlem: 2 augusti 2004, 15:29:09
Ort: Stockholm
Kontakt:

Interrupt assynkron räknare (32khz kristall) (AVR)

Inlägg av Nimzo »

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);
}
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

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.
Skriv svar