-
GICR Problem
Hallo Zusammen!
Ich will einen ADXL Beschleunigungssensor auslesen.
Damit die steigenden Flanken des PWM Signals vom ADXL sauber in mein Programm kommen, will ich eine ISR schreiben.
Der Compiler WINAVR (gcc, 3.4.6) mit AVR Studio 4 will den Befehl "GICR" aber nicht kennen, es kommt immer die Fehlermeldung:
../ADSXLR2.c:40: error: `GICR' undeclared (first use in this function)
Könnt Ihr mir weiterhelfen?
Vielen vielen Dank!!
Code:
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <avr/io.h>
//#define SIG_INTERRUPT0 _VECTOR(1)
SIGNAL(SIG_INTERRUPT0) // signal handler for external interrupt
{
PORTD|=(1<<PD0);
return;
}
int main (void){
DDRD = 0b00000011; //PD0 1 Eingang, Rest Ausgang
PORTD = 0b00001100;
DDRC = 0b00110000;
GICR = (1 << INT0) | (1 << INT1);
MCUCR = 0x03; // INT0 reagiert auf steigende Flanke
sei(); // enable interrupts
for(;;){} // loop "forewer", wait for signal
return 0;
}
-
Welcher AVR-Typ?
Probier mal GIMSK aus. Das ist das enttsprechende Register bei älteren AVRs.
Bei Winavr 3.4.5 ist in den Includefiles beim Mega32 folgendes definiert:
#define GIMSK _SFR_IO8(0x3B)
#define GICR GIMSK
Der neue Name wird also einfach auf den alten umgebogen, der dann auf die richtige Adresse des Register verweist.
-
Juhhu ;)
Vielen Dank!
mit GIMSK funktionierts ;)
PS: ich verwende einen Atmega8
-
Ich wahr etwas voreilig.. ;)
Der compiler meldet keine Fehler mehr, doch wird die ISR nicht aufgerufen :(
noch eine Idee?
ich habe leider kein KO, und kann das PWM Signal nicht überprüfen...
Code:
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <avr/io.h>
#define GIMSK _SFR_IO8(0x3B)
#define GICR GIMSK
int PulsL;
SIGNAL(SIG_INTERRUPT1) // signal handler for external interrupt
{
PORTC|=(1<<PC5); //LED anschalten
}
int main (void){
// DDRD = 0b11110011; //PD2,3 Eingang, Rest Ausgang
DDRC = 0xff;
DDRD &= ~(1<<PD2);
PORTD |= (1<<PD2);
// PORTD = 0b00001100;
MCUCR |= (1<<ISC01) | (1<<ISC00); // INT0 reagiert auf steigende Flanke
//GICR = (1 << INT0) | (1 << INT1);
GICR |= (1<<INT1); // Enable external Interrupt 1
sei(); // enable interrupts
for(;;){} // loop "forewer", wait for signal
}
-
Du konfigurierst INT0, willst aber ein Signal auf INT1 auswerten???
-
meinst du wegen dieser Zeile:
MCUCR |= (1<<ISC01) | (1<<ISC00); // INT0 reagiert auf steigende Flanke
wie kann ich die auf INT1 umschreiben?
-
Ins Datenblatt gucken und lesen, dass es statt ISC00 und ISC01 dann ISC10 und ISC11 sind...
-
Vielen Dank für die Korrektur!
Leider funktioniert die ISR aber noch imme rnicht... ;(
Wenn ich den PIN PD3 Direkt abfrage, leuchtet die LED, der Interrupt müsste allso min. 1X ausgelöst werden... (ganz am schluss)
Habt ihr noch weitere Ideen?
Code:
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <avr/io.h>
#define GIMSK _SFR_IO8(0x3B)
#define GICR GIMSK
SIGNAL(SIG_INTERRUPT1) // signal handler for external interrupt
{
PORTC|=(1<<PC5); //LED anschalten
}
int main (void){
DDRC = 0xff;
DDRD &= ~(1<<PD3);
PORTD |= (1<<PD3);
MCUCR |= (1<<ISC10) | (1<<ISC11); // INT0 reagiert auf steigende Flanke
GICR |= (1<<INT1); // Enable external Interrupt 1
sei(); // enable interrupts
for(;;){
//if ((PIND & (1<<PD3)) > 0) PORTC|=(1<<PC5); //LED anschalten
} // loop "forewer", wait for signal
}
-
Mit
PORTD |= (1<<PD3);
schaltest du den internen Pullup auf dem Interrupteingang ein. Wenn der Sensor den Pin nicht im Ruhezustand auf Masse zieht, ist der Pin damit immer high, und es tritt keinerlei Flanke auf, die erkannt werden könnte.
-
hatte ich auch schon Probiert
DDRD &= ~(1<<PD3);
PORTD =0;
funktioniert leider auch nicht :(
vielen Dank trozdem ;)