Problem mit ext. Interrupt

Gast #2585222
Lesenswert?

Hallo,

ich bin blutiger Anfänger und möchte mittels eines Taster (Schließer) 
einen Ext. Interrupt auslösen. Folgender COde dazu
1
void main()
2
{
3
   //PB2 Putput + Pullup
4
   DDRB &= ~(_BV(PB2));
5
   PORTB |= _BV(PB2);
6

7
   //PortA output + LEDs off
8
   DDRA = 0xFF; 
9
   PORTA = 0x00;
10

11
   //init interrupt
12
   MCUCSR &= ~(_BV(ISC2));
13
   GICR |= _BV(INT2);
14

15
   sei();
16

17
   while(1) {;}
18
}
19

20
ISR(INT2_vect)
21
{
22
   //toggle
23
   PORTA ^= 0xFF;
24
}


Ich habe wie gepostet die Pullups eingeschaltet und einen Schließer der 
PB2 nach Masse schaltet. Es wird aber kein Int ausgelöst sprich an PortA 
tut sich nix.

Habe ich einen Denkfehler in der Logik des schalters?

Dankeschön
#2585235
Lesenswert?

Interner Pullup reicht.

Dein Taster prellt, das weißt du hoffentlich.
Taster an Interrupt ist deshalb immer schlecht.
Aber irgendwas müsste sich trotzdem am Port tun, nur vielleicht siehst 
du es nicht.
Ansonsten schreibst du nichtmal welchen Controller du verwendest.
Auch ist dein Code unnötig kompliziert. Du löscht Bits die sowieso null 
sind usw.
Gast #2585253
Lesenswert?

Gute Idee, funzt leider nicht. Was ich dazu sagen sollte ist, dass es 
auf dem Eva Board mit den dortigen Tastern funktioniert. Der dortige 
Taster zieht den Port auf +5V anstatt gegen Masse, mit ausgeschalteten 
Pullups. Erscheint mir logisch.

Ich machs jetzt auf dem Steckbrett genau andersrum: Pullups an, und 
gegen Masse ziehen.
#2585258
Lesenswert?

Ich tippe auch Schaltungsfehler. DU hast irgendwas falsch gesteckt auf 
dem Board. Überprüfe nochmal ob alle Kabel an den richtigen Pins sind.

Pullup ein und Schalter gegen Masse ist optimal. Wenn du Schalter gegen 
VCC machst, brauchst du einen Pulldown als extra Bauelement sonst hängt 
dein Eingang in der Luft wenn der Taster nicht betätigt ist. Und einen 
Vorteil hat es nicht.

> Wie überprüfst du was sich am PORTA tut?
Gast #2585263
Lesenswert?

Ich habe tatsächlich einen kleine schaltungsfehler besser gesagt ne 
schlechte/kalte Lötstelle gehabt. Allerdings tritt jetzt ein anderes 
Phänomen auf: Wenn ich mit dem Finger richtung Taster gehe und ihn NICHT 
berühre werdne massig Ints ausgelöst und PORTA toggel wie wild, bis ich 
die Hand wegnehme. Testen tu ich das nachwievor mit PORTA ^= 0xFF;
#2585268
Lesenswert?

Der Pullup ist nach wie vor eingeschaltet?

Ohne Pullup wirkt die Leitung vom Taster zum µC wie eine Antenne. Was du 
siehst ist deine 'Antennenwirkung', und wie dein Körper alle Felder in 
deiner Umgebung (die meisten davon werden 50Hz aus der Netzspannung 
sein) aufsammelt und an die 'Antennleitung' des Tasters weitergibt.
Gast #2585367
Lesenswert?

ich glaub ich hab den Fehler.

Ich gebe an andere Stelle etwas auf PortB aus. Aber zur Ausgabe benutze 
ich:
1
PORTB = (value << 4);  //Higher Nibble

Damit schalte ich jenachdem wie value eingestellt ist den Pullup wieder 
aus. Kann mir jemand sagen wie ich nur das obere Nibble setze? mit |= 
hab ich das Problem dass Nullen nicht null gesetzt werden im Nibble.

Danke für die Hilfe?
Gast #2585462
Lesenswert?

Das Problem ist im übrigen noch nicht gelöst. Hier jetzt der gesamte 
Code:
1
#ifndef F_CPU 
2
#define F_CPU 16000000UL 
3
#endif
4

5
#include <util/delay.h> 
6
#include <avr/interrupt.h>
7
#include <avr/io.h>
8

9

10
// ##########################
11
// ####   IO FUNCTIONS   ####
12
// ##########################
13
void initIO()
14
{
15
  //DAC = OUTPUT
16
  DDRD |= 0xF0;  //Higher Nibble
17
  DDRB |= 0xF0;  //Lower Nibble
18

19
  //LCD
20
  DDRA = 0xFF;
21

22
  //Keys = INPUT
23
  DDRB &= ~(_BV(2));
24
  PORTB |= _BV(PB2);
25

26
  DDRD &= ~(_BV(2) | _BV(3));
27
  PORTD |= _BV(PD2) | _BV(PD3);
28
}
29

30
void initExtInt()
31
{
32
  //INT0, INT1, INT2 = falling edge
33
  MCUCR |= _BV(ISC11) | _BV(ISC01);
34
  MCUCSR &= ~(_BV(ISC2));
35
  GICR |= _BV(INT0) | _BV(INT1) | _BV(INT2);
36
}
37

38

39
// ########################
40
// ####   MAIN PROGRAM  ####
41
// ########################
42

43
int main(void)
44
{
45
  //initial values
46
  initIO();
47
  initExtInt();
48

49
  lcd_init(LCD_DISP_ON);
50

51
  sei();
52

53
  while(1)
54
  {
55
    PORTD = ((value[phase]) & 0xFC);    //Higher Nibble
56
    PORTB = (((value[phase]) << 4)|0x04)  ;  //Lower Nibble
57
  }
58

59
  return 0;
60
}
61

62

63

64
// #################
65
// ####    ISR   ####
66
// #################
67

68

69
ISR(INT0_vect)
70
{
71
  PORTA ^= 0xFF;
72
}
73

74

75
ISR(INT1_vect)
76
{
77
  PORTA ^= 0xFF;
78
}
79

80

81
ISR(INT2_vect)
82
{
83
  PORTA ^= 0xFF;
84
}

value ist ein char Array mit 100 elementen, das hab ich rausgeworfen, 
weils zu groß war.

In der Main möchte ich das jeweilige Byte auf dem oberen Nibble des 
Ports ausgeben ohne das untere zu verändern. Mache ich es mit POTD |=... 
dann setze ich ja nur die 1er, nicht aber 0er. Deswegen diese kryptische 
verundung bzw. Veroderung. sie hat nur den Zweck den Pullup nicht 
auszuschalten.

An den besagten INTx sind jeztt Taster gegen Masse geschlossen. Drücke 
ich  jetzt int0, dann passiert an PORTA einmal kurz was, dann nie 
wieder. genausp mit den anderen.


Was kann das bloß sein?
Gast #2585497
Lesenswert?

Ich bin jetzt soweit, dass es auf dem Eva Board mit brücken vom Port 
nach GND geht. das heißt es muss auch real mit tastern gehen, auch wenn 
es das noch nicht tut. das heißt für mich wohl hardware fehler suchen.

Danke für die Hilfe an alle

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