Doppel- Wechselblitzer Schaltung

Fragen zu Schaltungen, Elektronik, Elektrik usw.

Moderator: T.Hoffmann

Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mi, 10.12.08, 16:55

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...
Dateianhänge
Test_Mega8_Blinker2.zip
(2.02 KiB) 355-mal heruntergeladen
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Mo, 15.12.08, 13:42

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
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mo, 15.12.08, 14:37

Passt.

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
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.
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Mo, 15.12.08, 18:23

wobei, ich da nix geändert habe. Aber die kann ich ja auch noch um schreiben
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Mo, 15.12.08, 22:10

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.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mo, 15.12.08, 23:40

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
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Di, 16.12.08, 09:43

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
Dateianhänge
Schaltung.pdf
(21.34 KiB) 414-mal heruntergeladen
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Di, 16.12.08, 10:42

Also, der Regler der zu heiß wird ist ein 12V Regler 78S12 für die LED´s.
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.

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
Ab Case 3 fehlt 'Gosub Ausgeben' Wobei der code eigentlich 'doof' ist. Einfacher wäre es, das 'Gosub Ausgeben' Statement immer nach 'End Select' zu setzen, dann reicht es einmal...
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
Außerdem muss in das Unterprogramm Get_prog_a_type ('Drehschalter prüfen) als erste Zeile Prog_a_type = 0 gesetzt werden, da ja keine Schalterstellung mehr für das 'Nullsetzen' da ist. Also Alles aus wenn keine Bedingung zutrifft:

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.
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Di, 16.12.08, 11:18

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.
Benutzeravatar
Sailor
Moderator
Beiträge: 9427
Registriert: Di, 28.11.06, 22:16
Wohnort: Saarland, Deutschland und die Welt

Di, 16.12.08, 11:30

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.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Di, 16.12.08, 11:41

Wegen Programm 3+4 siehe oben (nicht über die geänderten Pausen-Zeiten wundern, im Simulator sind Pausen mit 300ms einfach zu lang :D).
Also an der Basis vom betroffenen Transistor messe ich wenn er aus sein soll 0,11V
Also mit 0.11V schaltet ein normaler Transistor nichts (Kollektor-Emitter Widerstand im Megaohmbereich). Vmtl. ist der wirklich hin.
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
Vielleicht hilft es.
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Di, 16.12.08, 13:38

Werde ich gleich mal machen, aber woran liegt das denn wenn ich mit dem einen Schalter die Masse direkt weg nehme, dass das programm dann weiter läuft?
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Di, 16.12.08, 14:08

Ganz einfach:

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
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:

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
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.
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Do, 18.12.08, 20:30

Hallo, 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
Benutzeravatar
Fightclub
Post-Hero
Post-Hero
Beiträge: 5114
Registriert: Mi, 01.03.06, 18:40

Do, 18.12.08, 20:57

@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.
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Do, 18.12.08, 21:48

Also kann es sein, das der Fehler dadrin liegt, dass ich mit je 300 zur Basis des Transistors gehe und das ganze 8mal?
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Do, 18.12.08, 22:40

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.
Aber irgendwie macht der trotzdem mucken.
Kannst Du das etwas genauer spezifizieren?
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Fr, 19.12.08, 06:29

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
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Fr, 19.12.08, 06:29

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?
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Fr, 19.12.08, 23:07

Was bewirkt denn eigendlich der 100nF Kondensator?
Der sollte eigentlich solche 'undefinierten' Zustände verhindern, indem er die 5V Versorgung 'puffert'.
Der macht dann undefinierte Blitztakte die er garnicht soll.
Das klingt wirklich nach Spannungseinbruch (und Reset des Chips). Hast Du mal gemessen, was der Atmel an Strom zieht?
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Sa, 20.12.08, 10:38

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
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Sa, 20.12.08, 14:33

...Hab den Kondensator nämlich vergessen
Das könnte tatsächlich der Grund sein. Wenn es erst nach 10s sauber läuft, klingt es nach schlechtem 'Einschwingen' des internen Taktgenerators.
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

Sa, 20.12.08, 17:27

Ich habe irgendwie das gefühl, dass der innerhalb der 10s noch die anderen Programme teilweise abfragt wegen nem evtl. Spannungsfall. Naja, dann probiere ichs mal mit dem Kondensator.
Wiessje
Super-User
Super-User
Beiträge: 61
Registriert: Mo, 10.11.08, 21:33

So, 21.12.08, 12:11

So, Das mit dem Kondensator hat funktioniert. Hatte leider nur noch einen 1µF aber Programm 6 läuft jetzt einwandfrei. Nur die Programme 3 + 4 machen immer noch das selbe.:

01000000 01100000 fertig, dann nach 1-2 sek wieder von vorne. Kann es sein, das da irgendwas mit den zuweisungen nicht stimmt? Weil die Zeit bis er wieder von vorne anfängt (1-2sek) könnte die restzeit des Programms sein.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mo, 22.12.08, 15:30

Na also! 1µF ist genauso gut. 100nF ist eher so die 'Untergrenze'. Wegen Programm 3+4:
Dieses Post hast Du aber schon berücksichtigt:
viewtopic.php?p=89075#p89075
oder ???
Antworten