AVR Atmega 328 Hilfe bei LED Taster Schaltung

OP #5833188
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;
Angehängte Dateien:
Gast #5833193
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
}
Gast #5833201
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
}
OP #5833218
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?
Gast #5833485
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.
OP #5834490
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.
#5836128
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.
Gast #5836676
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.

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