bis dahin schaut in meinen Projekten Treppenlich, Einfahrtslicht. Codeschloss und Jalousiensteuerung nach. Dort sind die Programme verlinkt... Danke für Eure Geduld.
2017 - Projekt active Motorsound für MAZDA 626
$regfile = "attiny2313.dat" $crystal = 8000000 $hwstack = 40 $swstack = 16 $framesize = 32 '$sim '****************************** Progamm Historie ****************************** 'V0.01 - 15.01.2017 '- erster Entwurf auf Bais Schaltplan 14.01-2017 'V0.02 - 14.02.2017 '- Änderungen nach ersten Tests mit Hardware 'V0.03 - 15.02.2017 '- Änderungen nach ersten Tests mit Hardware 'V0.04 - 17.02.2017 '- Änderungen nach ersten Tests mit Hardware 'V0.05 - 26.02.2017 '- Änderungen nach Umbau Hardware Zifferreihenfolge, Schirmung, Dämpfung Eingang 'V0.06 - 02.03.2017 '- Optimierungen auf Zeit für Multiplexen 'V0.07 - 03.03.2017 '- Optimierungen auf Zeit für Multiplexen nur noch alle 500x messen 'V0.08 - 04.03.2017 '- Umbau Interupt nur alle 500x 'V0.10 - 26.03.2017 '- Anpassungen nach Einbau (Teilfaktor zu klein) neu 120.000.000 = 4Takter '- neue Art von Messbereichsbegrenzung auf 9999 und 100 '- Fehlmessungen asser Bereich werden neu übersprungen '- Mittelwertbildung aus drei Messwerten 'V0.11 - 28.03.2017 '- Teilfaktor von 120.000.000 auf 12.000.000 angepasst 'V0.12 - 30.03.2017 '- Teilfaktor von 12.000.000 auf 1.500.000 angepasst 'V0.13 - 02.04.2017 '- Teilfaktor auf 120.000.000 angepasst und Optimieren rausgenommen und Datei neu geschrieben 'V0.14 - 04.04.2017 '- Teilfaktor auf 120.000.000 angepasst und Wcounthi erst nach Frequenzauswertung löschen! 'V0.15 - 11.04.2017 '- Variablen neu sortiert 'V0.16 - 13.04.2017 '- Variablen ohne Doppelnutzung getestet - kein Erfolg 'V0.17 - 13.04.2017 '- diverse Tests ohne Erfolg 'V0.18 - 15.04.2017 '- Mittelwertbildung ver 100.facht 'V0.19 - 01.05.2017 '- Mittelwertbildung auf 30 gesenkt und 5 Messungen ohne Wertung '- ganzahliges Teilen durch \ 'V0.20 - 29.05.2017 '- Mittelwertbildung geändert neu wird die Impulslänge von 8 Impulsen gemessen ' und dann gerechnet '- zusätzlich wird zum letzten Wert gemittelt 'V0.21 - 12.06.2017 '- Prescale 8 wegen 8 Impulsen 'V0.22 - 12.06.2017 '- Prescale 8 wegen 8 Impulsen und 120 000 000 'V0.23 - 13.10.2017 '- Signal für Gas verlangsamt damit nicht so schnell geschaltet wird 'V0.24 - 18.11.2017 '- Signal für Gas optimiert 'V0.25 - 22.11.2017 '- Calibrierungsmodus eingeführt, beim Start wird kurz Neutral, Vollgas und Bremsen ausgegeben '(aber nur wenn kein Motor läuft) ' drücke + lange dann langer Ton ' danach in Neutral drücke + kurzer Ton, ' danach Vollgas drücke + kurzer Ton ' danach Bremsen drücke + kurzer Ton ' danach langer Ton = alles OK oder drei mal kurz dann fehlerhaft ' danach drücke - für Speichern 'V0.26..27 - 04.12.2017 'Testversionen 'V0.29 - 09.12.2017 '- neue Berechnung '- Einzelsteuerung Zusatzton 'V0.29...34 - 09.07.2019 '- Tests zur Stabilisierung 'V0.35 - 08.08.2018 '- Optimierung 'V0.36 - 06.12.2018 '- Optimierung '- Motorsound aus wenn Hupe an '******************** Übersicht Speicherbereiche Variablen ******************** 'Dim as Bit = 0 bis 1 'Dim as Byte = 0 bis 255 'Dim as Integer = -32768 bis +32767 'Dim as Word = 0 bis 65535 'Dim as Long = -2147483648 bis 2147483647 ' 1200000000 ' 960000000 'Dim as Single = 1,5 x 10^-45 bis 3,4 x 10^38 'Dim as Double = 5,0 x 10^-324 bis 1,7 x 10^308 'Dim as String = 254 Zeichen '****************************** Übersicht IO ********************************** 'IN/OUT Pin Typ Signalname 'PA0 5 O ESC 2 (Servo2) für Zusattzton z.B. Stickstoffzündungssound 'PA1 4 O ESC 1 (Servo1) für Motorsound 'PA2 1 - nicht genutzt da RESET Pin 'PB0 12 O 7-Segmentanzeigen A 'PB1 13 O 7-Segmentanzeigen B 'PB2 14 O 7-Segmentanzeigen C 'PB3 15 O 7-Segmentanzeigen D 'PB4 16 O 7-Segmentanzeigen E 'PB5 17 O MOSI + 7-Segmentanzeigen F 'PB6 18 O MISO + 7-Segmentanzeigen G 'PB7 19 O SCK + 7-Segmentanzeigen Punkt 'PD0 2 O LED 1500 Umdrehungen = 50Hz 'PD1 3 O 7-Segmentanzeile Anode Stelle 1 'PD2 6 O 7-Segmentanzeile Anode Stelle 2 'PD3 7 O 7-Segmentanzeile Anode Stelle 3 'PD4 8 O 7-Segmentanzeile Anode Stelle 4 'PD5 9 I Eingang Zusatzton 'PD6 11 I ICP1 Drehzahlsignal Zündspule '******************************* IOs setzen *********************************** 'Pins setzen Ddra = &B11111111 Ddrb = &B11111111 Ddrd = &B0011111 Porta = &B00000011 Portb = &B01111111 Portd = &B0011110 '************************** Variablen declarieren ***************************** Dim Icount As Long At &H60 Dim Wcountlo As Word At &H60 Overlay Dim Wcounthi As Word At &H62 Overlay Dim Y As String * 4 At &H70 Dim Z(4) As Byte At &H70 Overlay Dim I As Byte Dim Wert As Byte Dim Stelle As Byte Dim Impulse As Byte Dim Mfrequenz As Long Dim Freq1 As Word Dim Freq2 As Word Dim Timeout As Word Dim Test As Bit '$sim On Icp1 Oncapture On Ovf1 Onoverflow Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising 'Rising für steigende Flanke Config Servos = 2 , Servo1 = Porta.1 , Servo2 = Porta.0 , Reload = 50 , Interval = 400 '50µs X 400 Int = 20ms Zyklus Enable Icp1 Enable Ovf1 Enable Interrupts '***************************** Start Animation ******************************** ' _A 'F G|_| B 'E |_|. C ' D 'PB0 = A 'PB1 = B 'PB2 = C 'PB3 = D 'PB4 = E 'PB5 = F 'PB6 = G 'PB7 = DP ' 7 6 5 4 3 2 1 0 '&B 0 0 0 0 0 0 0 0 ' DP G F E D C B A Servo(1) = 10 Servo(2) = 10 Timeout = 0 Freq1 = 0 Test = 0 '******************************** Programm ************************************ 'Startanimation Portb = 0 Portd = 0 Waitms 2000 'Kalibrierungsmodus einmalig 100 = Leerlauf, 200 = Vollgas, 10 = Bremsen 'an ESS One + lange drücken, dann + kurz für Leerlauf wieder + kurz für Vollgas und 'wieder + kurz für Bremsen If Pind.5 = 1 Then Test = 1 Waitms 2000 Portb = 191 '&B10111111 Servo(1) = 20 '20x50µs = 1ms = Leerlauf Portd = 7 '&B00000111 'Neutral = -- Waitms 1500 Servo(1) = 40 '40x50µs = 2ms = Vollgas Portd = 1 '&B00000001 'Vollgas = ---- Waitms 1500 Servo(1) = 5 '5x50µs = 0,25ms = volle Bremse Portd = 15 '&B00001111 'Bremse = - Waitms 1500 Servo(1) = 20 Waitms 1500 End If Servo(1) = 30 'zum Anlaufen ohne Motor Waitms 1000 'Hauptschleife Main Main: Incr Timeout 'Bei Timeout: 0 U/min. 'Nur alle 100 Zyclen wird kurz 32x gemessen und das erste Mal auslassen 'Nach 1000 Zyclen wird aber jede Messung abgebrochen weil es Fehler geben muss wenn 'dies so lange dauert If Timeout > 100 Then Enable Icp1 If Timeout > 1000 Then Freq1 = 0 Freq2 = 20 Timeout = 0 Impulse = 0 End If 'Im Testmodus Wird Servo Wert angezeigt If Test = 1 Then Y = Str(freq2) Else Y = Str(freq1) 'Servo2 Ansteuern Wenn Funkkanal2 Angesteuert If Pind.5 = 1 Then Servo(2) = 40 Else Servo(2) = 5 If Timeout < 2 And Pind.5 = 0 Then Servo(1) = Freq2 '7-Segmantanzeigen ansteuern 'Führende Nullen eliminieren Y = Format(y , " 0") For Stelle = 1 To 4 Wert = Z(stelle) Select Case Wert 'gemeinsame Kathode gemeinsame Anode Case 48 : Portb = 192 '&B00111111 = 63 inv. 192 &B11000000 Anzeige:0 Case 49 : Portb = 249 '&B00000110 = 6 inv. 249 &B11111001 Anzeige:1 Case 50 : Portb = 164 '&B01011011 = 91 inv. 164 &B10100100 Anzeige:2 Case 51 : Portb = 176 '&B01001111 = 79 inv. 176 &B10110000 Anzeige:3 Case 52 : Portb = 153 '&B01100110 = 102 inv. 153 &B10011001 Anzeige:4 Case 53 : Portb = 146 '&B01101101 = 109 inv. 146 &B10010010 Anzeige:5 Case 54 : Portb = 130 '&B01111101 = 125 inv. 130 &B10000010 Anzeige:6 Case 55 : Portb = 216 '&B00100111 = 39 inv. 216 &B11011000 Anzeige:7 Case 56 : Portb = 128 '&B01111111 = 127 inv. 128 &B10000000 Anzeige:8 Case 57 : Portb = 144 '&B01101111 = 111 inv. 144 &B10010000 Anzeige:9 Case Else : Portb = 255 '&B00000000 = 0 inv. 255 &B11111111 Anzeige:aus End Select '&B00000000 = 8. If Freq1 = 9999 Then Portb = 0 Portd.stelle = 0 Waitus 100 Portd.stelle = 1 Next Stelle Goto Main '**************************** Interrupt Routinen ****************************** Oncapture: Disable Icp1 Incr Impulse 'LED ansteuern, wenn gemessen wird Portd.0 = 1 'Bei Erstem Impuls Von Messreihe Zähler Und Timer1 Reseten If Impulse = 1 Then Timer1 = 0 Icount = 0 End If 'Nach dem 17. Imuls = 16 Messungen Auswertung If Impulse = 17 Then Wcountlo = Timer1 Timer1 = 0 Mfrequenz = Icount / 16 Icount = 180000000 / Mfrequenz 'bei 4 Takter Doppelzündspule 240000000 Freq1 = Icount Impulse = 0 Timeout = 0 Icount = 0 Mfrequenz = 0 Portd.0 = 0 'Kopplung Frequenz an Servo und nur bei Änderungen wird gestellt Freq2 = Freq1 / 150 Freq2 = Freq2 + 20 If Freq2 < 20 Then Freq2 = 20 End If 'ICP1 wird nur aktiviert, wenn Impulszähler noch nicht auf 0 resetet If Impulse > 0 Then Enable Icp1 Return Onoverflow: Incr Wcounthi Return |
2018 - Projekt Umbau Pooltermometer auf RGB Mischfarben
$regfile = "attiny861.dat " $crystal = 14000000 ' $hwstack = 40 $swstack = 16 $framesize = 32 '$sim '************************* internen Oszilator übertakten ********************* Osccal = 255 'Programmversionen 'Änderungshistorie: 'V0.01-V0.17 2018-06-23 bis 29 Software Entwicklung + Test 'V0.18 2018-07-05 dunkelste Einstellung wieder heller mit Dimmeffekt '************** Alle Ports als Eingang oder Ausgang definieren **************** '0 = Eingang; 1 = Ausgang Config Pina.5 = Input Config Pina.6 = Input Config Pina.7 = Input Config Porta.1 = Output Config Porta.2 = Output Config Portb.4 = Output Config Portb.5 = Output Config Portb.6 = Output '******* Alle Ports auf 0 bzw. 1 setzen für definierten Anfangszustände ****** 'Bei Eingängen durch 1 den Pullupnwiderstand aktivieren 'PullUp-Widerstand einschalten Porta.5 = 1 Porta.6 = 1 Porta.7 = 1 '************************ analoge Eingänge einstellen ************************ Config Adc = Single , Prescaler = Auto , Reference = Aref 'Internal Start Adc '********************** 16 Bit Timer1 konfigurieren ************************** 'Timer konfigurieren 8000000 / 1 = 8MHz Config Timer1 = Timer , Prescale = 1 '200hz PWM x 2000 Teile je Zyklus = 400.000 '8.000.000 / 20 = 400.000 also Startwert Timer 255-20 = 235 'bei 8 bit Überlauf bei 255 Überlauf bei Timerstart 40 = 200khz in je 500 PWM Schritten Enable Timer1 'Timerüberlaufsprungmarke setzen On Timer1 Pwmfrequenz Start Timer1 '******************** Übersicht Speicherbereiche Variablen ******************* 'Dim as Bit = 0 bis 1 'Dim as Byte = 0 bis 255 'Dim as Integer = -32768 bis +32767 'Dim as Word = 0 bis 65535 'Dim as Long = -2147483648 bis 2147483647 'Dim as Single = 1,5 x 10^-45 bis 3,4 x 10^38 'Dim as Double = 5,0 x 10^-324 bis 1,7 x 10^308 'Dim as String = 254 Zeichen '****************************** Übersicht IO ********************************* 'IN/OUT Pin Typ Signalname 'PA0 20 AD Lichtsensor 'PA1 19 I LED hell 'PA2 18 I LED dunkel 'PA3 17 I ARef 'PA4 14 I frei 'PA5 13 I Impuls Rot 'PA6 12 I Impuls Grün 'PA7 11 I Impuls Blau 'PB0 1 I MOSI 'PB1 2 I MISO 'PB2 3 I SCK 'PB3 4 I frei 'PB4 7 O MOSFET Rot 'PB5 8 O MOSFET Grün 'PB6 9 O MOSFET Blau 'PB7 10 I RESET '********************** globale Variablen declarieren ************************ Dim Starttimer1 As Byte Dim Pwmrot As Integer Dim Pwmgruen As Integer Dim Pwmblau As Integer Dim Pwmtakt As Integer Dim Hell As Integer Dim Werthell As Integer Dim Werthelln As Integer Dim Tastverh As Integer Dim I As Integer 'Dim R As Integer 'Dim G As Integer '255 ca. 'Dim B As Integer '****************************** Subs declarieren ***************************** Declare Sub Main Declare Sub Helligkeit Sub Main Disable Interrupts I = 0 Portb.4 = 1 Portb.5 = 1 Portb.6 = 1 Pwmrot = 0 Pwmgruen = 0 Pwmblau = 0 Pwmtakt = 0 Werthell = 1 Werthelln = 1 Tastverh = 1000 Starttimer1 = 215 '255-20= 235 = 200hz Wait 5 'rücksetzen nach 16 = 1kHz Timer1 = Starttimer1 Enable Interrupts 'Hauptschleife Do I = I + 1 'alle 1 s Helligkeit holen If I > Werthell Then Call Helligkeit 'Wenn Eingang rot aktiv, dann aufdimmen und umgekehrt If Pina.5 = 0 Then If Pwmrot < Werthell Then Pwmrot = Pwmrot + 1 If Pwmrot > Werthell Then Pwmrot = Pwmrot - 10 Elseif Pina.5 = 1 And Pwmrot > 0 Then Pwmrot = Pwmrot - 1 End If 'Wenn Eingang grün aktiv, dann aufdimmen und umgekehrt If Pina.6 = 0 Then If Pwmgruen < Werthell Then Pwmgruen = Pwmgruen + 1 If Pwmgruen > Werthell Then Pwmgruen = Pwmgruen - 10 Elseif Pina.6 = 1 And Pwmgruen > 0 Then Pwmgruen = Pwmgruen - 1 End If 'Wenn Eingang bleu aktiv, dann aufdimmen und umgekehrt If Pina.7 = 0 Then If Pwmblau < Werthell Then Pwmblau = Pwmblau + 1 If Pwmblau > Werthell Then Pwmblau = Pwmblau - 10 Elseif Pina.7 = 1 And Pwmblau > 0 Then Pwmblau = Pwmblau - 1 End If 'Schleifengeschwindigkeit helligkeit negiert Waitus Werthelln Loop End Sub '============================================================================= '============================================================================= '============================================================================= '************************* Unterprogramm Tag-Nacht *************************** Sub Helligkeit I = 0 'Helligkeitssensor auslesen Hell = Getadc(0) 'da 0V = 1024 diesen wert abziehen Hell = Hell - 1024 'Wert negieren damit hell = 0V = 1000 und dunkel = 1,2V = 0 Hell = Hell * -2 'Empfindlichkeit begrenzen If Hell < 40 Then Werthell = 40 If Hell > Tastverh Then Werthell = Tastverh Else Werthell = Hell Werthelln = Tastverh - Werthell Werthelln = Werthelln / 2 If Werthelln > 300 Then Werthelln = 300 If Werthelln < 15 Then Werthelln = 15 End Sub '============================================================================= '============================================================================= '============================================================================= '*********************** Unterprogramm Sekundentimer ************************* 'PWMinterupt 'Der timer soll 500Hz PWM erzeugen welches in 255 Stufen geteilt ist. 'Dazu muss er 500x1000 = 500000x in der Sekunde angesprochen werden Pwmfrequenz: 'rücksetzen nach 16 = 1kHz Timer1 = Starttimer1 'Takt zurücksetzen wenn 500 Takte innerhalb eines Zyklus durchlaufen Incr Pwmtakt If Pwmtakt > Tastverh Then Pwmtakt = 0 'Ausgänge je nach Takt und Vorgabenvergleich setzen If Pwmtakt < Pwmrot Then Portb.4 = 0 Else Portb.4 = 1 If Pwmtakt < Pwmgruen Then Portb.5 = 0 Else Portb.5 = 1 If Pwmtakt < Pwmblau Then Portb.6 = 0 Else Portb.6 = 1 Return End |