Intterrupts und Ports setzen

Gast #659510
Lesenswert?
• ▲
▼
Hallo Zusammen ich stehe mal wieder vor einem Problem mit meinem ATMEGA 
16.
Ich möchte innerhalb der Routinen für die Externen Interrupts Ausgänge 
am COntroller setzen. Soweit funktioniert dies auch, nur sobald ich aus 
der Interrupt Routine raus komme, wird mir der Port wieder 
zurückgesetzt. Hat einer eine Erklärung?

DIes ist mein Quellcode:

ISR(INT1_vect)
{

    temp=PINC;

     switch (temp)
  {
  case 0:
  PINC |= (1<<PC0);
  break;

  case 1:
  PINC |= (1<<PC1);
  PINC &= ~(1<<PC0);
  break;

  case 3:
  PINC |= ((1<<PC0)| (1<<PC1));
  break;
  }
}

Vielen Dank im Voraus!
Gast #659874
Lesenswert?
• ▲
▼
So heute Morgen habe ich nun meinen Quellcode auf dem Simulationsboard 
ausprobiert uund es funktioniert schon wieder nicht. Der Ausgang blinkt 
nur kurz auf.

Vielleicht seht ihr ja den Fehler in dem unteren Quellcode. Was ich 
erreichen möchte, ist das immer wenn ein Interrupt ausgelöst wurde die 
Ausgänge an Port C verändert werden. Möchte damit eine Art Freigabe 
Schaltung für meinen Sensor erstellen.

Vielen Dank im Voraus

1
#include <avr/io.h>         
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
#define INT0_vect                     _VECTOR(1)
5
#define INT1_vect                     _VECTOR(2)
6

7
volatile uint8_t temp; 
8

9

10
ISR(INT0_vect) 
11
{
12
   PORTC = 0x01;
13
}
14
  
15
ISR(INT1_vect) 
16
{
17
        switch (temp)
18
  {
19
  case 0:
20
  PORTC = 0x01;
21
  temp++;
22
  break;
23

24
  case 1:
25
  PORTC = 0x02;
26
  temp++;
27
  break;
28

29
  case 3:
30
  PORTC = 0x03;
31
  temp=0;
32
  break;
33
  }
34
}
35

36
int main (void) {          
37

38
    
39
  
40
sei();  // Globales Interrupt Enable Flag setzen
41
   
42
         
43
DDRC  = 0xff;  // Port C als Output
44
PORTC = 0x00;  
45
DDRD  = 0x00;  // Port D als Input
46

47

48
MCUCR |= (1<<ISC01)|(1<<ISC00)|(1<<ISC10)|(1<<ISC11);
49
GIMSK |=(1<<INT0)|(1<<INT1);
50

51
   while(1) {             
52

53
   /* "leere" Schleife*/;
54
   }

   /* wird nie erreicht */
   return 0;
}
#660699
Lesenswert?
• ▲
▼
Ich würde die Interrupts erst nach der Initialisierung freigeben.

temp muß nicht volatile sein, wenn sie nur von der ISR und sonst 
nirgends benutzt wird. Man kann sie auch als static uint8_t in der ISR 
selbst vereinbaren, dann ist sichergestellt, daß keine andere Routine 
sich daran zu schaffen macht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren