Interrupt AVR-GCC AMTEGA32 C++

Gast #1633431
Lesenswert?
• ▲
▼
Kann mir das mal jemand gut gerklären mit dem Interrupt?
Unzwar ich habe einen Taster an PD2 hängen welcher aktive low ist.
Nun möchte ich auf eine Interrupt reagieren.
Ich dachte immer ich könnte jetzt sagen beim Interrupt wenn PD2 low wird 
mach das und das. Dem ist aber anscheinend nicht so? Soweit ich das 
bislang gelesenen habe kann ich meine Interrupt für nen Taster mit nem 
Windows API Timer verlgeichen? Wie geht es denn am besten?

was für eine Übergabe brauche ich ?
TIMER1_COMPA_vect ?  und wie initialisiere ich das dann in der Main?

Hier mal mein Code:
1
#define CNTDEBOUNCE 10
2
#define CNTREPEAT 200 // "lange gedrueckt:"
3

4

5
volatile uint8_t gKeyCounter;
6

7

8
// Timer-Compare Interrupt ISR, wird z.B. alle 10ms ausgefuehrt
9
ISR(TIMER1_COMPA_vect)
10
{
11
   uint8_t tmp_kc;  // Falls mehrfach auf eine mit volatile deklarierte Variable zugegriffen wird
12
          // sinkt die Verarbeitungsgeschwindigkeit stark 
13

14
   tmp_kc = gKeyCounter; // Uebernahme in lokale Arbeitsvariable
15
 
16
   if (!(PIND & (1 << PD2))) 
17
   {
18
      if (tmp_kc < CNTREPEAT) 
19
         tmp_kc++;
20
   }
21
   else 
22
      tmp_kc = 0;
23
    
24
   gKeyCounter = tmp_kc; // Zurueckschreiben
25
}
26

27
 
28

29
typedef struct 
30
{
31
  void init()
32
  {
33
      DDRD  &= ~(1 << PD2);
34
      PORTD |= (1 << PD2);
35

36
      // So hier ferhlt jetzt die explizite initilaizierung
37
      // wie lautet diese?
38

39
     // TCCR2  = 6;                     // Vorteiler 256 -> ~65ms Überlaufperiode
40
     // TIMSK |= (1<<TOIE2);            // Timer Overflow Interrupt freischalten 
41

42
// So in der Art müsste das ja aussehen oder? als dann:
43
// TCCR1 für timer1? = 6 d.h. die Interruptroutine würde all 65ms aufgerufen? Und dann TIMSK |= (1<<TOIE1);    was bringt mir das?
44
 
45
    // Interrupts freigeben
46
    sei();
47

48
  }
49

50
  bool pressed()
51
  {
52
      if ( gKeyCounter > CNTDEBOUNCE ) // Taste mind. 100 ms "prellfrei"
53
      {
54
        return true;
55
      }
56
    return false;
57
  }
58

59
  bool pressed_long()
60
  {
61
    if ( gKeyCounter > CNTDEBOUNCE ) // Taste mind. 100 ms "prellfrei"
62
    { 
63
      if (gKeyCounter == CNTREPEAT)
64
      {
65
        return true;
66
      }
67
    } 
68
    return false;
69
  }
70
}KeyEvent;
71

72

73

74
int main()
75
{
76
    LCD_Display lcd;      
77
    lcd.init(DISP_ON);
78
  lcd.cls();
79
  lcd<<"KeyEvent.h\nTEST No.1";
80
  
81
  KeyEvent Key;
82
  Key.init();
83
  
84
  DDRB  |= 0x01; 
85
  PORTB &= ~( 1 << PB0 );
86
  
87
  while(!Key.pressed()){}
88
  PORTB |= ( 1 << PB0 );
89
  
90
  while(!Key.pressed_long()){}
91
  PORTB &= ~( 1 << PB0 );
92
  
93
  while(!Key.pressed_long()){}
94
  lcd.cls();
95
  lcd>>"Laufschrift";
96
   
97
    while(true);    
98
  return 0;
99
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.