Interrupts
Postat: 8 juli 2009, 22:21:00
Hej!
Har nyligen börjat pilla med min AVR-P28 (labbplatta) och en tillhörande ATmega88.
Har nu tänkt lära mig att använda interrupts. Har kollat runt lite på nätet och försökt en del själv, men fastnar och har några frågor. Uppskattar givetvis också länkar till sidor som kan hjälpa mig.
1. Har kollat på denna sidan som ganska bra förklarar interrupts. Är det denna princip som gäller, det vill säga att PCMSK sätts beroende på vilken pin som bevakas, att MCUCR sätts för att specifiera vilken interrupt-typ som gäller samt att GIMSK används för att "sätta igång" en interrupt?
Undrar också ifall SIGNAL (SIG_INT0) {} sedan används för att specifiera vad som ska göras när interrupt sker.
2. Fick en exempelkod från OLIMEX i vilken LED:en sätts igång vid knapptryckning.
Undrar över felmeddelandet.
Felmeddelande:
../test3_LedLabbknapp.c: In function 'Initialize':
../test3_LedLabbknapp.c:18: error: 'GIMSK' undeclared (first use in this function)
../test3_LedLabbknapp.c:18: error: (Each undeclared identifier is reported only once
../test3_LedLabbknapp.c:18: error: for each function it appears in.)
Uppskattar all hjälp!
Har nyligen börjat pilla med min AVR-P28 (labbplatta) och en tillhörande ATmega88.
Har nu tänkt lära mig att använda interrupts. Har kollat runt lite på nätet och försökt en del själv, men fastnar och har några frågor. Uppskattar givetvis också länkar till sidor som kan hjälpa mig.
1. Har kollat på denna sidan som ganska bra förklarar interrupts. Är det denna princip som gäller, det vill säga att PCMSK sätts beroende på vilken pin som bevakas, att MCUCR sätts för att specifiera vilken interrupt-typ som gäller samt att GIMSK används för att "sätta igång" en interrupt?
Undrar också ifall SIGNAL (SIG_INT0) {} sedan används för att specifiera vad som ska göras när interrupt sker.
2. Fick en exempelkod från OLIMEX i vilken LED:en sätts igång vid knapptryckning.
Undrar över felmeddelandet.
Kod: Markera allt
#include<avr/io.h>
#include<avr/interrupt.h>
void Initialize(void)
{
PORTB = 0x0;
PORTC = 1<<5; /* turn the LED off */
PORTD = 0x0;
DDRB = 0x0;
DDRC = 1<<5; /* PC5 as output - the LED is there */
DDRD = 0x0;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
GIMSK=0x00;
MCUCR=0x00;
}
/* state = 0 -> Led Off
* state = 1 -> Led On
* state !=[0,1] -> Led Toggle
*/
void LedSet(unsigned char state)
{
switch (state)
{
case 0:
PORTC &= ~(1<<5);
break;
case 1:
PORTC |= 1<<5;
break;
default:
if (PORTC & 1<<5)
PORTC &= ~(1<<5);
else
PORTC |= 1<<5;
}
}
int main(void)
{
int i;
Initialize();
while (1)
{
if (!(PIND & 1<<2)) /* PIND2 is LOW when the button is pressed*/
{
LedSet(0);
for (i=65535;i;i--);
{
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
}
LedSet(1);
}
}
return 0;
}
../test3_LedLabbknapp.c: In function 'Initialize':
../test3_LedLabbknapp.c:18: error: 'GIMSK' undeclared (first use in this function)
../test3_LedLabbknapp.c:18: error: (Each undeclared identifier is reported only once
../test3_LedLabbknapp.c:18: error: for each function it appears in.)
Uppskattar all hjälp!