PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problme mit Hardware Interrupts



alecs
08.12.2005, 13:08
So nun hänge ich an dem Problem das ich die Hardware Interrupts nicht verarbeiten kann, bzw einfach nur nix passiert ...

also in meiner init sieht es so aus das ich erst mal INT0 und INT1 aktiviere:


void init(void)
{
//configure INT0 & INT1 - the external interrupt rissing
GICR |= (1<<INT0) | (1<<INT1);
MCUCR |= (1<<ISC00) | (1<<ISC01) | (1<<ISC10) | (1<<ISC11);
}


und wenn ein Interrupt ausgelöst wird, soll nur die entsprechende Var um 1 erhöht werden:


SIGNAL (SIG_INTERRUPT0)
{
left_trigger ++;
}

SIGNAL (SIG_INTERRUPT1)
{
right_trigger ++;
}


in meiner main() passiert momentan nix anderes als das die init() aufgerufen, die UART und die Interrupt mit sei() aktiviert wird. Und es erfolgt alles 500ms eine Ausgabe der Variablen = right_trigger,left_trigger.

Woran kann es liegen das der Interrupt nicht ausgelöst wird ? Denn die Variable bleib bei 0 !!!
Der pegel wechselt sauber von 0 auf 4 Volt und zurück, mit Messgerät gemessen an beiden Ports.

Alecs

PasstScho
08.12.2005, 15:54
Hi,
Ich bin mir nicht ganz sicher, da ich noch eine ältere AVR-GCC Version benutze, aber irgendwie vermisse ich ein sei(); bei dir.
MfG Alex

m.a.r.v.i.n
08.12.2005, 16:49
Hallo Alecs,

hast du die PortPins auch als Eingang geschaltet?



DDRD &= ~((1 << DDD2) | (1 << DDD3)); // PD2, PD3 als Eingang (ext. Interrupt 0, 1)


Gruß Peter

PicNick
08.12.2005, 17:13
Hast du auch "volatile" zu deinen Variablen geschrieben ?

alecs
08.12.2005, 18:07
Hallo Ihr lieben Leut... danke für eure Ratschläge aber ich hab den Fehler immer noch nicht gefunden, darum hab ich mal den vollständigen Code gepostet, vielleicht seht ihr ja den Fehler :?




#include <../avr/include/io.h>
#include <../avr/include/stdio.h>
#include <../avr/include/stdlib.h>
#include <../avr/include/interrupt.h>
#include <../avr/include/avr/signal.h>

//************************************************** ***************
#define UART_BAUD_RATE 9600
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)

//************************************************** ***************
void init(void);
void timer1_init(void);
int uart_putchar(char c);
void ioinit(void);
void delay_ms(unsigned int ms);

volatile int left_trigger=0, right_trigger=0;

/************************************************** ****
*
* main program
*/
int main(void)
{
//int adc_value;
left_trigger = 0;
right_trigger = 0;

init(); // init ports && ext Interrupts
ioinit(); // init COM
sei(); // Interrupts aktivieren
fdevopen(uart_putchar, NULL, 0);

timer1_init(); // init Timer1

printf("\n ...start Firmware 2.0.0.4 on POWER-T...\n");

while(1) // start an endless loop
{
delay_ms(500);
printf("Left= %i, Right= %i \n",left_trigger,right_trigger);
}
return 0;
}

/************************************************** ****
*
* Methode : to init the µC
*/
void init(void)
{
//configure INT0 & INT1 - the external interrupt
GICR |= (1<<INT0) | (1<<INT1);
MCUCR |= (1<<ISC00) | (1<<ISC01) | (1<<ISC10) | (1<<ISC11);
DDRD &= ~((1 << DDD2) | (1 << DDD3)); // PD2, PD3 als Eingang (ext. Interrupt 0, 1)

// DDRA = B00000111; // PortA Pin 0,1,2 as Output, all others as input
/* define port a as imput ( A/D-converter inputs ) */
DDRA = 0x00;
PORTA = 0x00;

/* define port b as output*/
DDRB = 0xff;
PORTB = 0x00;

/* define port c as output*/
DDRC = 0xff;
PORTC = 0x00;

/* define port d as output*/
DDRD = 0xff;
PORTD = 0x00;
}

/************************************************** ****
*
*/
SIGNAL (SIG_INTERRUPT0)
{
left_trigger ++;
}

SIGNAL (SIG_INTERRUPT1)
{
right_trigger ++;
}

/************************************************** ****
*
* timer1_init
*/
void timer1_init(void)
{
// activate the regulaer 8 bit pwm (not inverted)
// the WGM10 bit is declared as PWM10 in the datasheet
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);


//set the frequenz up to 14 khz (prescaler = 1)
TCCR1B = (1<<CS10);

// deactivate interrupts for timer1
// ATTENTION : the interrupts for all other timer are in the same register
TIMSK &= ~0x3c;

OCR1A = 0;
OCR1B = 0;
}


/************************************************** ****
*
* uart_putchar
*/
int uart_putchar(char c)
{

if (c == '\n')
uart_putchar('\r');
while (!(UCSRA & (1<<UDRE)));
UDR = c;
return 0;
}

/************************************************** ****
*
* ioinit
*/
void ioinit(void)
{
UCSRB = 0x08; //UART Transmitter aktivieren
UBRRL = UART_BAUD_SELECT; //Baud Rate einstellen
}

/************************************************** ****
*
* delay_ms
*/
void delay_ms(unsigned int ms)
{
unsigned int my_counter;

while (ms)
{
my_counter = F_CPU / 5000;
while (my_counter)
{
asm volatile ("nop");
my_counter--;
}
ms--;
}
}

SprinterSB
08.12.2005, 20:20
init(): Port D ist OUT und soll gleichzeitig Extern INT triggern?

alecs
08.12.2005, 21:02
Verdammt ](*,) ... das hätte ich ja sehen müssen :oops: ... danke \:D/