-         

Ergebnis 1 bis 7 von 7

Thema: Problme mit Hardware Interrupts

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119

    Problme mit Hardware Interrupts

    Anzeige

    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:
    Code:
    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:
    Code:
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.11.2004
    Ort
    München
    Alter
    30
    Beiträge
    447
    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

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo Alecs,

    hast du die PortPins auch als Eingang geschaltet?

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

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Hast du auch "volatile" zu deinen Variablen geschrieben ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119
    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

    Code:
    #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--;
       }
    }

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    init(): Port D ist OUT und soll gleichzeitig Extern INT triggern?
    Disclaimer: none. Sue me.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119
    Verdammt ... das hätte ich ja sehen müssen ... danke \/

Berechtigungen

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