www.mikrocontroller.net

Forum: Compiler & IDEs Intterrupts und Ports setzen


Autor: SqaureOne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: SqaureOne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, der erste Test im Debug des AVR Studios ssieht gut aus.

Autor: SqaureOne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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

volatile uint8_t temp; 


ISR(INT0_vect) 
{
   PORTC = 0x01;
}
  
ISR(INT1_vect) 
{
        switch (temp)
  {
  case 0:
  PORTC = 0x01;
  temp++;
  break;

  case 1:
  PORTC = 0x02;
  temp++;
  break;

  case 3:
  PORTC = 0x03;
  temp=0;
  break;
  }
}

int main (void) {          

    
  
sei();  // Globales Interrupt Enable Flag setzen
   
         
DDRC  = 0xff;  // Port C als Output
PORTC = 0x00;  
DDRD  = 0x00;  // Port D als Input


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

   while(1) {             

   /* "leere" Schleife*/;
   }   

   /* wird nie erreicht */
   return 0;
}

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fred Feuerstein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.