-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: GICR Problem

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.07.2006
    Beiträge
    143

    GICR Problem

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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;
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    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.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.07.2006
    Beiträge
    143
    Juhhu
    Vielen Dank!

    mit GIMSK funktionierts
    PS: ich verwende einen Atmega8

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.07.2006
    Beiträge
    143
    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
    }

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Du konfigurierst INT0, willst aber ein Signal auf INT1 auswerten???

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.07.2006
    Beiträge
    143
    meinst du wegen dieser Zeile:
    MCUCR |= (1<<ISC01) | (1<<ISC00); // INT0 reagiert auf steigende Flanke

    wie kann ich die auf INT1 umschreiben?

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Ins Datenblatt gucken und lesen, dass es statt ISC00 und ISC01 dann ISC10 und ISC11 sind...

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.07.2006
    Beiträge
    143
    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
    }

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    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.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.07.2006
    Beiträge
    143
    hatte ich auch schon Probiert
    DDRD &= ~(1<<PD3);
    PORTD =0;

    funktioniert leider auch nicht
    vielen Dank trozdem

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •