Doppel- Wechselblitzer Schaltung
Moderator: T.Hoffmann
Geht wie schon gesagt über einen Timer-Interrupt. Ist aber dann natürlich nicht mehr ganz so simpel zu steuern. Im Prinzip läuft es so: Du deklarierst einen Timer der z.B. 1000 mal pro Sekunde gestartet wird. Dieser Programmteil 'prüft' dann, was als nächstes zu tun ist. Z.B. Drehschalter hat sich geändert=> Anderes Programm verwenden; hierzu die nötigen Variablen initialisieren und ggf. starten. Oder die 'Pausenzeit' im Programm 2 ist abgelaufen=> Nächsten Zustand schalten.
Wenn 'nichts besonderes' zu tun ist, werden nur die entsprechenden Pausen-Variablen erhöht.
Wenn 'nichts besonderes' zu tun ist, werden nur die entsprechenden Pausen-Variablen erhöht.
Nicht so schnell Borax,
timer wäre sicher etwas profesioneller um wirklich ein weiteres Programm laufen zu lassen, folgende einfache Implementierung wäre aber auch denkbar:
Also einfach erweitern ..., mit dem timing muss man so, oder so aufpassen - nicht dass es mal schneller und langsamer läuft. Da sollte man generell einen Timer benutzen um die Abfrage deterministisch zu erledigen.
timer wäre sicher etwas profesioneller um wirklich ein weiteres Programm laufen zu lassen, folgende einfache Implementierung wäre aber auch denkbar:
Code: Alles auswählen
Do 'Schleife beginnen
'Eingang1 (PB0) = '12V Eingang'; keine Ahnung wofür der gut ist
'Hier mal zum Ein/Ausschalten
If Eingang1 = 0 Then 'Eingang ist gegen Masse geschaltet
'Drehschalter prüfen
If Eingang2 = 0 Then
Gosub Programm1
End If
. . .
If Eingang7 = 0 Then
Gosub Programm6
End If
'HIER DIE ÜBERPRÜFUNG DER DER ZUSÄTZLICHEN EINGÄNGE/DES SCHALTERS
If EingangKippSchalter = 0 Then
Gosub ProgrammSchalter
End If
Else
Muster = &B00000000
Gosub Ausgeben
End If
LoopIch nehm alles zurück, hab gerade erst geschaut wie du die Blinkerschaltungen realisierst .... da geht wirklich nur mit Timer. Dann darfst für deine Pausen in den einzelnen Programmen aber kein Waitms verwenden (oder wird das mit einem Timer realisiert?).
Wird auf alle fälle etwas komplizierter...
Wird auf alle fälle etwas komplizierter...
Also so würde ich das machen... siehe Anhang.
Der Code ist nicht mehr ganz so einfach wie beim ersten Listing, aber IMHO verständlich genug. Auf alle Fälle solltest Du damit in der Lage sein, die nötigen Anpassungen zu machen, um Deine Ideen umzusetzen. Wesentlich komplizierter sollte es aber jetzt nicht mehr werden, sonst reicht die Bascom Demo nicht mehr (Max. Code Größe=4k). Mein Beispiel hat ~2K...
Der Code ist nicht mehr ganz so einfach wie beim ersten Listing, aber IMHO verständlich genug. Auf alle Fälle solltest Du damit in der Lage sein, die nötigen Anpassungen zu machen, um Deine Ideen umzusetzen. Wesentlich komplizierter sollte es aber jetzt nicht mehr werden, sonst reicht die Bascom Demo nicht mehr (Max. Code Größe=4k). Mein Beispiel hat ~2K...
- Dateianhänge
-
- Test_Mega8_Blinker2.zip
- (2.02 KiB) 355-mal heruntergeladen
Hi kannst du nochmal grade drüber gucken? Habe da mit den Ausgängen und Programmen was geändert. Ganz unten und oben im Programm. Die AUS-Stellung soll sein wenn kein Eingang geschaltet ist!
- Dateianhänge
-
- Mega8_Blinker2.zip
- Programm
- (2.12 KiB) 329-mal heruntergeladen
Passt.
Das einzige, was ggf. ein Problem werden könnte:
Hier ist Kanal_a1/2/3 mehrfach benannt. D.h. Kanal_a1 Alias Portb.8 wird überschrieben mit Kanal_a1 Alias Portc.5. Da aber diese Alias Definitionen nur als Kommentar hier stehen und im aktuellen Programm nicht verwendet werden, spielt es auch keine Rolle.
Das einzige, was ggf. ein Problem werden könnte:
Code: Alles auswählen
'Ausgänge benennen (falls man sie einzeln benutzen will)
'Kanal_a1 Alias Portb.8
'Kanal_a2 Alias Portb.7
'Kanal_a3 Alias Portb.6
'Kanal_a4 Alias Portb.5
'Kanal_a5 Alias Portb.4
'Kanal_a3 Alias Portc.3
'Kanal_a2 Alias Portc.4
'Kanal_a1 Alias Portc.5
So, habe den kram soweit fertig. Nur:
Programm 1: OK
Programm 2: OK
Programm 3: Leuchtet nur Kanal 2 und 3
Programm 4: Leuchtet nur Kanal 6 und 5
Programm 5 OK
Pr0gramm 6: Macht wirres zeug. Flackert in allen möglichen Varianten, nur nicht wie es soll
Programme lassen sich nicht über den Zusatzschalter ausschalten. Also wenn ich die Masse komplett an allen Eingängen wegnehme.
Zusatzprogramm b Läuft Einwandfrei
Dann habe ich noch zwei kleine Problemchen:
1. Irgendwie Glimmen die LED´s leicht als wäre der Transistor irgendwie "undicht". Kann man da was gegen tun?
2. Kann man Spannungsregler ohne weiteres irgendwie parallel schalten? Der wird verdammt warm.
Programm 1: OK
Programm 2: OK
Programm 3: Leuchtet nur Kanal 2 und 3
Programm 4: Leuchtet nur Kanal 6 und 5
Programm 5 OK
Pr0gramm 6: Macht wirres zeug. Flackert in allen möglichen Varianten, nur nicht wie es soll
Programme lassen sich nicht über den Zusatzschalter ausschalten. Also wenn ich die Masse komplett an allen Eingängen wegnehme.
Zusatzprogramm b Läuft Einwandfrei
Dann habe ich noch zwei kleine Problemchen:
1. Irgendwie Glimmen die LED´s leicht als wäre der Transistor irgendwie "undicht". Kann man da was gegen tun?
2. Kann man Spannungsregler ohne weiteres irgendwie parallel schalten? Der wird verdammt warm.
1. Kannst Du mal einen 'Gesamt-Schaltplan' posten? Das hilft bei der Fehlersuche.
Zu 2: Kann man Spannungsregler ohne weiteres irgendwie parallel schalten?
Nein. Man kann allerdings 'stärkere' verwenden und/oder dieselben kühlen. Möglicherweise kann man auch was parallel schalten, aber dazu brauche ich den Schaltplan. Wegen Programm 3,4,6: Schau ich mir morgen noch mal in Ruhe an.
[EDIT]
Je länger ich darüber nachdenke, desto eher glaube ich an einen Kurzschluss (vmtl. irgendwo bei den PORTB Pins). Das würde viel erklären:
1. 5V Regler wird heiß (bei einem Kurzschluss zwischen einem Pin der 5V hat und einem anderen der 0V haben soll fließt viel zu viel Strom!).
2. Die Programme, bei denen immer nur ein Kanal an ist, laufen ok, wenn mehrere Kanäle gleichzeitig an sein sollen, nicht (=> Kurzschluss zwischen einem Kanal der an sein soll und einem der aus sein soll).
3. LEDs gehen nicht richtig aus
Zu 2: Kann man Spannungsregler ohne weiteres irgendwie parallel schalten?
Nein. Man kann allerdings 'stärkere' verwenden und/oder dieselben kühlen. Möglicherweise kann man auch was parallel schalten, aber dazu brauche ich den Schaltplan. Wegen Programm 3,4,6: Schau ich mir morgen noch mal in Ruhe an.
[EDIT]
Je länger ich darüber nachdenke, desto eher glaube ich an einen Kurzschluss (vmtl. irgendwo bei den PORTB Pins). Das würde viel erklären:
1. 5V Regler wird heiß (bei einem Kurzschluss zwischen einem Pin der 5V hat und einem anderen der 0V haben soll fließt viel zu viel Strom!).
2. Die Programme, bei denen immer nur ein Kanal an ist, laufen ok, wenn mehrere Kanäle gleichzeitig an sein sollen, nicht (=> Kurzschluss zwischen einem Kanal der an sein soll und einem der aus sein soll).
3. LEDs gehen nicht richtig aus
Also, der Regler der zu heiß wird ist ein 12V Regler 78S12 für die LED´s. Der soll 2A aushalten. Da hängen auch wenn alle 400LED´s dran hängen gerechnet 1,8A dran. Hoffe, du kannst was mit der Schaltung anfangen. Musste die mit eagle machen, da ich sonst nix hab. Ich denke da stimmt irgendwas mit den zuordnungen im programm nicht die ich da geändert habe.
Gruß Wiessje
Gruß Wiessje
- Dateianhänge
-
Schaltung.pdf- (21.34 KiB) 413-mal heruntergeladen
Ach so. Da hängt es natürlich stark davon ab, wie groß die Differenz zwischen Eingangsspannung und den 12V ist. Aber selbst bei der üblichen 'minimalen' Differenz von 2V muss der Regler bei 1.8A fast 4W verbraten. Das schafft der ohne Kühlkörper nicht. Im Schaltplan kann ich bisher keine Fehler entdecken. Bitte trotzdem mal alle PORT Pins gegeneinander messen. Auch interessant wäre der Strom der vom 5V Regler zum Atmega geht. Sollten eigentlich höchstens 30mA sein. Zum Testen/Fehlersuche ist es auch oft hilfreich ein 'Testprogram' zu verwenden. Z.B. Pausen auf 30 Sekunden, auch mal alle LEDs an... So kann man besser messen ob und wo ein Fehler sein könnte (wenn es im Viertelsekundentakt blinkt, hast Du keine Chance, mit einem Multimeter irgendwas sinnvolles zu messen. Da würde nur ein Speicheroszi helfen). So kannst Du z.B. auch messen, welche Spannung an der Basis der Transistoren anliegt, wenn diese 'aus' sein sollen. Sollte hier tatsächlich eine Spannung > 0.4V anliegen (ich wüsste allerdings nicht warum), kannst Du mal testweise einen 30K-100K Widerstand über Basis-Emitter löten. Dann sollte der Transistor aber sicher sperren.Also, der Regler der zu heiß wird ist ein 12V Regler 78S12 für die LED´s.
EDIT:
Fehler im Programm gefunden...
Code: Alles auswählen
Programm3:
If Prog_a_time > Prog_a_pause Then
Select Case Prog_a_state
Case 1
Muster = &B01000000
Gosub Ausgeben
Prog_a_pause = 3 '300 ms Pause
Case 2
Muster = &B01100000
Gosub Ausgeben
Prog_a_pause = 3
Case 3
Muster = &B01110000
Prog_a_pause = 3
Case 4
Muster = &B01111000
Prog_a_pause = 3
Case 5
Muster = &B01111100
Prog_a_pause = 3
Case 6
Muster = &B01111110
Prog_a_pause = 3
Case 7
Muster = &B00000000
Prog_a_pause = 2
Case 8
Muster = &B01111110
Prog_a_pause = 2
Case 9
Muster = &B00000000
Prog_a_pause = 2
Case 10
Muster = &B01111110
Prog_a_pause = 2
Case 11
Muster = &B00000000
Prog_a_pause = 3
Prog_a_state = 0 'von vorne
Case Else : Prog_a_state = 0 'kann eigentlich nicht vorkommen, aber sicher ist sicher
End Select
Incr Prog_a_state
Prog_a_time = 1
End If
Return
'--------------------------
Programm4:
If Prog_a_time > Prog_a_pause Then
Select Case Prog_a_state
Case 1
Muster = &B00000010
Gosub Ausgeben
Prog_a_pause = 3 '300 ms Pause
Case 2
Muster = &B00000110
Gosub Ausgeben
Prog_a_pause = 3
Case 3
Muster = &B00001110
Prog_a_pause = 3
Case 4
Muster = &B00011110
Prog_a_pause = 3
Case 5
Muster = &B00111110
Prog_a_pause = 3
Case 6
Muster = &B01111110
Prog_a_pause = 3
Case 7
Muster = &B00000000
Prog_a_pause = 2
Case 8
Muster = &B01111110
Prog_a_pause = 2
Case 9
Muster = &B00000000
Prog_a_pause = 2
Case 10
Muster = &B01111110
Prog_a_pause = 2
Case 11
Muster = &B00000000
Prog_a_pause = 3
Prog_a_state = 0 'von vorne
Case Else : Prog_a_state = 0 'kann eigentlich nicht vorkommen, aber sicher ist sicher
End Select
Incr Prog_a_state
Prog_a_time = 1
End If
Return
Also so:
Code: Alles auswählen
Programm3:
If Prog_a_time > Prog_a_pause Then
Select Case Prog_a_state
Case 1
Muster = &B01000000
Prog_a_pause = 3 '300 ms Pause
Case 2
Muster = &B01100000
Prog_a_pause = 3
Case 3
Muster = &B01110000
Prog_a_pause = 3
Case 4
Muster = &B01111000
Prog_a_pause = 3
Case 5
Muster = &B01111100
Prog_a_pause = 3
Case 6
Muster = &B01111110
Prog_a_pause = 3
Case 7
Muster = &B00000000
Prog_a_pause = 2
Case 8
Muster = &B01111110
Prog_a_pause = 2
Case 9
Muster = &B00000000
Prog_a_pause = 2
Case 10
Muster = &B01111110
Prog_a_pause = 2
Case 11
Muster = &B00000000
Prog_a_pause = 3
Prog_a_state = 0 'von vorne
Case Else : Prog_a_state = 0 'kann eigentlich nicht vorkommen, aber sicher ist sicher
End Select
Gosub Ausgeben
Incr Prog_a_state
Prog_a_time = 1
End If
Return
Code: Alles auswählen
'--------------------------
Get_prog_a_type:
'Drehschalter prüfen
Prog_a_type = 0
If Eingang1 = 0 Then Prog_a_type = 1
If Eingang2 = 0 Then Prog_a_type = 2
If Eingang3 = 0 Then Prog_a_type = 3
If Eingang4 = 0 Then Prog_a_type = 4
If Eingang5 = 0 Then Prog_a_type = 5
If Eingang6 = 0 Then Prog_a_type = 6
Return
'--------------------------
Zuletzt geändert von Borax am Di, 16.12.08, 11:34, insgesamt 1-mal geändert.
Also die Ports habe ich alle gemessen. Da ist mal nichts auffälliges. Die Leds leuchten auch nicht immer alle ist nur ein Cluster dass leicht glimmt. Und das auch nur wenn dich Schaltung schon etwa 1min läuft. Vieleicht hat der Transistor auch einen schuss. Ansonsten lauft das Programm ja auch einwandfrei, nur eben die Programme 3,4 und 6 nicht.
Kann ich da denn einen Spannungsregler parallel dazu schalten oder klappt das nicht?
Also an der Basis vom betroffenen Transistor messe ich wenn er aus sein soll 0,11V die nicht vom Atmega kommen. die sind alle 0V
Zwischen Atmega und dem Widerstand habe ich 0,01V habe keine Ahnung wo die her kommen sollen.
Kann ich da denn einen Spannungsregler parallel dazu schalten oder klappt das nicht?
Also an der Basis vom betroffenen Transistor messe ich wenn er aus sein soll 0,11V die nicht vom Atmega kommen. die sind alle 0V
Zwischen Atmega und dem Widerstand habe ich 0,01V habe keine Ahnung wo die her kommen sollen.
- Sailor
- Moderator
- Beiträge: 9427
- Registriert: Di, 28.11.06, 22:16
- Wohnort: Saarland, Deutschland und die Welt
Wenn 2 Spannungsregler parallel geschaltet werden dann geht das mit ganz großer Sicherheit schief, weil sie sich gegenseitig beeinflussen und aufschwingen.
Da der Spannungsregler ausreicht ist es einfacher, einen kleinen Alu-Kühlkörper anzubringen.
Da der Spannungsregler ausreicht ist es einfacher, einen kleinen Alu-Kühlkörper anzubringen.
Wegen Programm 3+4 siehe oben (nicht über die geänderten Pausen-Zeiten wundern, im Simulator sind Pausen mit 300ms einfach zu lang
).
Du kannst zwar Spannungsregler nicht direkt parallel schalten, aber die Last 'aufteilen'. Sprich einen Regler für die Kanäle 1-3 und den Zweiten für die Kanäle 4-7. Die Out Pins dieser beiden Regler dürfen NICHT verbunden werden. Außderdem würde ich denen noch jeweils einen eigenen Ausgangskondensator mit etwa 0.1-1µF spendieren (möglichst nahe an den Beinchen).
[EDIT]
Wegen Programm 6
Versuche mal das Programm einfach zu 'verdoppeln':
Vielleicht hilft es.
Also mit 0.11V schaltet ein normaler Transistor nichts (Kollektor-Emitter Widerstand im Megaohmbereich). Vmtl. ist der wirklich hin.Also an der Basis vom betroffenen Transistor messe ich wenn er aus sein soll 0,11V
Du kannst zwar Spannungsregler nicht direkt parallel schalten, aber die Last 'aufteilen'. Sprich einen Regler für die Kanäle 1-3 und den Zweiten für die Kanäle 4-7. Die Out Pins dieser beiden Regler dürfen NICHT verbunden werden. Außderdem würde ich denen noch jeweils einen eigenen Ausgangskondensator mit etwa 0.1-1µF spendieren (möglichst nahe an den Beinchen).
[EDIT]
Wegen Programm 6
Versuche mal das Programm einfach zu 'verdoppeln':
Code: Alles auswählen
'--------------------------
Programm6:
'Lauflicht Mitte nach außen
If Prog_a_time > Prog_a_pause Then
Select Case Prog_a_state
Case 1
Muster = &B00011000
Prog_a_pause = 300 '300 ms Pause
Case 2
Muster = &B01100110
Prog_a_pause = 300 '300 ms Pause
Case 3
Muster = &B00011000
Prog_a_pause = 300 '300 ms Pause
Case 4
Muster = &B01100110
Prog_a_pause = 300 '300 ms Pause
Prog_a_state = 0 'von vorne
Case Else : Prog_a_state = 0 'kann eigentlich nicht vorkommen, aber sicher ist sicher
End Select
Gosub Ausgeben
Incr Prog_a_state
Prog_a_time = 1
End If
Return
Ganz einfach:
Da hier dann kein Eingang =0 ist, ändert sich an der Variable Prog_a_type gar nichts.
Daher (wie oben schon mal beschrieben) zuerst Prog_a_type = 0 setzen, dann prüfen ob doch ein Eingang beschaltet ist:
Falls alle = 1 (also kein Eingang mit Masse verbunden) bleibt Prog_a_type = 0, was oben im Code über den 'Case else' Fall zu Muster=0 führt.
Code: Alles auswählen
Get_prog_a_type:
'Drehschalter prüfen
If Eingang1 = 0 Then Prog_a_type = 1
If Eingang2 = 0 Then Prog_a_type = 2
If Eingang3 = 0 Then Prog_a_type = 3
If Eingang4 = 0 Then Prog_a_type = 4
If Eingang5 = 0 Then Prog_a_type = 5
If Eingang6 = 0 Then Prog_a_type = 6
Return
Daher (wie oben schon mal beschrieben) zuerst Prog_a_type = 0 setzen, dann prüfen ob doch ein Eingang beschaltet ist:
Code: Alles auswählen
Get_prog_a_type:
'Drehschalter prüfen
Prog_a_type = 0
If Eingang1 = 0 Then Prog_a_type = 1
If Eingang2 = 0 Then Prog_a_type = 2
If Eingang3 = 0 Then Prog_a_type = 3
If Eingang4 = 0 Then Prog_a_type = 4
If Eingang5 = 0 Then Prog_a_type = 5
If Eingang6 = 0 Then Prog_a_type = 6
ReturnHallo, glaube den Fehler endlich gefunden zu haben. Kann es sein, dass der atmega es nicht mag, dass mehr als 3 Ausgänge geschaltet haben? Oder kann es evtl. sein, dass dann die Spannung zu sehr zusammen bricht? Wenn ja, was kann man denn da gegen tun?
Also, die Spannung liegt bei durchschnittlich 5V. Aber irgendwie macht der trotzdem mucken.
Was bewirkt eigendlich dieser 100nF Kondensator?
Gruß Wiessje
Also, die Spannung liegt bei durchschnittlich 5V. Aber irgendwie macht der trotzdem mucken.
Was bewirkt eigendlich dieser 100nF Kondensator?
Gruß Wiessje
@Wiessje: Da liegt das Problem bestimmt nicht. Der Mega mags nur nicht, wenn mehr als max 40mA gezogen werden oder insgesamt mehr als 250mA. Mehr dazu findest du im rund 300seitigen Datenblatt. Mit dem Mega alle Ausgänge gleichzeitig zu schalten ist kein Problem.
Eigentlich nicht. Das sind maximal 15 mA pro Ausgang. 8 mal das ganze sind auch nur 120 mA. Das müsste der Atmel problemlos schaffen. Um das näher zu testen, kannst Du ja mal die 300Ohm mit etwa 1K ersetzen. Dann kannst Du zwar nicht mehr so viele LEDs schalten, aber für Testzwecke ist das ja auch nicht erforderlich.
Kannst Du das etwas genauer spezifizieren?Aber irgendwie macht der trotzdem mucken.
Der macht dann undefinierte Blitztakte die er garnicht soll. Habe jetz mal programm 1 und 2 mal auf Programm 3 und 4 kopiert. Das funktioniert einwandfrei. Nur sobald er mehr als drei Ausgänge schalten soll macht er undefinierbare Blink und Blitzfolgen. Habe auch ein Programm gemacht in dem er alle Ausgänge blinken lässt, das macht er manchmal aber dann muss ich ihm die Spannung komplett weg nehmen, sonst schaltet er die Programme nicht mehr um
Der macht dann undefinierte Blitztakte die er garnicht soll. Habe jetz mal programm 1 und 2 mal auf Programm 3 und 4 kopiert. Das funktioniert einwandfrei. Nur sobald er mehr als drei Ausgänge schalten soll macht er undefinierbare Blink und Blitzfolgen. Habe auch ein Programm gemacht in dem er alle Ausgänge blinken lässt, das macht er manchmal aber dann muss ich ihm die Spannung komplett weg nehmen, sonst schaltet er die Programme nicht mehr um.
Was bewirkt denn eigendlich der 100nF Kondensator?
Was bewirkt denn eigendlich der 100nF Kondensator?
Der sollte eigentlich solche 'undefinierten' Zustände verhindern, indem er die 5V Versorgung 'puffert'.Was bewirkt denn eigendlich der 100nF Kondensator?
Das klingt wirklich nach Spannungseinbruch (und Reset des Chips). Hast Du mal gemessen, was der Atmel an Strom zieht?Der macht dann undefinierte Blitztakte die er garnicht soll.
Hab den Kondensator nämlich vergessen. Den werde ich dann mal rein machen und gucken was passiert. Aber Eingangsseitig hab ich auf den nicht belegten pins immer ca. 4,8V. Habe Jetzt mal ein Programm gemacht, elches ein Muster 01111110 - 00000000 Blinkend abgibt. Nach ca. 10s nach dem Einschalten läuft das programm. Vorher, also innerhalb der 10s, gibt es auch wieder komische sachen von sich. Strom messen ist etwas problematisch. Dafür müsste ich die Leiterbahn auftrennen.
Meinst du es könnte an dem Kondensator liegen?
Der Atmel wird auch nicht warm oder so. Habe auch schon einen 78S05 als Spannungsregler rein gemcht um die Spannungseinbrüche weitestgehend zu verhindern.
Gruß Wießje
Meinst du es könnte an dem Kondensator liegen?
Der Atmel wird auch nicht warm oder so. Habe auch schon einen 78S05 als Spannungsregler rein gemcht um die Spannungseinbrüche weitestgehend zu verhindern.
Gruß Wießje



