Antwort BBM, sehr hilfreich. Ist es so schwer Tatsachen zu verstehen die nicht von Dir sind? Das Mit dem Display, Poti, Attiny... ist Dir als Profi nicht mal aufgefallen, da kommt ein Laie der Präzision erwartet und solche Fehler entdeckt.
Zitat von elo im Beitrag #19...Ich würde einfach mal den Tiny 85 direkt mit "reiner Gleichspannung" 4,5Volt (3 AA Zellen in Reihe) betreiben...
Danke für Deine Hilfreiche Antwort!
Mit 3x 1,5V Batterien, 3x 1,2V AKUs oder mit einem Netzteil was 4,5V liefert funktioniert es ohne Probleme, zu AKUs/Batterien wurde mir gesagt es wäre eine dumme Idee. Da mich das ewige laden der AKUS bzw. der Batterie-Verbrauch genervt hat wurde ein Netzteil mit 3,3V und 5V gekauft, hat auch alles gut funktioniert mit 3,3V. Dann kam der Moment etwas anderes auf die Mikrocontroller zu schreiben, Atmega8 O.K., PICAXE 08M2-14M2-20M2 O.K., Attiny44 und Attiny85 funktionieren nicht . Das die 2 schon mehrfach Probleme mit der Spannung hatten habe ich vergessen gehabt und nach Fehlern bei mir gesucht.
Egal, jetzt funktioniert es mit meinen gebastelten Spannungsplatinchen die liefern 4,4V für die AVRs und 5V für Bauteile die sich an das Datenblatt halten, und eine Reihe mit 7,2V - 12V ist auch noch dabei. Damit sind meine Spannungen die ich benötige abgedeckt, alles ist gut so wie es ist.
So sieht es jetzt aus und es funktioniert fehlerfrei;
links meine Bauteile und rechts ein gekauftes: [[File:Spannung 01.jpg|none|fullsize]]
so langsam nerven die Toleranzen der AVR Mikrocontroller, nicht der Atmega 8 der funktioniert wie er soll von 4,5V bis 5,5V ohne Probleme. Es sind der Attiny44 und der Attiny85 die ein merkwürdiges Verhalten bei der Spannung an den Tag legen .
Damit auch alles seine Richtigkeit hat habe ich ein 5V Schaltnetzteil gekauft, Super jetzt kann nix mehr schief gehren . Falsch gedacht, die 2 oben genannten Kandidaten scheren sich einen Dreck um das was im Datenblatt steht!
Beide funktionieren bis ca. 4,8V normal und verrichten ihren Dienst, ab ca. 4,9V geht nix mehr. Interessanter Weise lassen sie sich von ca. 4,6V bis ca. 5,5V programmieren, bei weniger geht es nicht.
Diese Erkenntnis hat mich wieder ein paar Stunden gekostet, warum fällt es nur mir auf das da etwas nicht stimmt? Es sind ca. 20 von den Kandidaten die ich getestet habe und alle reagieren gleich .
Potis die nicht funktionieren, Displays die nicht funktionieren, AVRs die nicht funktionieren..., was soll der Schei...
Morjen, das dachte ich mir schon das es Geschwindigkeitsabhängig sein soll das Motorgeräusch ;-), kommt drauf an wie gut Du im Umgang mit Audiodateien bist um genügend Motorgeräusche zu erstellen. Man kann ja ein wenig mogeln und es so machen das es sich recht gut anhört, die Motorgeräusche in dem Video sind hm bescheiden es soll nur zeigen was man machen kann.
; picaxe08m2 ; automatische Compilerauswahl für mein Skript
Symbol TX = C.4 ' Ausgang, Befehl und Sollwert zum DFPlayer senden Symbol RX = C.2 ' Eingang, Daten vom DFPlayer empfangen Symbol BUSY_PIN = pinC.1 ' Eingang, ist der DFPlayer beschäftigt? Symbol Signal = pinC.3 ' Eingang, auf ein Signal warten Symbol BAUD_FREQ = M8 ' Frequenz setzen Symbol BAUD = T9600_8 ' Geschwindigkeit setzen Symbol cmd = b0 ' Befehl für den DFPlayer Symbol arg = w1 ' Sollwert für den DFPlayer Symbol arg.lb = b2 ' low Byte von arg Symbol arg.hb = b3 ' high Byte von arg symbol Nr = b4 ' die Nr. der Datei symbol Nr_alt = b5 ' die Nr. der aktuellen Datei merken
Nr = 0 ' keine Datei, das Abspielen stoppen Nr_alt = Nr
high TX ' den Ausgang TX auf high setzen für Leerlauf SetFreq BAUD_FREQ ' Frequenz einstellen pause 1000 ' eine Pause für die Initialisierung
cmd = $09 : arg = $0002 : gosub senden ' mikroSD Karte auswählen pause 4000 ' eine Pause um den Inhalt der SD-Karte einzulesen
cmd = $06 : arg = $0011 : gosub senden ' Lautstärke einstellen (0 - 1E) pause 1000 ' eine Pause um die Lautstärke einzustellen
do if Signal = 1 then inc Nr : if Nr > 3 then : Nr = 0 : endif do : loop until Signal = 0 endif
if Nr <> Nr_alt then Nr_alt = Nr select case Nr case 0 cmd = $16 : arg = $0000 : gosub senden ' Motor aus case 1 cmd = $08 : arg = $0001 : gosub senden ' Motor starten pause 4000 cmd = $08 : arg = $0002 : gosub senden ' und dann im Leerlauf case 2 cmd = $08 : arg = $0003 : gosub senden ' Motor schneller case 3 cmd = $08 : arg = $0004 : gosub senden ' Motor noch schneller endselect endif loop
Hi Karlsson, was ist aus dem Rundumlicht und dem Bremslicht geworden? Ein paar Bilder fänd ich ganz nett ;-).
Für ein Modell wollte ich eine Waltons-Hupe und dachte die paar Töne sollten doch gehen, BBM hat mir dann erklärt das so etwas richtig viele Töne hat und die PICAXE nicht kann. Er hatte für mich eine recht einfache Lösung die da war: ein mp3-Modul mit der Hupe und gut ist.
Zitat von BoomBoomMagic im Beitrag #46...wenn des auch noch nicht jeder so ganz verstanden hat , doch schon mal lustig das man e i n e n "PWM" halbwegs hinbekommen hat
Da ich die vergeblichen Versuche hier sehe , ist das Thema doch noch ein bissel zu schwer derzeit...
Jetzt enttäuschst Du mich aber, pwm ist und bleibt pwm! Eine Zeit X in der 2 Zyklen sind, 1x ein und einmal aus, nicht mehr und nicht weniger! Bist Du sicher das Du weist was pwm ist?
Und hier eine Hardware Version von einem Rundumlicht:
Morjen, jetzt verstehe ich was die for... Schleifen machen sollen, ein pwm von Hand ;-). Und ich dachte die LED sollte nach glimmen und so einen Schweif hinter sich herziehen .
Bemerkungen und Kurzgeschichten habe ich mal weggelassen ;-).
O.K. dann mal ein ganz einfaches kurzes pwm Programmm (bitte mit den Werten spielen bis es gefällt):
; picaxe08m2 ; automatische Compilerauswahl für gedit
symbol LED_1 = B.0 symbol LED_2 = B.1 symbol LED_3 = B.2 symbol LED_4 = C.4
symbol an = w1 ' an-Zeit der LED im Zyklus symbol aus = w2 ' aus-Zeit der LED im Zyklus symbol Z_Spanne = w3 ' Zeitspanne für das Absenken der Helligbekeit symbol Z_ab = w4 ' Zeit bis zum nächsten Absenken der Helligkeit symbol Z_LED = w5 ' Zeit bis die nächste LED an der Reihe ist
Es ist meine Interpretation für ein pwm, was pwm ist und wie es funktioniert weiß ich.
PWM: * in einer Zeitspanne X gibt es eine Zeitspanne Y * Beispiel: X = 500, Y = 200 ergibt eine Einzeit von 200 in der Gesamtzeit 500
also nix Weltbewegendes, ;-).
Du weißt das und ich weiß das, es hört sich alles nur so kompliziert an weil englische Kürzel, Beschreibungen..., und englisch ist nicht mein Ding. Also glaube einfach mal Andere wissen auch einiges.
Egal, hier ist noch eine zusätzliche Hardware-Lösung für einen Schliereneffekt: Papier vor die LEDs:
Morjen, das mein pwm funktioiert kann man sehen wenn man das Rundumlicht langsamer macht, was kann ich dafür wenn das Rundumlicht so schnell ist das es keinen Unterschied gibt zwischen pwm und dem natürlichen ausglimmen der LED? Darum die Einstellmöglichkeiten um das best mögliche Ergebnis zu erzielen.
Die Werte sind so gewählt das man gut sieht was passiert, einfach mal die Werte verstellen und sehen was passiert bzw. bis es einem gefällt.
LED_1 alias portb.0 LED_2 alias portd.0 LED_3 alias portc.5 LED_4 alias portb.1
dim an as word ' an-Zeit der LED im Zyklus dim aus as word ' aus-Zeit der LED im Zyklus dim Z_Spanne as word ' Zeitspanne für das Absenken der Helligbekeit dim Z_ab as word ' Zeit bis zum nächsten Absenken der Helligkeit dim Z_LED as word ' Zeit bis die nächste LED an der Reihe ist
Z_ab = 1 Z_LED = 11 Z_Spanne = 999
do
LED_2 = 1 : waitms Z_LED for an = Z_Spanne to 0 step -10 aus = Z_Spanne - an LED_1 = 1 : waitus an : LED_1 = 0 : waitus aus : waitms Z_ab next an
LED_3 = 1 : waitms Z_LED for an = Z_Spanne to 0 step -10 aus = Z_Spanne - an LED_2 = 1 : waitus an : LED_2 = 0 : waitus aus : waitms Z_ab next an
LED_4 = 1 : waitms Z_LED for an = Z_Spanne to 0 step -10 aus = Z_Spanne - an LED_3 = 1 : waitus an : LED_3 = 0 : waitus aus : waitms Z_ab next an
LED_1 = 1 : waitms Z_LED for an = Z_Spanne to 0 step -10 aus = Z_Spanne - an LED_4 = 1 : waitus an : LED_4 = 0 : waitus aus : waitms Z_ab next an
Ja, das mit high und low nervt mich mittlerweile auch seit ich den AVR kenne ;-).
Es ist meine Interpretation von pwm auf das Nötige reduziert , Dein Programm funktionirt nicht mit der PICAXE-Testplatine, schei... auf den blöden Simulator (ich habe keinen Simulator ). Ist wie im echten Leben, "nur Bares ist Wares!".
; picaxe08m2 ; automatische Compilerauswahl für Mousepad ; symbol LED_1 = B.0 symbol LED_2 = B.1 symbol LED_3 = B.2 symbol LED_4 = C.4 symbol an = w0 ; an-Zeit der LED im Zyklus symbol aus = w1 ; aus-Zeit der LED im Zyklus symbol P_an = b4 ; Pause bis zum nächsten an der LED symbol P_LED = b5 ; Pause bis zur nächsten LED symbol i = b6 ; eine Variable für for... ; an = 100 ; an-Zeit in us beim Absenken der Helligbekeit der LED aus = 100 ; aus-Zeit in us beim Absenken der Helligbekeit der LED P_an = 4 ; Zeit bis zum nächsten Absenken der Helligkeit der LED P_LED = 40 ; Zeit bis die nächste LED an der Reihe ist ; do ; high LED_2 for i = an to 0 step -10 high LED_1 pauseus i low LED_1 pauseus aus pause P_an next i pause P_LED ; high LED_3 for i = an to 0 step -10 high LED_2 pauseus i low LED_2 pauseus aus pause P_an next i pause P_LED ; high LED_4 for i = an to 0 step -10 high LED_3 pauseus i low LED_3 pauseus aus pause P_an next i pause P_LED ; high LED_1 for i = an to 0 step -10 high LED_4 pauseus i low LED_4 pauseus aus pause P_an next i pause P_LED ; loop ;
Die vielen merkwürdigen Variablen sind für die Berechnungen wie lange läuft welche Kette in welche Richtung um den Ventilator ein/aus zu schalten oder wann geht die Motorattrappe an oder aus...
; picaxe14m2 ; automatische Compilerauswahl für gedit ; symbol Licht = B.0 ; Ausgang für das Licht bzw. Blinklicht beim rückwärts Fahren symbol Kette_rechts_r = B.1 ; Ausgang für die Kette rechts rückwärts symbol Kette_rechts_v = B.2 ; Ausgang für die Kette rechts vorwärts symbol Kette_links_r = B.3 ; Ausgang für die Kette links rückwärts symbol Kette_links_v = B.4 ; Ausgang für die Kette links vorwärts symbol Kassettendeck = B.5 ; Ausgang für das Kassettendeck symbol V8_Motor = C.0 ; Ausgang für den V8 Motor symbol RC_rechts = C.1 ; Eingang RC-Signal Steuerhebel rechts rauf/runter symbol RC_links = C.2 ; Eingang RC-Signal Steuerhebel links rauf/runter symbol RC_Licht_Musik = C.3 ; Eingang RC-Signal Steuerhebel rechts rechts/links symbol Ventilator = C.4 ; Ausgang für den Ventilator symbol Laufzeit = w0 ; die Laufzeit der Motoren 0 - 65535 (Variable b0 und b1) symbol Standzeit = w1 ; Kettenkessel Standzeit 0 - 65535 (Variable b2 und b3) symbol Toleranz = b4 ; eine kleine Toleranz für die Mittelstellung rauf/runter (Leerlauf) symbol rechts_0 = b5 ; RC-Signal Steuerhebel rechts Mittelstellung für rauf/runter symbol links_0 = b6 ; RC-Signal Steuerhebel links Mittelstellung für rauf/runter symbol Toleranz_r = b7 ; rückwärts mit Toleranz symbol Toleranz_v = b8 ; vorwärts mit Toleranz symbol r_fahren_r = b9 ; rückwärts fahren rechts, 0 = nein, 1 = ja symbol r_fahren_l = b10 ; rückwärts fahren links, 0 = nein, 1 = ja symbol Licht_an = b11 ; Licht an, 0 = nein, 1 = ja symbol Licht_b = b12 ; Licht blinken, 0 = aus, 1 = an symbol Kassettendeck_an = b13 ; Kassettendeck, 0 = aus, 1 = an symbol V8_Motor_an = b14 ; V8 Motor, 0 = aus, 1 = an symbol dumm_r = b25 ; eine Variable für alles Mögliche symbol dumm_l = b26 ; eine Variable für alles Mögliche symbol dumm = b27 ; eine Variable für alles Mögliche, und auch die letzte Variable :-( ; pulsin RC_rechts, 1, rechts_0 ; die Mittelstellung vom rechten Steuerhebel für rauf/runter übernehmen pulsin RC_links, 1, links_0 ; die Mittelstellung vom linken Steuerhebel für rauf/runter übernehmen ; Kettenkessel_steuern: ; pulsin RC_Licht_Musik, 1, dumm ; --> Licht ein/aus <-- If dumm > 175 then if Licht_an = 0 then high Licht Licht_an = 1 else low Licht Licht_an = 0 endif pause 200 endif ; pulsin RC_Licht_Musik, 1, dumm ; --> Kassettendeck ein/aus <-- If dumm < 125 then if Kassettendeck_an = 0 then high Kassettendeck Kassettendeck_an = 1 else low Kassettendeck Kassettendeck_an = 0 endif pause 200 endif ; pulsin RC_rechts, 1, dumm_r : pulsin RC_links, 1, dumm_l ; --> V8 Motor einschalten <-- if V8_Motor_an = 0 then if dumm_r > 175 or dumm_l > 175 then high V8_Motor V8_Motor_an = 1 Standzeit = 0 pause 1000 ; eine Pause damit der Kettenkessel nicht sofort losfährt endif ; else ; wenn der V8 Motor läuft kann man auch fahren ;-) ; pulsin RC_rechts, 1, dumm Toleranz_v = dumm + Toleranz Toleranz_r = dumm - Toleranz if Toleranz_r > rechts_0 then ; --> Kette rechts vorwärts <-- high Kette_rechts_v low Kette_rechts_r r_fahren_r = 0 Standzeit = 0 if Laufzeit < 222 then Laufzeit = Laufzeit + 2 endif endif if Toleranz_v > rechts_0 and Toleranz_r < rechts_0 then ; --> Kette rechts aus <-- low Kette_rechts_v low Kette_rechts_r r_fahren_r = 0 if Laufzeit > 0 then : dec Laufzeit : endif if Standzeit < 333 then : inc Standzeit : endif endif if Toleranz_v < rechts_0 then ; --> Kette rechts rückwärts <-- high Kette_rechts_r low Kette_rechts_v r_fahren_r = 1 Standzeit = 0 if Laufzeit < 222 then Laufzeit = Laufzeit + 2 endif endif ; pulsin RC_links, 1, dumm Toleranz_v = dumm + Toleranz Toleranz_r = dumm - Toleranz if Toleranz_r > links_0 then ; --> Kette links vorwärts <-- high Kette_links_v low Kette_links_r r_fahren_l = 0 Standzeit = 0 if Laufzeit < 222 then Laufzeit = Laufzeit + 2 endif endif if Toleranz_v > links_0 and Toleranz_r < links_0 then ; --> Kette links aus <-- low Kette_links_v low Kette_links_r r_fahren_l = 0 if Laufzeit > 0 then : dec Laufzeit : endif if Standzeit < 333 then : inc Standzeit : endif endif if Toleranz_v < links_0 then ; --> Kette links rückwärts <-- high Kette_links_r low Kette_links_v r_fahren_l = 1 Standzeit = 0 if Laufzeit < 222 then Laufzeit = Laufzeit + 2 endif endif ; endif ; if Laufzeit > 111 then ; --> Ventilator ein/aus <-- high Ventilator else low Ventilator endif ; if Standzeit >= 333 then ; --> V8 Motor <-- ausschalten wenn die max Standzeit der Motoren überschritten wurde low V8_Motor V8_Motor_an = 0 endif ; if r_fahren_r = 1 or r_fahren_l = 1 then ; --> blinken <-- wenn rückwärts gefahren wird pause 100 if Licht_b = 0 then high Licht Licht_b = 1 else low Licht Licht_b = 0 endif else ; wenn nicht mehr rückwärts gefahren wird nicht mehr blinken Licht_b = 0 if Licht_an = 1 then ; wenn das Licht an war high Licht else ; wenn das Licht aus war low Licht endif endif ; goto Kettenkessel_steuern ;
so würde z.B. meine Lösung aussehen, 2 Optokoppler 3 Widerstände eine LED und ein paar Kabel. Die Optokoppler reagieren bevor der Motor das Magnetfeld überwindet, ist doch nett wenn die Bremslichter aus sind bevor das Fahrzeug losfährt ;-).
*edit, die LED geht so an wenn der Motor läuft, das müsste noch invertiert werden.
Sieht noch etwas wild aus weil mal eben gebastelt: [[File:Optokoppler.jpg|none|fullsize]]
Morjen, nicht pwm auswerten, wenn ein Motor sich dreht liegt auch eine Spannung an und es fliest ein Strom. Mit der Spannung dann über z.B. einen Optokoppler die LED ansteuern, wäre so meine Idee gewesen.