Forum: Compiler & IDEs Intterrupts und Ports setzen


von SqaureOne (Gast)


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!

von Johannes M. (johnny-m)


Lesenswert?

Beim ATMega16 sind die PINx-Register Read-Only! Schreibzugriffe darauf 
sind wirkungslos. Ich vermute, für das was Du willst, solltest Du besser 
PORTx nehmen...

von SqaureOne (Gast)


Lesenswert?

Vielen Dank, der erste Test im Debug des AVR Studios ssieht gut aus.

von SqaureOne (Gast)


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;
}

von Uhu U. (uhu)


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.

von Fred Feuerstein (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.