2 Taster mit Interrupt

OP #1097538
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
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

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