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
>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.
Weil ich die Hardware schon vorgegeben habe und sich das jetzt nicht mehr ändern lässt. Funktioniert das mit 2 Atmega? mfG
S Lukas Migi schrieb: > Weil ich die Hardware schon vorgegeben habe und sich das jetzt nicht > mehr ändern lässt. Schaltplan?
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
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
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?
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.
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.
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)
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.
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.
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.
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.
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.
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
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.
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.
Okay Danke! Ich werde das heute nach der Schule gleich ausprobieren! mfG
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.
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
Die Idee hört sich eigentlich recht gut an! Nur weiß ich nicht recht wie ich die synchronleitung setzten muss? mfG
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
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...?
@ 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
Hallo Lukas, ruhig geworden hier - hast Du schon was gebaut - oder aufgegeben? Wir sind doch neugierig, also ich jedenfalls... Gruß Jens
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
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.
>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...).
geht doch mit 2 Atmegas, sogar synchron! Der Master-Atmega gibt seine Anweisungen einfach über die serielle Schnittstelle an seinen Slave. B.
Meint ihr es ist das Beste dieses Vorhaben über einen Atmega8 und 74hc595 + uln2803 zu lösen?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.