Forum: Mikrocontroller und Digitale Elektronik Lauflicht mit 2 Atmega8


von Lukas M. (luke_)


Lesenswert?

Hallo Leute ,
ich hab da eine Frage und zwar , wie realisiere ich am Besten ein 
Lauflicht mit 2 Atmegas?
1. Atmega steuert 13 Leds an 2.Atmega 23 Leds.
Die Leds stellen 2 Buchstaben dar die synchron durchlaufen sollen(das 
denke ich ist nur eine spielerei mit den Delays). Jedoch fehlt mir 
momentan der Plan wie ich verschieden Ports mit einer Schleife 
nacheinander durchschalte?
Hat da jemand einen Denkanstoss?
mfG

von syn_error (Gast)


Lesenswert?

>Lauflicht mit 2 Atmegas?
warum 2, einer und 5 8bit schieberegister reichen doch auch?

>...Ports mit einer Schleife nacheinander durchschalte?
der 1. atmega gibt die weiteren auf einen ausgang und der 2. liest es 
als eingang ein.
prinzip, zwei shift register koppeln.

von Lukas M. (luke_)


Lesenswert?

Weil ich die Hardware schon vorgegeben habe und sich das jetzt nicht 
mehr ändern lässt.
Funktioniert das mit 2 Atmega?
mfG

von F. K. (Firma: LHC) (tschuesswelt)


Lesenswert?

S

Lukas Migi schrieb:
> Weil ich die Hardware schon vorgegeben habe und sich das jetzt nicht
> mehr ändern lässt.

Schaltplan?

von Lukas M. (luke_)


Angehängte Dateien:

Lesenswert?

Okay hier!

von Thomas K (Gast)


Lesenswert?

Hallo!

Ohne Quarze wird es bald asynchron..

Gruss
thomas

von Peter D. (peda)


Lesenswert?

Thomas K schrieb:
> Ohne Quarze wird es bald asynchron..

Mit aber auch.


@Lukas Migi

Ich rate Dir, erstmal mit einem MC klarzukommen, ehe man sich an 
Mehrprozessorsystemen versucht.
Du fällst sonst aber sowas von auf die Nase.


Peter

von Uwe N. (ex-aetzer)


Lesenswert?

Sehe ich das richtig - du möchtest die AVRs mit 12V versorgen ???

Grusel
Uwe

von Lukas M. (luke_)


Lesenswert?

Nein ich hab nur irrtümlicher Weise nen 7812er genommen ... 
genaugenommen ist ein low drop 7805 drinnen.
Das ganze ist ein Geburtstagsgeschenk und muss bis freitag 
laufen.Gehäuse etc ist alles schon fertig vll noch ein paar Änderungen 
an der Hardware. Ich weiss das es zum Anfangen sicher ein bisschen 
überheblich ist aber ich muss jetzt nochmal die Suppe auslöffeln und 
naja vielleicht lerne ich was dabei.
Grundsätzlich 2 Fragen.
Ist das mit 2 Atmega baubar?
Wie schalte ich mehrere Ports in einer Schleife auf High?


mfG

von Bastler (Gast)


Lesenswert?

Aref nicht auf Vcc legen, nur ein kleiner Kondensator dranhängen.
An Reset ein Pull-Up, nicht direkt auf Vcc.
Wieso Kondensatoren an XTAL1/2 ohne Quarz?

von Vlad T. (vlad_tepesch)


Lesenswert?

eigentlich werden die gar nicht verorgt.
Bei dem Oberen, ört die Verorgungsleitung kurz vor der Kreuzung auf, bei 
dem anderen, ist zumindest bei einem VCC Anschluss kein Punkt.


Aber im ernst:
Wie sollen die syncronisiert werden, wenn die nicht mindestes auf einer 
Leitung verbunden sind?

Wenn Aref nicht benutzt wird, sollte man es auch nicht verbinden, 
höchstens über einen Kondensator.

von Daniel P. (avr-isp-stick)


Lesenswert?

Uwe N. schrieb:
> Sehe ich das richtig - du möchtest die AVRs mit 12V versorgen ???

Ja, aber nur den unteren :-) Zumindest sehe ich nicht, wo der obere µC 
an den Regler angeschlossen sein soll.

Am einfachsten wäre es, wenn du die beiden Atmegas an zwei Pins 
verbindest. Wenn der erste seine LEDs durch hat, zieht er die eine 
Leitung kurz auf Masse. Der andere beginnt dann mit seinem LED-Block und 
tut das selbe, wenn er fertig ist. Dann brauchst du nur zwei Leitungen 
und musst dich nicht mit Protokollen beschäftigen. Schaden würde das 
natürlich nicht.

Schneller hat man das bisschen Logik mit einem NE555 und vier CMOS4017.

von Karl H. (kbuchegg)


Lesenswert?

Lukas Migi schrieb:
> Nein ich hab nur irrtümlicher Weise nen 7812er genommen ...
> genaugenommen ist ein low drop 7805 drinnen.
> Das ganze ist ein Geburtstagsgeschenk und muss bis freitag
> laufen.

Dann wird es wohl das Beste sein, wenn du eine neue Schaltung machst. 
Die Probleme bei der Synchronisierung kriegst du bis Freitag nicht in 
den Griff.
(Du kriegst sie auch später nicht in den Griff, aber das ist eine andere 
Geschichte)

von Lukas M. (luke_)


Lesenswert?

Ich hab mir gedacht einfach mit den delays spielen bis es so halbwigs 
passt.
Es soll nur ein Lauflicht sein das ungfähr gleich läuft ... mehr nicht. 
mfG

Das mit dem Layout werde ich sofort ändern.

von Karl H. (kbuchegg)


Lesenswert?

Lukas Migi schrieb:
> Ich hab mir gedacht einfach mit den delays spielen bis es so halbwigs
> passt.
> Es soll nur ein Lauflicht sein das ungfähr gleich läuft ... mehr nicht.

Sieht doch schei.... aus, wenn die nicht synchron laufen.

von Daniel P. (avr-isp-stick)


Lesenswert?

Ach man darf die µCs gar nicht miteinander verbinden? Dann kannst du das 
mit 2 µCs natürlich schon fast vergessen.

Altenative: Multiplexen mit nur einem Atmega. Dazu findest du hier im 
Forum und im Anfänger-Tutorial ausführliche Anleitungen. Du brauchst 
dann eine LED-Matrix. Wenn du die LEDs auch nicht mehr beliebig anordnen 
kannst, dann schaut's schwarz aus.

von Karl H. (kbuchegg)


Lesenswert?

Wie sind die LED angeordnet? Bilden die 13 bzw. 23 LED schon einen 
Buchstaben? Und was genau soll da eigentlich durchlaufen? Wie hast du 
dir das vorgestellt.

Zu deinem Problem mit dem
"Jedoch fehlt mir
momentan der Plan wie ich verschieden Ports mit einer Schleife
nacheinander durchschalte?
"

das ist so nicht so schwer zu realisiern. Du steuerst einfach immer alle 
3 Ports an. Aus jeweils einem Array holst du dir das Byte, welches auf 
dem jeweiligen Port auszugeben ist.

von Lukas M. (luke_)


Lesenswert?

Also 2Atmegas funktionieren definitiv nicht?
mfG

von Karl H. (kbuchegg)


Lesenswert?

Lukas Migi schrieb:
> Also 2Atmegas funktionieren definitiv nicht?

Solange sie nicht mit mindestens einer Leitung verbunden sind, über die 
der eine dem anderen den Takt vorgeben kann: Es ist ein Kampf gegen 
Windmühlen.

Das ist wie 2 Ruderer in einem Boot, die sich gegenseitig nicht sehen 
können und die keinen Steuermann haben, der den Takt vorgibt. Irgendwann 
verhaken sich die Ruder.

Du machst dir das Problem hier viiiiieel schwieriger als es sein müsste. 
Selbst wenn du noch eine Synchronisierleitung zwischen den Megas 
hinzufügst.

Es ist ein Trugschluss, dass die Dinge einfacher werden, wenn man 
mehrere Prozessoren hat. Ein Prozessor ist immer einfacher als viele. 
Solange der eine die Aufgabe (wie bei dir) mit Links schafft.

von Lukas M. (luke_)


Lesenswert?

Also 13 Leds bilden die Zahl 1 ...23 die Zahl 8.
Das Ganze soll von oben nach unten durchlaufen ... also das Lauflicht 
läuft senkrecht.

mfG

von Karl H. (kbuchegg)


Lesenswert?

Lukas Migi schrieb:
> Also 13 Leds bilden die Zahl 1 ...23 die Zahl 8.
> Das Ganze soll von oben nach unten durchlaufen ... also das Lauflicht
> läuft senkrecht.


Wird zwar im Verbund scheisse aussehen, aber wenn die schnell genug 
durchlaufen, wird man es vielleicht nicht so bemerken. So wie bei der 
Polizei die Blaulichter auf dem Dach auch nicht synchron laufen.

von Karl H. (kbuchegg)


Lesenswert?

Programmtechnisch ist das sowie so eher die Einfachvariante.

Wie gesagt:
In deiner Schleife versorgst du einfach immer alle 3 Ports mit jeweils 
einem Wert aus dem Array. Dann musst du nur noch die Arrays richtig 
befüllen und du bist unterwegs.

1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
struct Entry {
5
  uint8_t  valueB;
6
  uint8_t  valueC;
7
  uint8_t  valueD;
8
};
9
10
struct Entry Values[] =
11
         /* B */      /* C */      /* D */
12
    {  { 0b00000000,  0b00000000,  0b00000000 },
13
       { 0b00000010,  0b00000001,  0b00000100 },
14
       ....
15
    };
16
17
18
int main()
19
{
20
  uint8_t i;
21
22
  DDRB = 0xFF;
23
  DDRC = 0xFF;
24
  DDRD = 0xFF;
25
26
  while( 1 ) {
27
    for( i = 0; i < sizeof( Values ) / sizeof( *Values ); ++i ) {
28
      PORTB = Values[i].valueB;
29
      PORTC = Values[i].valueC;
30
      PORTD = Values[i].valueD;
31
32
      _delay_ms( 20 );
33
    }
34
  }
35
}

jetzt musst du nur noch genügend Einträge in der richtigen Reihenfolge 
im Array machen, damit die Leds so funkeln wie du das haben willst.

Am Besten dazu die LED auf einem Stück Papier aufzeichnen. Die jeweilige 
Port/Pin Bezeichnung daneben. Und für jeden Schritt die LEDs sammeln, 
die leuchten sollen. Das zugehörige Bit im richtigen Port auf 1 (oder 0, 
je nach Verschaltung) setzen, bis du für alle Bits an allen Ports in 
jedem Schritt weißt, ob das eine 1 oder eine 0 sein muss.

von Lukas M. (luke_)


Lesenswert?

Okay Danke! Ich werde das heute nach der Schule gleich ausprobieren!
mfG

von Karl H. (kbuchegg)


Lesenswert?

Vorschlag:
Mach kein Lauflicht, sondern lass die LEDs zufällig funkeln. Dann fällt 
es nicht auf, dass die beiden Ziffern voneinander unabhängig sind.

von Jens (Gast)


Lesenswert?

Hallo Lukas,

wenn ich Dein Projekt richtig verstehe, steuert ein Atmega die 1 und ein 
paar LEDs der 8, der andere die restlichen der 8.

Ohne Verbindung untereinander läuft Dir doch die 8 auseinander. Da 
kannst Du mit delays spielen - aber werden wird es nichts...

Du hast doch die Quarz-Pins frei - ziehe einfach eine Leitung vom ersten 
Proz zum zweiten. Der erste wird so programmiert, wie Karl Heinz es 
beschrieben hat. Zugleich setzt er die Synchronleitung - z.B vor dem 
Setzen der LEDs - und kurz danach wieder zurück - nach den LEDs.

Der andere arbeitet gar nicht mit Delay, sondern folgt im Timing der 
Synchronleitung:
 - Warten, bis sie gesetzt ist
 - LEDs weiterschalten
 - Warten, bis sie nicht mehr gesetzt ist.

Ich denke, das ist einfach und machbar. Lediglich beim Start muss man 
ein wenig aufpassen, damit es nicht gleich unsynchron losgeht...

Ich schreibe Dir gern noch Details dazu - aber wenn Dir die Idee nicht 
gefällt, macht das wenig Sinn...

Gruß
Jens

von Lukas M. (luke_)


Lesenswert?

Die Idee hört sich eigentlich recht gut an!
Nur weiß ich nicht recht wie ich die synchronleitung setzten muss?

mfG

von Jens (Gast)


Lesenswert?

Hallo Lukas,

nehmen wir an, Du nimmst PB7 für die Synchronisation.

Beim 'Master'-Atmega:
  Als Ausgang ist er dank DDRB = 0xFF schon konfiguriert

  Setzen: PORTB |= (1<<7);
  Löschen: PORTB &= ~(1<<7);

Ah, das geht noch etwas eleganter, da Port B ja gleich am Anfang dabei 
ist:

Also sieht die Hauptschleife auf dem Master so aus:
1
  while( 1 ) {
2
    for( i = 0; i < sizeof( Values ) / sizeof( *Values ); ++i ) {
3
      PORTB = Values[i].valueB | (1<<7);  // Daten fuer B und Sync-Port setzen
4
      PORTC = Values[i].valueC;
5
      PORTD = Values[i].valueD;
6
      _delay_ms( 20 );     // Impuls auf 20ms verlängern
7
      PORTB &= ~(1<<7);    // Sync-Port zuruecksetzen
8
      _delay_ms( 20 );     // restliche Wartezeit
9
    }
10
  }
Und jetzt der 'Slave'

Hier muss PB7 Eingang bleiben, also ändert sich eine Zeile der 
Initialisierung:
1
  DDRB = 0x7F;  // PB7 Input, Rest Output
2
  DDRC = 0xFF;
3
  DDRD = 0xFF;
4
5
  while( 1 ) {
6
    for( i = 0; i < sizeof( Values ) / sizeof( *Values ); ++i ) {
7
      while ( ! (PORTB & 0x80) );  // warten auf PB7 high
8
      PORTB = Values[i].valueB;
9
      PORTC = Values[i].valueC;
10
      PORTD = Values[i].valueD;
11
      while ( (PORTB & 0x80) );    // warten auf PB7 low
12
    }
13
  }
So sollte es gehen, probiert habe ich es natürlich nicht. Mit den Zeiten 
wirst Du noch spielen muessen, mir kommen selbst 40ms recht flott vor - 
aber das ist ja kein Akt...

Viel Erfolg!

Jens

von Daniel P. (avr-isp-stick)


Lesenswert?

Das ist doch genau die Variante, die ich in meinem ersten Post schon 
beschrieben habe? Einen Portpin zur Statusanzeige missbrauchen. Nur habe 
ich eben vorgeschlagen eine Leitung pro Chip zu verwenden, damit der 
andere auch weiß, wann er wieder loslegen kann. Das scheint aber in dem 
Fall nicht so wichtig zu sein...?

von Falk B. (falk)


Lesenswert?

@  Lukas Migi (luke_)

>Nur weiß ich nicht recht wie ich die synchronleitung setzten muss?

Tja, denn lernst du heute vielleicht eine viel wichtigere Lektion.

Erst denken, dann löten!

Ehe du mit deinen zwei AVRs ein supercoolesoberdolles 
Multiprozessorsystem zusammenstrickst, solltest du dich lieber 
hinsetzen, die Hardware ändern und dein Lauflicht auf EINEM AVR 
programmieren. Bei deinem Kenntnisstand bist du damit sehr gut 
beschäftigt.

MFG
Falk

von Jens (Gast)


Lesenswert?

Hallo Lukas,

ruhig geworden hier - hast Du schon was gebaut - oder aufgegeben?

Wir sind doch neugierig, also ich jedenfalls...

Gruß
Jens

von Lukas M. (luke_)


Lesenswert?

HI,

tut mir Leid das ich mich so lange nicht gemeldet hab , aber ich hab 
schulisch echt viel zu tun gehabt. Mittlerweile is der Geburtstag vorbei 
jedoch möchte ich das Geschenk nachträglich nochmal überreichen ;)
Ich habe jetzt 2 Leds weggkürzen können somit bleiben nur noch 34 über. 
Deshalb dachte ich mir ob es nicht möglich ist 32LEDs+Transitoren am 
mega32 anzuschließen und die übrigen 2 irgendwie mit multiplexen dazu zu 
mogeln?
Ist diese Idee realierbar?

mfG

von Frank M. (aktenasche)


Lesenswert?

was verkrampfst du dich denn so stark auf diese idee? so was wird so gut 
wie immer mit SIPO-registern gelöst, jeder elektronikladen hat zB den 
74xx595 und viel kosten tut der auch nicht.
ist allemals besser als 32 transistoren auflöten zu müssen.

mega32 heißt btw nicht, dass er 32 i/o pins hat.

von Vuvuzelatus (Gast)


Lesenswert?

>Deshalb dachte ich mir ob es nicht möglich ist 32LEDs+Transitoren am
>mega32 anzuschließen und die übrigen 2 irgendwie mit multiplexen dazu zu
>mogeln?
>Ist diese Idee realierbar?

Ja. Aber es wäre nicht schwieriger, einfach mit einem Atmega8 zum 
Beispiel ein 3-mal-12-Multiplexing zu machen: Drei Zwölferreihen LEDs an 
Port B und C (je Port drei mal sechs LEDs). Macht gesamt 36 LEDs. Mit 
drei Pins von Port D schaltest Du über drei Transistoren die drei Reihen 
ununterbrochen mit so hoher Frequenz (~200 Hz) durch, dass es nicht 
flackert. That's all. Dann hast Du sogar noch fünf Pins an Port D frei, 
z. B. für etwaige Erweiterungen. Die Software ist auch nicht 
kompliziert, wenn man es richtig macht: Ein paar schlaue Arrays, auf 
deren Elemente über Indizes zugegriffen wird, sind der Schlüssel zum 
Erfolg (was übrigens sehr oft zutrifft...).

von Bernadette (Gast)


Lesenswert?

geht doch mit 2 Atmegas, sogar synchron!

Der Master-Atmega gibt seine Anweisungen einfach über die serielle 
Schnittstelle an seinen Slave.

B.

von Lukas M. (luke_)


Lesenswert?

Meint ihr es ist das Beste dieses Vorhaben über einen Atmega8 und 
74hc595 + uln2803 zu lösen?

von Karl H. (kbuchegg)


Lesenswert?

Lukas Migi schrieb:
> Meint ihr es ist das Beste dieses Vorhaben über einen Atmega8 und
> 74hc595 + uln2803 zu lösen?

nächste Lektion
So etwas wie 'das Beste' gibt es nur ganz selten.
Im Zweifelsfall ist 'das Beste' das, was du realisieren kannst :-)

Schieberegister sind sicherlich eine einfache Möglichkeit. 
Hardwaretechnisch gesehen ist Multiplexing einer Matrix noch einfacher. 
Allerdings ist dann die Software ein wenig anspruchsvoller.

Persönlich empfinde ich Schieberegister ala 595 als eine Art Mittelding 
zwischen noch moderatem Hardwareaufwand und denoch moderat bleibendem 
(und vor allen Dingen einfach verstehbarem und erklärbarem) 
Softwareaufwand. Wenn man das Multiplexing einer Matrix erst einmal 
verstanden hat, ist es auch eigentlich sehr simpel. Aber verstehen und 
vor allen Dingen umsetzen können muss man es erst einmal.

von Karl H. (kbuchegg)


Lesenswert?

Bernadette schrieb:
> geht doch mit 2 Atmegas, sogar synchron!
>
> Der Master-Atmega gibt seine Anweisungen einfach über die serielle
> Schnittstelle an seinen Slave.

Natürlich gehts.
Man kann auch eine WLAN Verbindung oder eni Glasfasernetz zwischen den 
Megas einrichten.

Man könnte auch eine IR-LED einrichten über die der eine dem anderen 
seine Befehle im Morsecode an einen IR-Receiver übermittelt.

Oder ...

Merkst du was?

Man kann immer und überall genügend 'Bürokratie' darüberstülpen, so dass 
im wesentlichen nur noch diese Bürokratie am werken ist und die echte 
Arbeit nur noch einen verschwindend geringen Prozentsatz ausmacht :-)

Der Einsatz von 2 Prozessoren, wo es einer alleine dicke auch tut, ist 
der erste Schritt in diese Richtung.

von Lukas M. (luke_)


Lesenswert?

Okay ich werds jetzt nochmal mit 595er probieren , wenn das nicht klappt 
werd ichs bleiben lassen.
Danke trotzdem!

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.