Forum: Compiler & IDEs 2 Taster mit Interrupt


von Chris F. (lieutenantfeist)


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

von Johann L. (gjlayde) Benutzerseite


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.

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.