Forum: Mikrocontroller und Digitale Elektronik LED leuchten lassen


von Tiger (Gast)


Lesenswert?

Hallo folgendes Problem.

Ich möchte mit meinem Atmega8 mehrere LEDs leuchten lassen.

1) Wie mache ich das?

2) Brauche ich einfach den Code nacheinander zum "Starten" der Leds 
eingeben, und sie alle leuchten dann gleichzeitig?

Ich gebe mal ein Anfangs Code von mir:

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

void main (void)

{  DDRB |= (1<<PB0);  //Ausgänge festlegen PB und PD für Fußg.//
              //Rest für normale Ampeln//
  DDRD |= (1<<PD7);
  DDRD |= (1<<PD6);
  DDRD |= (1<<PD5);
  DDRC |= (1<<PC5);
  DDRC |= (1<<PC4);
  DDRC |= (1<<PC3);
  DDRC |= (1<<PC2);
  DDRC |= (1<<PC1);
  DDRC |= (1<<PC0);



do {

PORTD ^= (1<<PD7);      //gelbe Fußgangerampeln blinken
  _delay_ms(5000);

PORTC ^= (1<<PC4);   //gelbe Autoampeln 1 blinken
  _delay_ms(5000);

PORTC ^= (1<<PC1);   //gelbe Autoampeln 2 blinken
  _delay_ms(5000);


//Autoampeln 1 und 2 leuchten gelb

PORTC ^= (1<<PC4);
  _delay_ms(500);

PORTC ^= (1<<PC1);
  _delay_ms(500);

//GElb aus

PORTD |= (1<<PD7); //alle Ampeln sind aus
PORTC |= (1<<PC4);
PORTC |= (1<<PC1);

PORTB ^= (1<<PB0);
  _delay_ms(500); //Fußgänger 1 Rot Ein


PORTD ^= (1<<PD6);   //Fußgänger 2 Rot Ein
  _delay_ms(500);

PORTC ^= (1<<PC5);   //Auto 1 Rot Ein
  _delay_ms(500);

PORTC ^= (1<<PC2);   //Auto 2 Rot Ein
  _delay_ms(500);

PORTC ^= (1<<PC4);   //Auto A1 und A3 kommt gelb dazu
  _delay_ms(500);

PORTD |= (1<<PD6);   // Fußgänger 2,4,6,8 rot aus

PORTD ^= (1<<PD5);   //Fußgänger 2 GRÜN Ein
  _delay_ms(500);

-------------------------
Wie man vllt. erkennt handelt es sich um eine Ampelschaltung.
Nach einer bestimmten Zeit sollen sich die jeweiligen LEDs aufhören zu 
leuchten, und andere sollen leuchten. (wie bei einer Kreuzung)

Also laut meinem Quellcode, ist das ja wie eine LED blinken lasse, aber 
mithilfe der Zeit kann ich doch die Pausendauer einstellen, somit hat es 
doch den Anschein, dass die Ampeln dann leuchten, oder?

Bitte helft mir...bin noch ziemlicher Anfänger in C.

: Verschoben durch User
von Karl H. (kbuchegg)


Lesenswert?

Tiger schrieb:
> Hallo folgendes Problem.
>
> Ich möchte mit meinem Atmega8 mehrere LEDs leuchten lassen.
>
> 1) Wie mache ich das?

Zunächst mal dadurch, dass du im richtigen Forum fragst.
Das hier ist das PC-Programmierungs Forum.

veschoben

von Lehrmann M. (ubimbo)


Lesenswert?

Hallo,

bevor du dir hier böse Kommentare einfängst:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Hier steht alles was du wissen musst.

von Karl H. (kbuchegg)


Lesenswert?

Tiger schrieb:
> Hallo folgendes Problem.
>
> Ich möchte mit meinem Atmega8 mehrere LEDs leuchten lassen.
>
> 1) Wie mache ich das?

Indem du dir zb eine Tabelle machst, in der du festhältst welche LED zu 
welchem Zeitpunkt gleichzeitig leuchten sollen.

Einfach nach dem Umschalten einer LED grundsätzlich immer ein _delay_ms 
hinten nach zu schieben ... das kanns ja wohl nicht sein.

Ein Programm muss geplant werden!

> 2) Brauche ich einfach den Code nacheinander zum "Starten" der Leds
> eingeben, und sie alle leuchten dann gleichzeitig?

Ja


> Wie man vllt. erkennt handelt es sich um eine Ampelschaltung.
> Nach einer bestimmten Zeit sollen sich die jeweiligen LEDs aufhören zu
> leuchten, und andere sollen leuchten. (wie bei einer Kreuzung)

Dann stell erst mal fest welche LED gleichzeitig leuchten sollen und wie 
sich das im Laufe der Zeit verändert
1
Zeitpunkt  Rot1 Gelb1 Grün1   Rot2 Gelb2 Grün2   F1R F1G  F2R F2G
2
-------------------------------------------------------------------
3
   0         *                              *         *    *            
4
 500         *                              *      *       *
5
 700         *                   *                 *       *
6
1000         *    *              *                 *       *
7
1200                     *       *                 *           *
8
......

Das ist dein Plan, den du per Programm realisieren musst.
Im Plan sieht man:
Am Anfang ist die Ampel 1 auf Rot und Ampel 2 auf Grün. Da Ampel 1 auf 
Rot ist, ist die zugehörige Fussgänger Ampel auf grün
Nach 500 Zeiteinheiten geht zunächst die Fussgängerampel aus (auf Rot)
Nach weiteren 200 Zeiteinheiten wechselt die Ampel 2 von Grün auf Rot
300 Einheiten später kommt dann bei Ampel 1 zum Rot noch das gelbe Licht 
dazu. etc. etc.

Wenn dir dann der Ablauf der kompletten Lichtfolge klar ist, dann 
programmierst du das, wobei du natürlich gleichzeitig brennende Lichter 
auch 'gleichzeitig' einschaltest (wenn du das in deinem Programm direkt 
hintereinander machst, ist das schon ok. Die Lichter gehen dann ein paar 
Millionstel Sekunden nacheinander an/aus, das merkt keiner).

Hast du alle Lichter einer Zeile entsprechend ein/aus geschaltet, dann 
machst du mittels _delay eine entsprechende Pause und weiter gehts zur 
nächsten Zeile.

Aber Grundlage von allen ist erst mal die Planung in welcher Reihenfolge 
was passieren muss. Wobei die Zeiten jetzt nicht so sehr das Thema sind. 
_delays kann man auch im Nachhinein noch ändern. Wichtig ist erst mal 
die korrekte Abfolge.

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.