+++ Hier werde ich nach und nach alle Programme aus meiner oder mit Quellangabe fremder Hand einfügen +++

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., Servo2 = Porta., 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.= 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.= 1 Then Servo(2) = 40 Else Servo(2) = 5
If Timeout < 2 And Pind.= 0 Then Servo(1) = Freq2



'7-Segmantanzeigen ansteuern
'Führende Nullen eliminieren
= Format(, "   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.= 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
   '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.= Input
  Config Pina.= Input
  Config Pina.= Input
  Config Porta.= Output
  Config Porta.= Output
  Config Portb.= Output
  Config Portb.= Output
  Config Portb.= 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.= 1
  Porta.= 1
  Porta.= 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.= 1
  Portb.= 1
  Portb.= 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.= 0 Then
     If Pwmrot < Werthell Then Pwmrot = Pwmrot + 1
     If Pwmrot > Werthell Then Pwmrot = Pwmrot - 10
     Elseif Pina.= 1 And Pwmrot > 0 Then
       Pwmrot = Pwmrot - 1
   End If
   'Wenn Eingang grün aktiv, dann aufdimmen und umgekehrt
   If Pina.= 0 Then
     If Pwmgruen < Werthell Then Pwmgruen = Pwmgruen + 1
     If Pwmgruen > Werthell Then Pwmgruen = Pwmgruen - 10
     Elseif Pina.= 1 And Pwmgruen > 0 Then
       Pwmgruen = Pwmgruen - 1
   End If
   'Wenn Eingang bleu aktiv, dann aufdimmen und umgekehrt
   If Pina.= 0 Then
     If Pwmblau < Werthell Then Pwmblau = Pwmblau + 1
     If Pwmblau > Werthell Then Pwmblau = Pwmblau - 10
     Elseif Pina.= 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.= 0 Else Portb.= 1
  If Pwmtakt < Pwmgruen Then Portb.= 0 Else Portb.= 1
  If Pwmtakt < Pwmblau Then Portb.= 0 Else Portb.= 1
  Return
  End

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

Nach oben