mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lauflicht mit 2 Atmega8


Autor: Lukas Migi (luke_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: syn_error (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lukas Migi (luke_)
Datum:

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

Autor: F. K. (Firma: LHC) (tschuesswelt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
S

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

Schaltplan?

Autor: Lukas Migi (luke_)
Datum:
Angehängte Dateien:
  • preview image for uC.png
    uC.png
    13,6 KB, 1008 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Okay hier!

Autor: Thomas K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ohne Quarze wird es bald asynchron..

Gruss
thomas

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe N. (ex-aetzer)
Datum:

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

Grusel
Uwe

Autor: Lukas Migi (luke_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel P. (avr-isp-stick)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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)

Autor: Lukas Migi (luke_)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel P. (avr-isp-stick)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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.

Autor: Lukas Migi (luke_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also 2Atmegas funktionieren definitiv nicht?
mfG

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

Bewertung
0 lesenswert
nicht 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.

Autor: Lukas Migi (luke_)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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.

#include <avr/io.h>
#include <util/delay.h>

struct Entry {
  uint8_t  valueB;
  uint8_t  valueC;
  uint8_t  valueD;
};

struct Entry Values[] =
         /* B */      /* C */      /* D */
    {  { 0b00000000,  0b00000000,  0b00000000 },
       { 0b00000010,  0b00000001,  0b00000100 },
       ....
    };


int main()
{
  uint8_t i;

  DDRB = 0xFF;
  DDRC = 0xFF;
  DDRD = 0xFF;

  while( 1 ) {
    for( i = 0; i < sizeof( Values ) / sizeof( *Values ); ++i ) {
      PORTB = Values[i].valueB;
      PORTC = Values[i].valueC;
      PORTD = Values[i].valueD;

      _delay_ms( 20 );
    }
  }
}

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.

Autor: Lukas Migi (luke_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay Danke! Ich werde das heute nach der Schule gleich ausprobieren!
mfG

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

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lukas Migi (luke_)
Datum:

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

mfG

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  while( 1 ) {
    for( i = 0; i < sizeof( Values ) / sizeof( *Values ); ++i ) {
      PORTB = Values[i].valueB | (1<<7);  // Daten fuer B und Sync-Port setzen
      PORTC = Values[i].valueC;
      PORTD = Values[i].valueD;
      _delay_ms( 20 );     // Impuls auf 20ms verlängern
      PORTB &= ~(1<<7);    // Sync-Port zuruecksetzen
      _delay_ms( 20 );     // restliche Wartezeit
    }
  }
Und jetzt der 'Slave'

Hier muss PB7 Eingang bleiben, also ändert sich eine Zeile der 
Initialisierung:
  DDRB = 0x7F;  // PB7 Input, Rest Output
  DDRC = 0xFF;
  DDRD = 0xFF;

  while( 1 ) {
    for( i = 0; i < sizeof( Values ) / sizeof( *Values ); ++i ) {
      while ( ! (PORTB & 0x80) );  // warten auf PB7 high
      PORTB = Values[i].valueB;
      PORTC = Values[i].valueC;
      PORTD = Values[i].valueD;
      while ( (PORTB & 0x80) );    // warten auf PB7 low
    }
  }
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

Autor: Daniel P. (avr-isp-stick)
Datum:

Bewertung
0 lesenswert
nicht 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...?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lukas,

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

Wir sind doch neugierig, also ich jedenfalls...

Gruß
Jens

Autor: Lukas Migi (luke_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank Meier (aktenasche)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vuvuzelatus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...).

Autor: Bernadette (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht doch mit 2 Atmegas, sogar synchron!

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

B.

Autor: Lukas Migi (luke_)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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.

Autor: Lukas Migi (luke_)
Datum:

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

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.