Forum: Compiler & IDEs Interrupt AVR-GCC AMTEGA32 C++


von Cyb3r (Gast)


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
}

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.