Problem mit ext. Interrupt

Gast #2585222
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
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
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.
Gast
Karl Heinz Buchegger schrieb im Beitrag #2585251:
> Und wo soll diese Konfiguration zu finden sein?

INT2 ist immer edge getriggert. Der kann gar nicht anders.
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
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;
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
Der Taster auf dem Board funktioniert einwandfrei. Ich habe nichts 
weiter getan als diesen abzuziehen und meinen Schließer gegen Masse 
einzubauen und dann noch Pullsups zu aktivieren. grml
Gast
Habe grad zum Test die Pullups wieder ausgeschaltet und den Taster vom 
Board genommen und es geht. Also komme ich wohl nicht drumrum die Logik 
umzubauen. Das kann doch nicht wahr sein.
Gast
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
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?
Fipse schrieb:
> Das Problem ist im übrigen noch nicht gelöst. Hier jetzt der gesamte
> Code:

Und was sprengt da jetzt den Rahmen?

>        PORTD = ((value[phase]) & 0xFC);    //Higher Nibble

solange du an den kompletten Port D zuweist, darfst du dich nicht 
wundern, wenn du die Pullup Widerstände verlierst.
Gast
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

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