Doppel- Wechselblitzer Schaltung
Moderator: T.Hoffmann
Hi,
Es würde gehen, aber du brauchst dann einen anderen µP, glaube ich.
Du könntest zwei Interrupts, die der AtTiny45 meines Erachtens nicht hat, benutzen. Zum Beispiel würde das auf jeden Fall mit dem ATmega8 laufen.
Ggf. könnte es auch mit einem Interrupt laufen, nur dann würde das andere Programm immer laufen. Oder man schreibt das 2. Programm (kein INT) in keine Do-Loop-Schleife, oder???
Sorry, ich fang damit gerade erst an.
Wählst die 2 Interrupt-Eingänge als Eingang, logischer Weise.
Programmierst dir 2 Interrupts von den beiden Eingängen und wählst deine beiden Programme in eins deiner Labels der Interrupt-Routinen.
Gruß
Avo
Es würde gehen, aber du brauchst dann einen anderen µP, glaube ich.
Du könntest zwei Interrupts, die der AtTiny45 meines Erachtens nicht hat, benutzen. Zum Beispiel würde das auf jeden Fall mit dem ATmega8 laufen.
Ggf. könnte es auch mit einem Interrupt laufen, nur dann würde das andere Programm immer laufen. Oder man schreibt das 2. Programm (kein INT) in keine Do-Loop-Schleife, oder???
Sorry, ich fang damit gerade erst an.
Wählst die 2 Interrupt-Eingänge als Eingang, logischer Weise.
Programmierst dir 2 Interrupts von den beiden Eingängen und wählst deine beiden Programme in eins deiner Labels der Interrupt-Routinen.
Gruß
Avo
Syntax musst nachschlagen, aber vom Prinzip:
oder mit jump oder goto, je nachdem wie des bei die heisst. So kannst beliebig viel machen.
Ist net professionell, aber funktioniert für dich sicherlich am besten.
Code: Alles auswählen
if(Eingang1 == true) {
dann mach Code 1
}else if(Eingang2 == true){
dann mach Code 2
}
Ist net professionell, aber funktioniert für dich sicherlich am besten.
Du hast doch in deinem Programm auch verschiedene Waits (Zeiten, in denen der µP NICHTS macht).
Wenn Du mal schnell vom einen Prog ins andere Prog springen möchtest musst du es schon mit den Interrupts (Unterbrechungen) machen.
Beispiel: Du hast dein Programm das insgesamt ein Paar Sekunden läuft, und du schnell mal von einen ins Andere springen möchtest geht das nicht. Du musst erst einmal diese Zeit abwarten.
Aber wenns dich nicht stört....
Gruß
Avo
Wenn Du mal schnell vom einen Prog ins andere Prog springen möchtest musst du es schon mit den Interrupts (Unterbrechungen) machen.
Beispiel: Du hast dein Programm das insgesamt ein Paar Sekunden läuft, und du schnell mal von einen ins Andere springen möchtest geht das nicht. Du musst erst einmal diese Zeit abwarten.
Aber wenns dich nicht stört....
Gruß
Avo
Ne,
meinetwegen kann das Programm auch bis zum Ende durchlaufen. Wollte das evtl mit nem TINY24 machen oder so der hat ja Scheinbar 12 I/O. Wollte dann die Programme über einen Drehstufenschalter schalten. Dann könnte ich doch quasi 6 Programme drüber schalten oder?
Gruß Wießje
meinetwegen kann das Programm auch bis zum Ende durchlaufen. Wollte das evtl mit nem TINY24 machen oder so der hat ja Scheinbar 12 I/O. Wollte dann die Programme über einen Drehstufenschalter schalten. Dann könnte ich doch quasi 6 Programme drüber schalten oder?
Gruß Wießje
Hi,
Avo XO ich glaube er möchte nicht unterschiedliche Programme wie Threads parallel laufen lassen, sonder, so verstehe ich das, er möchte je nach Schalterstellung die LEDs unterschiedlich blinken lassen!
Stimmt das so, Wiessje?
Falls es so ist, würde ich folgendes machen:
Du Schaust dir mit SELECT CASE den Port an, an dem die 8 geschalteten (können auch weniger) Eingänge sind.
Ist der Wert 1, so wird der Code in Label-1 ausgeführt. Ist der Wert 2, so wird der Code von Label-2 ausgeführt, usw...
Dabei ist der Wert wie folgt:
1. Eingang -> 2^0 -> 1
2. Eingang -> 2^1 -> 2,
3. Eingang -> 2^2 -> 4
4. Eingang -> 2^3 -> 8
....
8. Eingang -> 2^7 -> 128
Ist sehr übersichtlich, und auch leicht zu pflegen
Avo XO ich glaube er möchte nicht unterschiedliche Programme wie Threads parallel laufen lassen, sonder, so verstehe ich das, er möchte je nach Schalterstellung die LEDs unterschiedlich blinken lassen!
Stimmt das so, Wiessje?
Falls es so ist, würde ich folgendes machen:
Code: Alles auswählen
INIT
DO 'Schleife beginnen
SELECT CASE PortAnDemDerSchalterIst
CASE 1
GOSUB Label-1
CASE 2
GOSUB Label-2
CASE 4
GOSUB Label-4
.
. 'weitere Fälle möglich je nach Schalterstellung
.
CASE ELSE
END SELECT
LOOP
Label-1:
...AnweisungFür Blinken in Schalterstellung 1
RETURN
Label-2:
...AnweisungFür Blinken in Schalterstellung 2
RETURN
Label-4:
...AnweisungFür Blinken in Schalterstellung 3
RETURN
.
.
.
Ist der Wert 1, so wird der Code in Label-1 ausgeführt. Ist der Wert 2, so wird der Code von Label-2 ausgeführt, usw...
Dabei ist der Wert wie folgt:
1. Eingang -> 2^0 -> 1
2. Eingang -> 2^1 -> 2,
3. Eingang -> 2^2 -> 4
4. Eingang -> 2^3 -> 8
....
8. Eingang -> 2^7 -> 128
Ist sehr übersichtlich, und auch leicht zu pflegen
Ich seh das genauso wie Andi. Interrupts sind dafür nicht erforderlich.
Es würde allerdings auch mit dem Tiny45 gehen...
Der hat (in der angegebenen Schaltung freie) analoge Eingänge (PB3/PB4). Und der AD-Wandler ist locker genau genug um 6 unterschiedliche Zustände zu erkennen (die 5V mit 6 Widerständen per Spannungsteiler über den Stufenschalter auf z.B. 0-2.5V 'übersetzen' - geht auch noch bei 12 Stufen - hab ich bei einer anderen Gelegenheit auch schon mal gemacht). Ist also mehr oder minder 'Geschmacksache'. Wenn die 6 verschiedenen Programme allerdings 'komplexe' Blick-Folgen abbilden sollen, wirst Du mit dem (im obigen Programm verwendeten) Super-Primitiv-Algorithmus ggf. schnell am Ende des Speichers ankommen...
Es würde allerdings auch mit dem Tiny45 gehen...
Der hat (in der angegebenen Schaltung freie) analoge Eingänge (PB3/PB4). Und der AD-Wandler ist locker genau genug um 6 unterschiedliche Zustände zu erkennen (die 5V mit 6 Widerständen per Spannungsteiler über den Stufenschalter auf z.B. 0-2.5V 'übersetzen' - geht auch noch bei 12 Stufen - hab ich bei einer anderen Gelegenheit auch schon mal gemacht). Ist also mehr oder minder 'Geschmacksache'. Wenn die 6 verschiedenen Programme allerdings 'komplexe' Blick-Folgen abbilden sollen, wirst Du mit dem (im obigen Programm verwendeten) Super-Primitiv-Algorithmus ggf. schnell am Ende des Speichers ankommen...
Ja genau so ist das gemeint. Mit welchem µP mache ich sowas das denn am Besten. Will also 6 Kanäle machen, da ich evtl. noch lauflichter dazu machen möchte und das sieht mit zweien etwas langweilig aus
. Und halt eben mit nem 6 Stufenschalter.
Also schaut der dann quasi erst, an welchem Eingang Spannung anliegt und Schaltet dann das zugewiesene Programm? Wie werden die Eingänge denn Bezeichnet? Dann müsste ich doch z.B. Case PB01 schreiben oder wie? Oder die zuweisungen vorher irgendwo vermerken. Kann ich dem einfach so die 5V auf den Eingang schalten oder fängt der dann an zu stinken?
Also schaut der dann quasi erst, an welchem Eingang Spannung anliegt und Schaltet dann das zugewiesene Programm? Wie werden die Eingänge denn Bezeichnet? Dann müsste ich doch z.B. Case PB01 schreiben oder wie? Oder die zuweisungen vorher irgendwo vermerken. Kann ich dem einfach so die 5V auf den Eingang schalten oder fängt der dann an zu stinken?
Da kann ich Dir pauschal keine Antwort geben. Wenn Deine Blick-Programme recht einfach sind und Du mit dem Speicher von 2K auskommst, reicht ein Tiny2313 (der hat schon 17 Ein-Ausgänge allerdings nur digital). Am vielseitigsten wäre wohl ein ATMega8 (immerhin 8K Speicher und reichlich Ein-Ausgänge in digital + analog). Bei allen Atmels kann man die Ein-Ausgänge per Software auswählen (also welcher Pin als Eingang oder als Ausgang dienen soll).Mit welchem µP mache ich sowas das denn am Besten
...Kann ich dem einfach so die 5V auf den Eingang schalten oder fängt der dann an zu stinken?
Du kannst. Allerdings ist es üblich einen Vorwiderstand (z.B. 10K) zu verwenden. Falls Du versehentlich einen Pin als Ausgang definiert hast und diesen Pin per Software auf 0 setzt (so wie im obigen Programm: Reset Kanal1), dann versucht der Chip die 5V auf 0V zu ziehen... das überlebt er nicht unbedingt. Wenn Du digitale Eingänge verwenden willst, macht man das aber üblicherweise anders: Der Chip hat interne Pull-up Widerstände (~30k). Wenn also der Pin 'floated' (nix angeschlossen), hat er quasi 5V und würde beim lesen eine 1 liefern. Wenn dieser Pin auf 0V geschaltet wird, würde er beim lesen natürlich eine 0 liefern.
So ähnlich.Dann müsste ich doch z.B. Case PB01 schreiben
Nehmen wir mal einen Tiny2313 als Beispiel:
Pins 12 bis 17 (PB0 bis PB5) wären Deine 6 Ausgänge
Pins 2+3 und 6 bis 9 (PD0 bis PD5) wären 6 Eingänge (die per Drehschalter an 0V gehen oder offen sind).
Definieren:
Dim Schalter As Byte
DDRB = &B00111111 'PB0 bis PB5 als Ausgänge
DDRD = &B00000000 'PD0 bis PD5 als Eingänge
PORTD = &B00111111 'Pull-up für PD0 bis PD5 aktivieren
...
Schalter = &B00111111 And PIND
'Dann wie oben, allerdings invertiert:
SELECT CASE Schalter
CASE &B00111110 'Schalter in Stellung 1
GOSUB Label_1
CASE &B00111101 'Schalter in Stellung 2
GOSUB Label_2
CASE &B00111011 'Schalter in Stellung 3
...
Eingänge werden in BasCom mit dem PIN register bezeichnetWie werden die Eingänge denn Bezeichnet?
Also z.B. Lesen von PB1: Bit-Variable=PINB.1
Wenn Du mehr darüber wissen willst, einfach das Datenblatt des verwendeten Chips anschauen und/oder die Bascom-Doku lesen...
Man,
Das hört sich alles komliziert an. Bin eher SPS gewöhnt. Sagen wir ich nehme dann den ATMEGA 8, kann ich den mit dem Proger programmieren wenn ich da einen anderen Sockel dran löte? Und die Schaltung an sich sähe ja dann genau so aus 300hm ---> BC337 Ausgangsseitig und Eingangsseitig? Wie muss ich den denn da verschalten. Hast du zufälligerweise von dem ATMEGA 8 ein Datenblatt auf Deutsch? Habe bis jetz nur englische gefunden, werde da bei manschen sachen nicht schlau!
Das hört sich alles komliziert an. Bin eher SPS gewöhnt. Sagen wir ich nehme dann den ATMEGA 8, kann ich den mit dem Proger programmieren wenn ich da einen anderen Sockel dran löte? Und die Schaltung an sich sähe ja dann genau so aus 300hm ---> BC337 Ausgangsseitig und Eingangsseitig? Wie muss ich den denn da verschalten. Hast du zufälligerweise von dem ATMEGA 8 ein Datenblatt auf Deutsch? Habe bis jetz nur englische gefunden, werde da bei manschen sachen nicht schlau!
Ja....ATMEGA 8...kann ich den mit dem Proger programmieren...
Ja.Und die Schaltung an sich sähe ja dann genau so aus 300hm ---> BC337 Ausgangsseitig
Eingangsseitig:
Wenn Du (wie oben beschrieben) mit digitalen Eingängen arbeitest, werden die im einfachsten Fall einfach gegen Masse geschaltet. Analoge Eingänge würdest Du mit einer Spannung von 0-5V (oder 0-2.5V) beschalten und zur Strombegrenzung ggf. noch mal einen 1K Widerstand davor setzen. Die Beschaltung ist also wirklich einfach.
Datenblatt auf Deutsch? Ist mir nicht geläufig. Es gibt ein paar 'Übersichten' bei RN z.B.:
http://www.roboternetz.de/wissen/index.php/AVR
wo das wichtigste kurz erklärt ist, bei speziellen Fragen wirst Du um das Datenblatt aber wohl nicht rumkommen.
Eine gute allgemeine 'Einführung' zu den AVRs auf Deutsch gibt es auch hier: http://www.rowalt.de/mc/
Achso, einfach nur die Masse schalten, dann gehts ja. Das mit dem Masse schalten is für mich als grober Elektriker etwas fremd aber das ist ja dann sicherlich kein Problem. Dann muss ich glaube ich nochmal bestellen, dass ich nochmal was zum basteln hab.
...etwas fremd...
Stell es Dir mal so vor (Ersatzschaltbild - mit Transistoren hast Du ja anscheinend keine großen Schwierigkeiten): (sehr stark vereinfacht...)
Wenn der Schalter offen ist, kriegt die Basis des Eingangs Strom über den 33K Widerstand. Der Transistor schaltet durch und am 'internen Ausgang' liegen (fast) 0V an. Wenn der Schalter geschlossen ist, wird die Basis mit 0V verbunden, der Transistor sperrt und am 'internen Ausgang' liegen 5V an.
Stell es Dir mal so vor (Ersatzschaltbild - mit Transistoren hast Du ja anscheinend keine großen Schwierigkeiten): (sehr stark vereinfacht...)
Wenn der Schalter offen ist, kriegt die Basis des Eingangs Strom über den 33K Widerstand. Der Transistor schaltet durch und am 'internen Ausgang' liegen (fast) 0V an. Wenn der Schalter geschlossen ist, wird die Basis mit 0V verbunden, der Transistor sperrt und am 'internen Ausgang' liegen 5V an.
Ja schon klar, habs ja schon gemacht.
Habe grade mal ein Layer gemacht. Die Eingänge die mit dem Drehschalter geschaltet werden direkt gegen Masse gelegt, oder muss ich da noch einen Widerstand zwischen machen? Jetzt möchte ich aber noch einen Eingang extern geschaltet haben mit 12V. Wollte das mit nem BC337 und nem 78L05 machen, von denen Habe ich ja genug. Würde das gehn? Also quasi wie die Ausgangsschaltung.
Was mache ich denn mit diesem AREF kontakt? Muss ich den mit irgendwas beschalten oder bleibt der frei?
Habe jetzt VCC und AVCC mit 5V beschaltet und beide GND´s eben mit Masse. Muss ich sonst noch irgendwas beachten?
Des Weiteren PB6,PB7,PD5-7 und PB0 gegen Masse als Eingänge für die Programme über den Schalter. Den 12V Extern ---> 78L05 ---> 300Ohm ---> BC337 der dann die Masse auf den PC6 schaltet. Als Ausgänge PC3-5 und PB1-5 mit je 300Ohm zu einem BC337 der Masse schaltet. Funktioniert das so?
P.S. Sind jetzt 8 Aus- und 7 Eingänge. Wieder mal mehr wie anfangs gedacht.
Gruß Wiessje
Habe grade mal ein Layer gemacht. Die Eingänge die mit dem Drehschalter geschaltet werden direkt gegen Masse gelegt, oder muss ich da noch einen Widerstand zwischen machen? Jetzt möchte ich aber noch einen Eingang extern geschaltet haben mit 12V. Wollte das mit nem BC337 und nem 78L05 machen, von denen Habe ich ja genug. Würde das gehn? Also quasi wie die Ausgangsschaltung.
Was mache ich denn mit diesem AREF kontakt? Muss ich den mit irgendwas beschalten oder bleibt der frei?
Habe jetzt VCC und AVCC mit 5V beschaltet und beide GND´s eben mit Masse. Muss ich sonst noch irgendwas beachten?
Des Weiteren PB6,PB7,PD5-7 und PB0 gegen Masse als Eingänge für die Programme über den Schalter. Den 12V Extern ---> 78L05 ---> 300Ohm ---> BC337 der dann die Masse auf den PC6 schaltet. Als Ausgänge PC3-5 und PB1-5 mit je 300Ohm zu einem BC337 der Masse schaltet. Funktioniert das so?
P.S. Sind jetzt 8 Aus- und 7 Eingänge. Wieder mal mehr wie anfangs gedacht.
Gruß Wiessje
AREF bleibt frei. Sollte mit einem Kondensator gegen Masse geschaltet werden, wenn Du analoge Spannungen messen willst.
...
Passt.Die Eingänge die mit dem Drehschalter geschaltet werden direkt gegen Masse gelegt
Passt auch.Habe jetzt VCC und AVCC mit 5V beschaltet und beide GND´s eben mit Masse.
Ja. Wenn ich es richtig verstanden hab, dann schon. Schaltbild wäre hilfreich.Des Weiteren PB6,PB7,PD5-7 und PB0 gegen Masse als Eingänge für die Programme über den Schalter. Den 12V Extern ---> 78L05 ---> 300Ohm ---> BC337 der dann die Masse auf den PC6 schaltet. Als Ausgänge PC3-5 und PB1-5 mit je 300Ohm zu einem BC337 der Masse schaltet. Funktioniert das so?
Ist ein wenig 'mit Kanonen auf Spatzen schießen' aber sollte natürlich auch gehen. Meist nimmt man hierzu nur einen Spannungsteiler. Also die 12V über zwei Widerstände (z.B. 4,7k + 2,2k) nach Masse und den Mittelpunkt zwischen den beiden Widerständen an einen Eingang des Atmels. Für speziell diesen Eingang dann KEINEN internen Pullup aktivieren. Wenn dann 12V anliegen, bleiben am 4.7k Widerstand etwa 8V hängen; am Eingang des Atmels sind es dann etwa 4V. Das reicht locker um das als logisch High zu erkennen (liefert also eine '1' beim Lesen per PIND). Wenn keine 12V anliegen, ist der Pin am Atmel über die 2.2K mit Masse verbunden was natürlich logisch Low ist (liefert also eine '0' beim Lesen per PIND).Den 12V Extern ---> 78L05 ---> 300Ohm ---> BC337 der dann die Masse auf den PC6 schaltet.
Ja, wenn man mal 'Lunte gerochen' hat mit den Atmels wird es schnell mehr und mehrSind jetzt 8 Aus- und 7 Eingänge. Wieder mal mehr wie anfangs gedacht.
Ja ich hätte auch nit gedacht das man damit so schnell, kein und günstig sich lustige Sachen bauen kann.
Spannungsteiler wollte ich vermeiden, da ich das Ding mit 6-30V betreiben kann wie ich grade Lust hab und ich das Layer nicht 2seitig machen will. Der nimmt mir sonst zuviel Platz weg. Das mit dem Externen 12V eingang habe ich quasi genau so gemacht wie in der 1. Schaltung die LED Ausgänge nur halt mit dem Spannungsregler vorne dran.
Kannst du mir bei Gelegenheit nochmal ein Progamm vorschreiben? Nur wie das da mit den Ein und Ausgängen programmiert wird. Da hab ich noch nit so ganz durchgeblickt. Da wo die Programme hin kommen grade ein Platzhalter hin, die kriege ich denke ich mal noch selbst da rein. Ist nicht dringend. Denke mal der kram kommt eh erst Ende der Woche.
Gruß
Spannungsteiler wollte ich vermeiden, da ich das Ding mit 6-30V betreiben kann wie ich grade Lust hab und ich das Layer nicht 2seitig machen will. Der nimmt mir sonst zuviel Platz weg. Das mit dem Externen 12V eingang habe ich quasi genau so gemacht wie in der 1. Schaltung die LED Ausgänge nur halt mit dem Spannungsregler vorne dran.
Kannst du mir bei Gelegenheit nochmal ein Progamm vorschreiben? Nur wie das da mit den Ein und Ausgängen programmiert wird. Da hab ich noch nit so ganz durchgeblickt. Da wo die Programme hin kommen grade ein Platzhalter hin, die kriege ich denke ich mal noch selbst da rein. Ist nicht dringend. Denke mal der kram kommt eh erst Ende der Woche.
Gruß
Super schon mal vielen Dank im vorraus, dann kann ich ja bald Verputzen.
. Also wollte das mit nem ATMEGA 8 Machen.
Eingänge:
PC6, PB6, PB7, PD5, PD6, PD7 und PB0.
Ausgänge:
PC5, PC4, PC3, PB5, PB4, PB3, PB2 und PB1.
Dann bin ich mal gespannt, ob das auch so gut klappt wie bei der ersten Schaltung.
Eingänge:
PC6, PB6, PB7, PD5, PD6, PD7 und PB0.
Ausgänge:
PC5, PC4, PC3, PB5, PB4, PB3, PB2 und PB1.
Dann bin ich mal gespannt, ob das auch so gut klappt wie bei der ersten Schaltung.
PC6 bitte nicht verwenden, das ist der RESET Pin. Sonst kannst Du den Chip nie wieder programmieren...
Man kann zuerst den Chip programmieren und danach den RESET Pin per Fuse als Eingang konfigurieren. Aber wenn ein Fehler im Programm war, war's das. Weil dann hilft nur noch ein 'Hochspannungs-Programmer'. Die sind aber wesentlich aufwändiger als der Simple-Programmer aus diesem Thread...
Man kann zuerst den Chip programmieren und danach den RESET Pin per Fuse als Eingang konfigurieren. Aber wenn ein Fehler im Programm war, war's das. Weil dann hilft nur noch ein 'Hochspannungs-Programmer'. Die sind aber wesentlich aufwändiger als der Simple-Programmer aus diesem Thread...
Na klar, außer Du willst auch noch die serielle Schnittstelle zum PC nutzen - dazu wäre aber noch ein Pegelwandler wie ein Max232 erforderlich
Anbei ein Beispielprogramm. Ich hab mir erlaubt, die Ausgänge zu einem virtuellen Port zusammenzufassen. Das vereinfacht die Programmierung von Lauflicht etc.
Anbei ein Beispielprogramm. Ich hab mir erlaubt, die Ausgänge zu einem virtuellen Port zusammenzufassen. Das vereinfacht die Programmierung von Lauflicht etc.
- Dateianhänge
-
- Test_Mega8_Blinker.zip
- (1.24 KiB) 271-mal heruntergeladen
Wie meinst Du das? 'Gleichzeitig' kann der Prozessor nicht. Der arbeitet linear Befehl für Befehl ab. Man kann natürlich so eine Art Multitasking erreichen, wenn man z.B. einen Timer und Interrupts verwendet, oder wie weiter oben schon mal angesprochen, einen Schalter auf einen Interrupt legt. Aber was Du damit erreichen willst ist mir noch nicht klar.
Also, ich habe ja jetzt einen 6 Stufen Drehschalter für 6 Eingänge mit dem 6 Programme (Lauflichter etc.) mit 6Ausgängen geschaltet werden . Nun will ich jedoch mit einem Kippschalter Ein/Aus ein 2. Programm (z.B. Wechselbilker o.ä) parallel laufen lassen mit dem ich unabhängig die 2 verbleibenden Ausgänge ansteuere.


