Forum: Mikrocontroller und Digitale Elektronik Problem mit ext. Interrupt


von Fipse (Gast)


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

von Fipse (Gast)


Lesenswert?

Kann es sein, dass ein externer Pullup Widerstand nötig ist wie hier zu 
sehen

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

?

Oder erfüllt der interne Pullup den gleichen Zweck?

von Cyblord -. (cyblord)


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.

von Fipse (Gast)


Lesenswert?

Danke für die Antwort.

Es geht um den Atmega16. Die Interrupts sind auf falling edge 
konfiguriert.
Am Port bleibt alles dunkel :-/

von Cyblord -. (cyblord)


Lesenswert?

Ersetze mal
1
//toggle
2
PORTA ^= 0xFF;

durch
1
//toggle
2
PORTA = 0xFF;

Dann geht dein PORTA auf hi sobald du einmal den taster drückst. Damit 
schließt du ein prellen aus.

Wie überprüfst du was sich am PORTA tut?

von Fipse (Gast)


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.

von Fipse (Gast)


Lesenswert?

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.

von Krapao (Gast)


Lesenswert?

Pin 30 (AVcc) und 31 (GND) sind angeschlossen?

von Cyblord -. (cyblord)


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?

von Fipse (Gast)


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;

von Cyblord -. (cyblord)


Lesenswert?

Dann hängt der Eingang in der Luft. Der Pullup fehlt. Warum auch immer. 
Der gepostete Code schaltet ihn allerdings korrekt ein. Aber wir kennen 
deine Schaltung nicht.
Hast du AVCC verbunden?

von Karl H. (kbuchegg)


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.

von Fipse (Gast)


Lesenswert?

Pullup ist an. AVCC ist angeschlossen.

von Cyblord -. (cyblord)


Lesenswert?

Liegt an der Schaltung. Schaltplan posten. Oder wenigstens ein Bild vom 
Aufbau.

von Fipse (Gast)


Lesenswert?

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

von Fipse (Gast)


Lesenswert?

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.

von Fipse (Gast)


Lesenswert?

Es sieht so aus als wäre der Pullup im Eimer...

von Fipse (Gast)


Lesenswert?

Ich hab jetzt umgekehrte Logik wie in diesem Bild zu sehen
aufgebaut: http://www.mikrocontroller.net/wikifiles/8/8a/Taster.gif

Damit hab ich den gleichen blöden Effekt.

von Fipse (Gast)


Angehängte Dateien:

Lesenswert?

Ich komm der Sache näher.

Das Bild das ich angehängt haben funktioniert!!


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

von Fipse (Gast)


Lesenswert?

aber nur bei einem schalter. Bei zwei gehts wieder nicht... arrwrrr

von Fipse (Gast)


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?

von Cyblord -. (cyblord)


Lesenswert?

Na super, also wieder nicht den ganzen Code gepostet.
Bitoperationen stehen im Tutorial.

von Karl H. (kbuchegg)


Lesenswert?

Fipse schrieb:

> Danke für die Hilfe?


Du könntest dir selbst helfen, in dem du deinen richtigen Code postest 
und nicht irgendwas, was du fürs Forum zurechtgeschneidert hast.

Bitmanipulation

von Fipse (Gast)


Lesenswert?

Das tut mir leid, ihr habt einen Fehler gesucht den ihr nicht finden 
konntet. Aber der ganze Code würde den Rahmen sprengen :D

von Fipse (Gast)


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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Fipse (Gast)


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

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.