Intterrupts und Ports setzen

Gast #659510
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
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
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.