www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Am Anfang bereits gescheitert (LED schalten)


Autor: Rafael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab ein kleines Verständnisproblem direkt zum Anfang. Hab nicht viel 
Erfahrung mit MC bzw. C++. Arbeite mich langsam ein. Nun zu meinem 
Problem: Will eine LED mit ATMEGA8 über ein Taster ein- und ausschalten. 
Dies ist mein Versuch der natürlich auf anhieb nicht funktioniert. Was 
mach ich falsch. Ich vermute, dass ich auf Grund der schnellen 
Abarbeitung der if-Anweisung das leuchten nicht mitbekomme. Lieg ich da 
richtig oder ist das ganze was für den A....? Bei der Simulation im 
AVR-Studio klappt das ganze.

#include <avr/io.h>

int main (void)
{
DDRB &= ~ (1 << DDB0); // Pin0 IO-Register B als Eingang
PORTB |=  (1 << PORTB0); // Pullup Pin0 IO-Register B aktivieren


if (PINB != 0)// Wenn Pin B0 High dann Anweisungsglock ausführen
{
DDRC |= (1 << DDC0); // Pin0 IO-Register C als Ausgang
PORTC |= (1 << PORTC0); // Pin0 IO-Register C auf High setzten
}

return 0;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rafael schrieb:
> Hallo,
>
> hab ein kleines Verständnisproblem direkt zum Anfang. Hab nicht viel
> Erfahrung mit MC bzw. C++. Arbeite mich langsam ein. Nun zu meinem
> Problem: Will eine LED mit ATMEGA8 über ein Taster ein- und ausschalten.

Du musst zuallererst einmal wissen, wie denn

* der Defaultzustand des Portpins bei den Tasten ist
* wie sich das einzelne Bit verändert.

Meistens ist es so, dass der Zustand bei nicht gedrücktem Taster eine 1 
ist und nicht 0, so wie du das annimmst.

> {
> DDRC |= (1 << DDC0); // Pin0 IO-Register C als Ausgang
> PORTC |= (1 << PORTC0); // Pin0 IO-Register C auf High setzten
> }

und wo schaltest du den LED Ausgang in den anderen Zustand?

Weiters:
Die Einstellung ob Ausgang oder Eingang, macht man am Programmanfang und 
lässt die dann in Ruhe. Es gibt Ausnahmen, aber bis du zu denen kommst, 
vergeht noch einige Zeit

Auch fehlt dir die zentrale Schleife, in der der µC den Taster immer 
wieder und wieder abfragt und auswertet. Was denkst du? Wieviel Zeit 
vergeht wohl vom Starten des Programms, bis der µC den Tastenport das 
erste mal abfragt? So schnell kannst du nicht mit einer Wimper zucken, 
wie der µC dein Programm durch hat, wenn du da keine Schleife einbaust.
include <avr/io.h>

int main (void)
{
  DDRB &= ~ (1 << DDB0); // Pin0 IO-Register B als Eingang
  PORTB |=  (1 << PORTB0); // Pullup Pin0 IO-Register B aktivieren

  DDRC |= (1 << DDC0); // Pin0 IO-Register C als Ausgang

  while( 1 )
  {
    if (PINB & (1 << PB0) )  // Wenn Pin B0 High dann Anweisungsglock ausführen
    {
      PORTC |= (1 << PORTC0); // Pin0 IO-Register C auf High setzten
    }
    else
    {
      PORTC &= ~(1 << PORTC0); // Pin0 IO-Register C auf Low setzten
    }
  }

  return 0;
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da muss du aber vedammt schnell sein.

Du hast gar keine entlosschleife, damit wird dein programm nur genau 
1mal ausgeführt und das gleich nach dem Reset. Wenn du in diesem Moment 
die Taste drückst sollte die Lampe leuchten.

Den Aus/Eingänge sollte man nur einmal zu beginn festlegen, es macht 
hier kein sinn das in der if bedingung zu machen.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Du hast gar keine entlosschleife, damit wird dein programm nur genau
> 1mal ausgeführt und das gleich nach dem Reset. Wenn du in diesem Moment
> die Taste drückst sollte die Lampe leuchten.

nö, danach resettet sich der controller und das Programm startet von 
vorn.
also eigentlich ist es eine Endlosschleife.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlad Tepesch schrieb:
> nö, danach resettet sich der controller und das Programm startet von
> vorn.
> also eigentlich ist es eine Endlosschleife.

nein macht er nicht, in der C-Runtime ist nach der main eine 
endlosschleife. Aber die macht halt nichts.

Autor: Rafael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für eure Hilfe. Da liegt noch viel Arbeit vor mir.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rafael schrieb:
> Hallo,
>
> danke für eure Hilfe. Da liegt noch viel Arbeit vor mir.

Du kannst dir einiges an Arbeit sparen, wenn du das AVR-GCC-Tutorial 
durchmachst.
Je nachdem die deine C-Kentnisse wirklich sind, kannst du dir weiters 
viel Arbeit ersparen, wenn du zunächst mit einem C-Buch auf dem PC ein 
paar Kapitel des Buches durcharbeitest und erst dann in die Spezialtäten 
einsteigst, die ein µC so zu bieten hat.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.