Forum: Mikrocontroller und Digitale Elektronik AVR Atmega 328 Hilfe bei LED Taster Schaltung


von Guido L. (egudo)


Angehängte Dateien:

Lesenswert?

Hey Leute,
ich als blutiger Anfänger hänge jetzt schon an einer sehr einfachen 
Schaltung fest. Da ich auch begreifen und lernen möchte habe ich nicht 
einfach Beispiele kopiert sondern an denen angelehnt meinen eigenen 
Sourcecode geschrieben. Sinn meiner Schaltung soll sein, dass eine LED 
leuchtet wenn man einen Taster drückt. Lässt man den Taster los soll die 
LED auch ausgehen. Das einschalten der LED funktioniert auch tadellos 
nur aus ausschalten geht nicht immer. Es scheint so als wäre die LED 
beim loslassen des Tasters in keinem definiertem Zustand da sie mal an 
bleibt und mal ausgeht. Leuchtet die LED weiter, leuchtet sie beim 
nächsten Betätigen des Tasters heller. Da ich schon seit Tagen suche 
weiß ich auch nicht ob der Fehler im Sourcecode oder in der Schaltung 
liegt.

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>


int main(void)
{
DDRB = 0xFF; //Register B Ausgänge
DDRC = 0x00; // Register C Eingänge
PORTC = 0xFF; // Register C Pullups ein

  while (1)
  {
    if (!(PINC & ( 1<<PC4 ))) //wenn PC4 HIGH dann...
    {
      PINB |= ( 1<<PB0 );  // LED an PB0 an
    }
    else
    {
      PINB &= ~ ( 1<<PB0 ); // ansonste LED an PB0 aus
    }
    }
    return 0;

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

1
int main(void)
2
{
3
  DDRB  = 0xFF; // Register B Ausgänge
4
  DDRC  = 0x00; // Register C Eingänge
5
  PORTC = 0xFF; // Register C Pullups ein
6
7
  while (1)
8
  {
9
    if ((PINC & ( 1<<PC4 ))) //wenn PC4 High dann...
10
    {
11
      PORTB |= ( 1<<PB0 );  // LED an PB0 an
12
    }
13
    else
14
    {
15
      PINB &= ~( 1<<PB0 ); // ansonste LED an PB0 aus
16
    }
17
  }
18
  return 0;
19
}

von Frank L. (hermastersvoice)


Lesenswert?

entprell den Taster und Alles wird gut

von Einer K. (Gast)


Lesenswert?

Ein PINB vergessen, in PORTB umzubauen.
1
int main(void)
2
{
3
  DDRB  = 0xFF; // Register B Ausgänge
4
  DDRC  = 0x00; // Register C Eingänge
5
  PORTC = 0xFF; // Register C Pullups ein
6
7
  while (1)
8
  {
9
    if (!(PINC & ( 1<<PC4 ))) //wenn PC4 Low dann...
10
    {
11
      PORTB |= ( 1<<PB0 );  // LED an PB0 an
12
    }
13
    else
14
    {
15
      PORTB &= ~( 1<<PB0 ); // ansonste LED an PB0 aus
16
    }
17
  }
18
  return 0;
19
}

von Guido L. (egudo)


Lesenswert?

Vielen Dank, das umwandeln von Pin in Port brachte den gewünschten 
Erfolg aber warum verwendet man hier den Port-Befehl. Ich dachte wenn 
man einzelne Pins ansteuert oder liest ist der Befehl PIN angebracht und 
wenn man das Register definieren möchte (z.B. Pullups) dann nimmt man 
Ports?

von Einer K. (Gast)


Lesenswert?

Ein Irrtum.

Dann solltest du nochmal das Datenblatt deines µC befragen.
Dort steht recht exakt beschrieben, wie es zusammen hängt.

von Guido L. (egudo)


Lesenswert?

Besten Dank hab es jetzt gerafft.

von Karl M. (Gast)


Lesenswert?

Guido L. schrieb:
> Hey Leute,
> ich als blutiger Anfänger hänge jetzt schon an einer sehr einfachen
> Schaltung fest. Da ich auch begreifen und lernen möchte habe ich nicht
> einfach Beispiele kopiert sondern an denen angelehnt meinen eigenen
> Sourcecode geschrieben. Sinn meiner Schaltung soll sein, dass eine LED
> leuchtet wenn man einen Taster drückt. Lässt man den Taster los soll die
> LED auch ausgehen. Das einschalten der LED funktioniert auch tadellos
> nur aus ausschalten geht nicht immer. Es scheint so als wäre die LED
> beim loslassen des Tasters in keinem definiertem Zustand da sie mal an
> bleibt und mal ausgeht. Leuchtet die LED weiter, leuchtet sie beim
> nächsten Betätigen des Tasters heller. Da ich schon seit Tagen suche
> weiß ich auch nicht ob der Fehler im Sourcecode oder in der Schaltung
> liegt.
>
Hallo,
Deine Schaltung hat noch einen kleinen Fehler, AREF liegt nicht an AVcc 
sondern,
Er erhält nur einen kleinen 100nF Kondensator nach Masse natürlich.

von Guido L. (egudo)


Lesenswert?

Ah ja klar vielen Dank für den Hinweis, hat zwar in diesem Fall nicht 
die Funktion beeinträchtigt aber man will ja von vornherein saubere 
Schaltungen aufbauen sowie saubere Codes schreiben. Also vielen Dank.

Bin generell sehr begeistert wie einem so blutigen Anfänger hier 
geholfen wird, auch wenn er so "banale" Fragen stellt.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Haben alle mal klein angefangen.

von Jörn P. (jonnyp)


Lesenswert?

Wenn du an den Taster Eingang auch noch einen pull up Widerstand hängst,
dann "sieht" der Eingang auch einen definierten Pegel.

von Jens M. (schuchkleisser)


Lesenswert?

Jörn P. schrieb:
> Wenn du an den Taster Eingang auch noch einen pull up Widerstand hängst,
> dann "sieht" der Eingang auch einen definierten Pegel.

Aua:

Guido L. schrieb:
> DDRC = 0x00; // Register C Eingänge
> PORTC = 0xFF; // Register C Pullups ein

Frank L. schrieb:
> entprell den Taster und Alles wird gut

Nö. Die Lampe soll so funktonieren als wäre der µC da gar nicht drin: 
Knopp gedrückt=Licht, loslassen=Dunkelheit.
Da muss nichts entprellt werden.

von neuer PIC Freund (Gast)


Lesenswert?

Hallo Guido.

Benutze ruhig das Atmel Studio. Dort simulierst du deinen Code und 
schaust im IO-Viewer nach den Ports. Da fällt dir in windeseile auf, 
dass sich ein Register ja gar nicht ändert. Und schon ist der Typo 
gefunden.

von Guido L. (egudo)


Lesenswert?

Danke für den Tipp, Atmel Studio verwende ich sogar, habe nur noch 
nichts simuliert, werde mich wohl auch mal da mal mit beschäftigen.

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.