AVR Atmega 328 Hilfe bei LED Taster Schaltung

OP #5833188
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
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
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
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
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
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
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
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

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