Am Anfang bereits gescheitert (LED schalten)

Gast #1930677
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;
}
#1930685
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.
1
include <avr/io.h>
2

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

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

10
  while( 1 )
11
  {
12
    if (PINB & (1 << PB0) )  // Wenn Pin B0 High dann Anweisungsglock ausführen
13
    {
14
      PORTC |= (1 << PORTC0); // Pin0 IO-Register C auf High setzten
15
    }
16
    else
17
    {
18
      PORTC &= ~(1 << PORTC0); // Pin0 IO-Register C auf Low setzten
19
    }
20
  }
21

22
  return 0;
23
}
Gast #1930689
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.
#1932521
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

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