Forum: Mikrocontroller und Digitale Elektronik Taster funktioniert nicht


von Norbert W. (dl6tud)


Lesenswert?

Ich bin Anfänger, habe die Tutorials studiert, komme aber leider zu 
keinem erfolgreichen Ergebnis. Ich möchte mit einem Taster eine LED 
einschalten.

Die LEDs liegen mit Vorwiderstand auf Vcc, der Schalter ohne Pullup-R 
auf GND. LEDs funktionieren. Egal welche Schaltstellung vorliegt, es 
leuchtet stehts LED6, als ob der Schalter eingeschaltet wäre. Ist er 
aber nicht.
1
#include <avr\io.h>  //AVR Register und Konstantendefinitionen
2
3
int main(void)
4
{
5
6
DDRA |= (1 << DDA6) | (1 << DDA7);  // zwei LED als Ausgang
7
8
DDRC  &= ~(1<<PC5);  // Pin C5 ist der Schalter (schaltet auf Masse)
9
PORTC |= (1<<PC5); // Pullup für Pin C5 ein
10
11
PORTA |= (1<<PA6); // LED6 aus
12
PORTA |= (1<<PA7); // LED7 aus
13
14
while(1){
15
16
if (!(PINC & (1<<PC5))) // ist PinC auf Masse?
17
{
18
PORTA &= ~ (1<<PA6); // LED6 an
19
}
20
else          // nicht?
21
{
22
PORTA &= ~ (1<<PA7); // LED7 an  
23
};
24
}}

von Johannes O. (jojo_2)


Lesenswert?

Was verwendest du für einen Controller? Hängt an den Ports evtl. noch 
der Programmer dran oder sind das evtl. die JTAG-Pins?

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Du hast Dich da ziemlich mit den Operatoren vertan. 'PORTA |= (1<<PA6)' 
schaltet die LED ein, nicht aus. 'PORTA &= ~(1<<PA6)' schaltet die LED
aus, nicht ein. Bei der Port-Initialisierung stimmt es noch, danach aber 
nicht mehr. Bei der (Erst-)Initialisierung verwendet man aber eher '=' 
anstatt '&=' und '|=", damit alle Bits einen definierten Zustand 
bekommen. Schau dir nochmal das Tutorial über Bitoperationen an.


Gruß
Jonathan

von Karl H. (kbuchegg)


Lesenswert?

Jonathan Strobl schrieb:
> Du hast Dich da ziemlich mit den Operatoren vertan. 'PORTA |= (1<<PA6)'
> schaltet die LED ein, nicht aus. 'PORTA &= ~(1<<PA6)' schaltet die LED
> aus, nicht ein.

Nun ja.
Genau genommen hängt das wiederrum davon ab, wie seine LED angeschlossen 
sind.
Er schaltet die jeweilige LEd auch nie in den anderen Zustand je nach 
Schalterstellung.
Aber nichts desto trotz: Wenn der Schalter betätigt wird, müüsste sich 
was tun. Ob da jetzt die eine LED angeht, oder dieselbe LED ausgeht ist 
eine andere Sache. Aber zumindest das 'Bild', das die beiden LED bieten, 
müsste sich verändern.

Daher die Frage an den TO: Tut es das? Tut sich überhaupt etwas oder 
stört dich nur, dass die LED an PC6 nicht reagiert (und die an PC7 
wenigstens einmal schaltet)

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Oh, stimmt. Da hatte ich wohl 'Tomaten auf den Augen'... Aber es würde 
trotzdem nicht funktionieren: Die LEDs werden nicht mehr 
ausgeschaltet... Ein 'PORTA |= (1<<PA7)' hinter 'PORTA &= ~(1<<PA6)' und 
ein 'PORTA |= (1<<PA6)' hinter 'PORTA &= ~(1<<PA7)' würde da helfen.


Gruß
Jonathan

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

>Daher die Frage an den TO: Tut es das? Tut sich überhaupt etwas oder
>stört dich nur, dass die LED an PC6 nicht reagiert (und die an PC7
>wenigstens einmal schaltet)


Gruß
Jonathan

von Karl H. (kbuchegg)


Lesenswert?

Jonathan Strobl schrieb:
> Oh, stimmt. Da hatte ich wohl 'Tomaten auf den Augen'...

kein Wunder bei der Formatierung.
Aber auch das wird er noch lernen :-)

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Na ja, ich habe schon (viel) schlimmeres gesehen.

von Willi W. (Gast)


Lesenswert?

Norbert W. schrieb:
> Die LEDs liegen mit Vorwiderstand auf Vcc

Damit sollten != (1<< Px) zum Ausschalten und &= ~(1<< Px) zum 
Einschalten schon richtig sein.

von Norbert W. (dl6tud)


Lesenswert?

Danke für eure Hilfe! Das LED an und aus ist schon korrekt, wenn auch 
verwirrend.

Eigentlich wollte ich gerade verzweifeln ... Das Problem lag am PIN: 
C2-C5 (TCK, TMS, TDO, TDI) eines AtMega32 sind offensichtlich nicht zum 
Schalten geeignet. Jedenfalls funktioniert es an den Pins nicht. Nur aus 
Neugierde: Weiß jemand, warum das so ist?

von nocheinGast (Gast)


Lesenswert?

Das hat doch oben schon jemand gesagt... weil standardmäßig das 
JTAG-Interface aktiviert ist, und das eben genau diese Pins verwendet...

von Johannes O. (jojo_2)


Lesenswert?

Johannes O. schrieb:
> Was verwendest du für einen Controller? Hängt an den Ports evtl. noch
> der Programmer dran oder sind das evtl. die JTAG-Pins?

DAS war von mir die erste Antwort zu diesem Thema. ;-)

Zur Erklärung: Es gibt auch Programmiergeräte welche die 
JTAG-Schnittstelle verwenden um den Controller zu programmieren und zu 
debuggen. Du kannst die JTAGEN-Fuse (irgendwie so heißt sie) auswählen, 
falls du JTAG NICHT brauchst. Dann sollten auch die Pins "funktionieren"

von spess53 (Gast)


Lesenswert?

Hi

>Zur Erklärung: Es gibt auch Programmiergeräte welche die...

Na ja. Eigentlich ist nur das JTAG-Interface bei den Controllern, die 
ein solches besitzen, im Auslieferzustand eingeschaltet. Die vom 
JTAG-Interface benutzten Pins sind dann nicht als normale Pins 
benutzbar. Erst nach Deaktivierung per JTAG-Fuse oder Software sind die 
Pins nutzbar.

MfG Spess

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.