mikrocontroller.net

Forum: Compiler & IDEs Problem mit Interrupt


Autor: Blackbull (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Ich bin neuling in der Programierer Welt. Wollte gerne mal was 
mit einen Interrupt auslösen. Das Program erzeugt ein lauflicht und 
sobald  ich einen taster drücke gehen alle Lampen an und sollen auch an 
bleiben. Mein Problem ist nun das der Interrupt wohl ausgelöst wird, 
aber das Lauflicht danach weiter läuft. Bitte um euere Hilfe

Hier ist der Code
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <avr/iom32.h>
#include <stdint.h>
#include <util/delay.h>  
#include <stdlib.h>            
#include  <stdio.h>
int i;
i=0;
ISR(INT2_vect)
  {
  PORTD=0xf0;
  i=2;
  }

main()
{
  DDRD = 0xF0;
  PORTD= 0x00;                          // D Ports als Eingänge festlegen
  DDRB = 0x00;                    // B Ports als Eingänge festlegen
  PORTB= 0xFF;                    // Pullup für Port B festlegen
  DDRA = 0x00;                    // C Port als Ausgänge festlegen

  DDRC = 0xFF;
  GICR |= (1<<INT2);                   // INT2 aktivieren#
  MCUCR |= ((1<<ISC01) | (1<<ISC00));  // bei steigender Flanke

  while(1)
    {
    sei();

    if(i==0)
    {
      PORTD=0x10;
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      PORTD=0x20;
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      PORTD=0x40;
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      PORTD=0x80;
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      }  
    }
}

Autor: dummy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>int i;

volatile int i;

Autor: Blackbull (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, hat geklappt! Danke. Nun habe ich wieder ein Problem, da ich nun 
voltaile int nehme kann ich nun den wert h nicht mehr hochzählen, wollte 
nun das Programm so schreiben das 5 mal das Interrupt auslösen muss 
bevor alle Lampen angehn. aber mit h+1 geht das nicht mehr.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <avr/iom32.h>
#include <stdint.h>
#include <util/delay.h>  
#include <stdlib.h>                //einbinden der bibliotheken
#include  <stdio.h>
volatile int i;
volatile int h;
ISR(INT2_vect)
  {
  h+1;
  }

main()
{
  DDRD = 0xF0;
  PORTD= 0x00;                          // D Ports als Eingänge festlegen
  DDRB = 0x00;                    // B Ports als Eingänge festlegen
  PORTB= 0xFF;                    // Pullup für Port B festlegen
  DDRA = 0x00;                    // C Port als Ausgänge festlegen

  DDRC = 0xFF;
  GICR |= (1<<INT2);                   // INT0 aktivieren#
  MCUCR |= ((1<<ISC01) | (1<<ISC00));          // bei steigender Flanke

  while(1)
    {
    sei();

    if(i==0)
    {
      PORTD=0x10;
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      PORTD=0x20;
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      PORTD=0x40;
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      PORTD=0x80;
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      _delay_loop_2(65000);
      }
      
    if(h<=5)
    {
    i==1;
    PORTD=0xF0;  
    }
    }
}

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

müßte
>  h+1; // zu h wird 1 addiert und das Ergebnis dann weggeworfen, weil es keine 
Zuweisung gibt?

nicht eher
h = h+1;
oder
h +=1;  // verkürzte Schreibweise
oder h++; // erhöht h um 1

heißen?

PS: bin immernoch ASM-Programmierer, der sowas zum C üben benutzt... :)

Gruß aus Berlin
Michael

Autor: nixversteh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael U. korrekt.
    if(h<=5)
    {
    i==1;
    PORTD=0xF0;  
    }
Hier gibt's auch noch was zu bemängeln. Da wird i mit 1 verglichen(!), 
das Ergebnis daraus (falls es jemals so beabsichtigt war) verworfen.

Autor: Blackbull (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das nun umgeändert auf...

...
ISR(INT2_vect)
  {
   h++;
  }

und....

if(h==5)
  {
  i=2;
  PORTD=0xF0;  
  }

nun müsste er doch eigentlich nach dem 5ten mal auslösen des interrupts 
die lampen an machen und das andere Programm unterbrechen da i=2 ist, 
oder versehe ich mich da? Auf jedenfall macht er es nicht.
wenn ich anstatt If (h==5) nun if (h>=5) schreibe macht er es sofort 
nach dem ersten mal auslösen des interrupts und nicht wie gewollt nach 
dem 5ten mal

Autor: Blackbull (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe ich mit:

volatile int i;
volatile int h;

gemahct


Hat sonnst keiner eine Idee?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hat sonnst keiner eine Idee?

Du hast gerade entdeckt das Taster prellen ;)
Wenn du einmal drückst löst das mehrere Interrupts aus.
Leg mal einen 100nF Kondensator parallel zum Taster.

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.