2 Taster mit Interrupt

#1097538
Lesenswert?

Servus,

Ich habe da ein kleines Problem. Ich schreibe grade ein Programm wo ich 
2 LEDs mit 2 Tastern benutzen moechte. Das laeuft im Moment noch nicht 
so ganz, sieht im Moment so aus:
1
#define F_CPU 3686400
2
#include <avr\io.h>
3
#include <inttypes.h>
4
#include <avr\interrupt.h>
5
//----------------------------------------------------------------------
6
volatile unsigned char buffer;
7

8
SIGNAL(SIG_INTERRUPT0)
9
{
10
  if( (!PIND2 & 4)){
11
    buffer = 3;
12
  }else if((!PIND2 & 8)) == 0){
13
    buffer = 1;
14
  }
15
}
16
//----------------------------------------------------------------------
17
main()
18
{
19
  DDRB  = 0xff;                // PortB = Output
20
  PORTB = 0xff;         // alle LEDs ON
21
  cbi(DDRD,2);                // PortD = Input
22
  cbi(DDRD,3);
23
  sbi(PORTD,2);
24
  sbi(PORTD,3);
25
  GICR  = 0x40;                // enable external int0 Bit 6
26
  MCUCR = 0x02;                // falling egde: int0 Bit 1
27
  sei();                       // enable interrupts
28
  do
29
  {
30
    PORTB = buffer;
31
  }
32
  while (true);                 // Mainloop
33
}
34
//----------------------------------------------------------------------

Taster 1 ist mit D.2, und Taster 2 mit D.3 verbunden. Die eine LED (die 
durch Taster 1 angeschaltet werden soll) ist an B.0, die zweite LED (zu 
Taster 2) and B.1. Ich dachte da kann man in einem Interrupt einfach 
schaun welcher der beiden Taster jetzt gedrückt ist...D.2 würde ja einer 
Bitkombination von 0b00000100 entsprechen (4) und D.3 0b00001000 (8). 
Und dann halt Buffer entsprechend setzen. Irgendwo ist da noch der Wurm 
drinnen und ich seh es nicht, oder ich hab totalen Bockmist gebaut :D. 
Tips was ich falsch gemacht habe, oder wo ein Gedankenfehler ist sind 
sehr willkommen.

Lg,
Chris
Persönliche Seite #1097548
Lesenswert?

Christian Feist wrote:
1
#define F_CPU 3686400
2
#include <avr/io.h>
3
#include <inttypes.h>
4
#include <avr/interrupt.h>
5
//----------------------------------------------------------------------
6
volatile unsigned char buffer;
7

8
SIGNAL(SIG_INTERRUPT0)
9
{
10
  if (!(PIND & (1 << PIND2)))
11
  {
12
    buffer = 3;

1) falsch geklammert?
2) auch auf windose-rechnern / bei include, kein \
3) schon mal was von Entprellung gehört (debounce)?
4) PIND2 ist immer 2, das SFR heisst PIND. In C gibt es keine 
Bitvariablen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren