Forum: Mikrocontroller und Digitale Elektronik Arduino: Button drücken wird nicht erkennt. Nur der Interrupt wird ausgelöst


von Stefan S. (kami)


Lesenswert?

Hi,

ich habe hier einen ATtiny84 mit einem simplen Taster dran:

http://www.mikrocontroller.net/wikifiles/8/8a/Taster.gif

Ich habe folgenden simplen Code zum Testen geschrieben und lasse mir das 
alles per Serial ausgeben:
1
#include <JeeLib.h>
2
#include <avr/sleep.h>
3
#include <avr/interrupt.h>  
4
5
#define DIO1 10  // d10 
6
7
static void setPrescaler (uint8_t mode) {
8
    cli();
9
    CLKPR = bit(CLKPCE);
10
    CLKPR = mode;
11
    sei();
12
}
13
int buttonState = 0;     
14
ISR(WDT_vect) { Sleepy::watchdogEvent(); }
15
16
ISR (PCINT0_vect) { 
17
18
Serial.println("Ubt"); 
19
     
20
}
21
22
23
void setup()   {
24
setPrescaler(0); // div 1, i.e. speed up to 8 MHz
25
         Serial.begin(38400);
26
      Serial.print("ack13 \n");
27
    
28
      pinMode(DIO1, INPUT);       //set the pin to input
29
PCMSK0 |= (1<<PCINT2); //  tell pin change mask to listen to (DIO1)
30
digitalWrite(DIO1, LOW); 
31
GIMSK  |= (1<<PCIE0); // enable PCINT interrupt in the general interrupt mask
32
 
33
      //sei(); 
34
  
35
}
36
 
37
void loop() {
38
  buttonState = digitalRead(DIO1);
39
40
  // check if the pushbutton is pressed.
41
  // if it is, the buttonState is HIGH:
42
  if (buttonState == HIGH) {     
43
    // turn LED on:    
44
     Serial.print("1 \n");  
45
  } 
46
  else {
47
    // turn LED off:
48
     Serial.print("2 \n");
49
  }
50
  //Serial.println(inttime);
51
  delay (500);
52
  
53
  
54
55
 
56
}

Mein Output in hterm sieht nun so aus:
1
ack13 
2
2 
3
2 
4
2 
5
2 
6
2 
7
2 
8
UUbt
9
bt
10
2 
11
2 
12
2 
13
2 
14
UUUUUbtUUbUUUUUUaUUbUUUbt
15
bt
16
bt
17
t
18
bt
19
2 
20
2

Was mich nun stört ist das egal ob der Schalter betätigt ist oder nicht 
er immer nur LOW ist und nie HIGH ist. Aber ich jeden Interrupt auf dem 
Pin angezeigt bekomme. Was mache ich falsch?

Gruß kami

von Thomas E. (thomase)


Lesenswert?

Stefan S. schrieb:
> Was mache ich falsch?
So ziemlich alles.

Taster fragt man nicht per Interrupt ab.
Taster müssen entprellt werden.
In einer ISR schreibt man nichts auf den UART.
Delays sind nicht empfehlenswert.

mfg.

von Stefan S. (kami)


Lesenswert?

Hi,

ja darum geht es nicht. Das ist auch nur Code zum testen. Ich schreibe 
das nachher anders. Ich will nur relativ simpel sehen, was geht und was 
nicht.
Der Pin 10  ist : PCINT2  AIN1  ADC2

könnte das ein Problem sein? Ich habe am Tiny keinen anderen mehr frei

Gruß kami

von Eumel (Gast)


Lesenswert?

Stefan S. schrieb:
> ja darum geht es nicht. Das ist auch nur Code zum testen. Ich schreibe
> das nachher anders. Ich will nur relativ simpel sehen, was geht und was
> nicht.

Mach es gleich richtig.

von herb (Gast)


Lesenswert?

ich habe auch mal sowas probiert und ohne entprellung kam da wirklich 
auch nur müll raus. und delay ist auch ganz fail, mach das mit millis

von Thomas E. (thomase)


Lesenswert?

Stefan S. schrieb:
> ja darum geht es nicht. Das ist auch nur Code zum testen. Ich schreibe
> das nachher anders. Ich will nur relativ simpel sehen, was geht und was
> nicht.
Und jetzt bist du zu der Erkenntnis gekommen, daß das so nicht geht. Das 
ist ja auch schon was. Das musst du schon vernünftig machen. Sonst wird 
das nichts.

Stefan S. schrieb:
> könnte das ein Problem sein? Ich habe am Tiny keinen anderen mehr frei
Nein. Wenn der Pin I/O-Port ist, weiss der gar nicht, daß er auch noch 
ADC könnte.

mfg.

von Stefan S. (kami)


Lesenswert?

Hi,

so Problem komplett gelöst. Es lag nur an der Zuordnung der Pins.

11 musste 8 sein und der DIO2 ist 0.

Damit hat alles hingehauen.

Vielen Dank nochmal.

Gruß kami

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.