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


von Rafael (Gast)


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;
}

von Karl H. (kbuchegg)


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
}

von Peter (Gast)


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.

von Vlad T. (vlad_tepesch)


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.

von Peter (Gast)


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.

von Rafael (Gast)


Lesenswert?

Hallo,

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

von Karl H. (kbuchegg)


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.

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.