$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 8
$framesize = 24
Match_rom Alias &H55
Skip_rom Alias &HCC
Auslesen Alias &HBE
Messen Alias &H44
Dim Lftag As Word                                           'Tag des Jahres
Dim Jahreszeit As Bit                                       'Jahreszeiten für Sommer / Winter
Dim Tz As Byte                                              'Zeit Zone
Dim Wochentag As Byte , Monat As Byte , Jahr As Word        'Datums anzeige
Dim Takt as byte  , Takt_alt as byte
Dim Ds1820id(16) As Byte , Sc(9) As Byte                    'Anzahle 
Sensoren 8 = 1  16 = 2 , 24 = 3 , 32 = 4  ,40 = 5  , 48 = 6 , 54 = 7
Dim I As Byte
Dim Dgc As Integer
Dim T1 As Integer , T2 As Integer ,temperr as bit
'für Multiplexen
Dim Einerh as byte , Zehnerh as byte , Einermin as byte , Zehnermin as byte
Dim Zahl as Byte , Stelle as Byte
Dim Dezimalziffern(4) as  Word
'Für Temperatur
Dim T10 As Integer , T20 As Integer      'für min max berechnung
'Für Geschwindikeit
Dim Strecke as byte , weg as word , radzeit as byte , kmh1 as word , kmh as word
'Für ADC
Dim Messwert As word , Spannung As Single , Spannung1 As Single , Target As String * 10
Declare Sub Funkuhr
Declare Sub Tempmessung
declare Sub Geschwindigkeit
declare Sub Einzelzeit
Declare Function Decigrades18b20(byval Sc(9) As Byte) As Integer       'für DS18b20 ( China 
Sensoren )
Config Lcd = 16 * 2               '8x2 Display    = 16x1a
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
Db7 = Portd.7 , E = Portd.2 , Rs = Portd.3
Initlcd
Cls
Config Dcf77 = PinC.0 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Update = 0 , Check = 1 , Inverted = 0 , Gosub = Sectic                   'Update = 2 wird stündlich (default 3uhr nachts), Update = 0 Funkhr wird immer aktuell gehalten
'Config Dcf77 = PinC.0 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 0 , Gosub = Sectic
Config Date = Dmy , Separator = .
Cursor  off
Config Adc = Single , Prescaler = auto , Reference =  Internal_2.56      'Internal_1.1  oder Internal_2.56  avcc  aref
Const Adc_multi = 0.0025 '2,56/1024
Config Portb.3 = Output
Config timer2 = Timer , PRESCALE = 8
Config Timer0 = Pwm ,  Compare Pwm = Clear Up , Prescale = 8
On Ovf2 Isr_multiplex                                       'hier werden die Anzeigen geschalten
Enable Ovf2
Enable Interrupts
'        76543210
Ddra = &B00001111      'Tempsensoren A6, Reedkontakt A5, Spannung A4  , A0-A3 Transistor für Segmente Eingang = 0 Ausgang = 1
DDRC = &B11111110      'C7 - C1 4 * 7 Segmentanzeigen , C0 DCF-77
'************ Auslesen Temp 
Sensoren ************************
Config  1WIRE = Porta.6                       '1Wire-Port festlegen war mal PortC.1
Restore Sensor_ids
For I = 1 To 17
   Read Ds1820id(i)
Next I
1wreset
1wwrite Skip_rom
1wwrite Messen
Cls
Reed Alias PinA.5
Set PortA.5
reed = 1
Start Adc
Do
Dezimalziffern(1) = Zehnerh                                  'einzenle Zahlen für die Zeit anzeige
Dezimalziffern(2) = Einerh                                   'einzenle Zahlen für die Zeit anzeige
Dezimalziffern(3) = Zehnermin                                'einzenle Zahlen für die Zeit anzeige
Dezimalziffern(4) = Einermin                                 'einzenle Zahlen für die Zeit anzeige
Debounce Reed , 0 , Kilometer , Sub                         'Reedkontakt für Geschwindigkeit (noch nicht ganz sicher ob es bis 80km/h geht
Call Tempmessung                                            'Temperaturmessung starten
Call Geschwindigkeit                                         'kmh anzeige aufrufen
Call Einzelzeit                                              'Einzelne Zeitstellen
OCR0 = 250                                                    'Display helligkeit
Locate 1 , 1
lcd Zehnerh ; einerh  ;":" ; Zehnermin ; Einermin      'Einzelne Zeit anzeigen
'if Takt >=3 and Takt <=30 or Takt >=33 and Takt <=59 then           'später wieder einblenden
if kmh <= 9 then
Locate 2  , 11    '10
Lcd " "; kmh ; "km/h"
else
Locate 2 , 11    '10
Lcd kmh ; "km/h"
end if
'end if
'Messwert = 2
Messwert = Getadc(4)
Spannung = Messwert * Adc_multi
Spannung = Spannung * 5
'if Takt <3 or Takt >30 and Takt <33 then                       'später wieder einblenden
'Runden Board Spannung messen
Target = Str(spannung)
Target = Fusing(spannung , "#.##")
If spannung <9 then
Locate 2 , 6     '10
Lcd " " ; Target ; "V"
else
Locate 2 , 6     '10
Lcd Target ; "V"
end if
'end if
Loop
'(
Sub Funkuhr
Lftag = Dayofyear()                                         'Tag des Jahres
Incr Lftag                                                  'Tag des Jahres
Tz = Dcf77timezone()                                        'Zeitzone
End Sub Funkuhr
')
Sub Tempmessung
'Belegung von Pins zu einen von Links nach Rechts Flach oben
'1 = GND
'2 = Signal
'3 = VCC (5V)
 '  -  -  -
 '  1  2  3
 '   \ _ /
If Takt <> Takt_alt Then
Takt_alt = Takt
1wverify Ds1820id(1)                                       'Sensor aus China
       Locate 2 , 1
       If Err = 1 Then
       temperr = 1
       Lcd "L NIO"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T1 = Makeint(sc(1) , Sc(2))
        If Sc(9) = Crc8(sc(1) , 

 Then
        Dgc = Decigrades18b20(sc(9))
        End If
       if Takt >=5 and Takt <10 or Takt >=15 _
       and Takt <20 or takt >=25 and Takt <30 _
       or takt >=35 and Takt <40 or takt >=45 _
       and Takt <50 or takt >=55 then
       If T1 >= 10 Then
          Locate 2 , 1
          Lcd "L " ; Dgc ; "C"
          Else
          Locate 2 , 1
          Lcd "L " ; Dgc ; "C"
       End If
       end if
   End if
1wverify Ds1820id(9)                                       'Sensor aus China
       Locate 2 , 1
       If Err = 1 Then
       temperr = 1
       Lcd "O NIO"
       Elseif Err = 0 Then
      1wwrite Auslesen
      Sc(1) = 1wread(9)
      T2 = Makeint(sc(1) , Sc(2))
        If Sc(9) = Crc8(sc(1) , 

 Then
        Dgc = Decigrades18b20(sc(9))
        End If
       if Takt <5 or Takt >=10 and Takt <15 _
       or Takt >=20 and takt <25 or Takt >=30 _
       and takt <35 or Takt >=40 and takt <45 _
       or Takt >=50 and takt <55 then
       If T2 >= 10 Then
          Locate 2 , 1
          Lcd "O " ; Dgc ; "C"
          Else
          Locate 2 , 1
          Lcd "O  " ; Dgc ; "C"
       End If
       end if
 If Takt = 9 Or Takt = 19 Or Takt = 29 _
   Or Takt = 39 Or Takt = 49 Or Takt = 59 then              'alle 10 sekunden Messen
   Restore Sensor_ids
     For I = 1 To 17
     Read Ds1820id(i)
     Next I
     1wreset
     1wwrite Skip_rom
     1wwrite Messen
     End If
  End if
End If
End Sub TEMPMESSUNG
Sub Geschwindigkeit
'V = S : T
'Geschwindigkeit = Weg / Zeit
if radzeit > 1 then
radzeit = 0
strecke = 0
end if
weg = Strecke * 1455                                        'radumfang im mm gemessen an Heidenheim reifen
if radzeit = 1 then
kmh1 = weg / radzeit
end if
kmh= kmh1 / 3600
End Sub Geschwindigkeit
Sub Einzelzeit
'Zehner Stunden
If _hour <10 or _hour = 20 then Zehnerh = 0
if _hour =>10 and _hour <20 then Zehnerh = 1
if _hour >=20 then Zehnerh = 2
'Einer Stunden
If _hour <10 then einerh = _hour
if _hour =>10 and _hour <20 then
Einerh = _hour - 10
End if
if _hour >20 then
einerh = _hour - 20
End if
'Zehner Minuten
if _Min <10 then Zehnermin = 0
if _Min =>10 and _Min <20 then Zehnermin = 1
if _Min =>20 and _Min <30 then Zehnermin = 2
if _Min =>30 and _Min <40 then Zehnermin = 3
if _Min =>40 and _Min <50 then Zehnermin = 4
if _Min =>50 then Zehnermin = 5
'einer Minuten
if _min <10 then einermin = _min
if _min >=10 and _min <20 then
einermin = _min - 10
end if
if _min >=20 and _min <30 then
einermin = _min - 20
end if
if _min >=30 and _min <40 then
einermin = _min - 30
end if
if _min >=40 and _min <50 then
einermin = _min - 40
end if
if _min >=50 then
einermin = _min - 50
end if
End sub Einzelzeit
'Formal für China 
Sensoren ( DS18B20 )
Function Decigrades18b20(byval Sc(9) As Byte)
 Decigrades18b20 = 0
 Decigrades18b20 = Makeint(sc(1) , Sc(2))
 Decigrades18b20 = Decigrades18b20 / 16
End Function
Sectic:
Takt = _sec
Radzeit = Radzeit + 1
Return
Kilometer:
incr STRECKE
return
'Tempsensoren
Sensor_ids:
Data &H28 , &HA0 , &H29 , &H34 , &H05 , &H00 , &H00 , &H3A  'Innen Sensor T1
Data &H28 , &HDE , &H06 , &H34 , &H05 , &H00 , &H00 , &H26  'Ausen Sensor T2
Isr_multiplex:
'Bei jedem Aufruf der ISR wird
'sicherheitshalber alle Stellen über die Transistoren der Stellenansteueung die Anzeige abgeschaltet
'die Segmente der nächsten anzuzeigenden Dezimalziffer vorbereitet
'die entsprechende Stelle eingeschaltet.
  If Stelle < 5 Then Incr Stelle Else Stelle = 1           'Index weiterschalten zur nächsten Stelle
  Porta = Porta And &B00000000                              'Alle 4 Stellen abschalten, andere Portpins nicht verändern  '&B11110000
  Portc = Lookup(dezimalziffern(stelle) , Ziffern_pattern)  'Lookup holt aus den Daten unter Ziffern_pattern
                                                            'das Pattern, das zur Zahl in Dezimalstellen(stelle) gehört
                                                            'und setzt damit im PORTB die Segmentportpins
  Select Case Stelle                                        'und eine Stelle der vier wieder unter Strom setzen
    Case 1 : Porta.0 = 1                                    'Stelle 1 einschalten  am Porta.0
    Case 2 : Porta.1 = 1                                    'Stelle 2 einschalten  am Porta.1
    Case 3 : Porta.2 = 1                                    'Stelle 3 einschalten  am porta.2
    Case 4 : Porta.3 = 1                                    'Stelle 4 einschalten  am porta.3
  End Select
Return
Ziffern_pattern:                                            'Daten zur Segmentansteuerung.
                                                            'Eine "1" bringt zusammen mit der Stellenansteuerung
                                                            'das entsprechende Segment zum leuchten
                                            '   10 9 8 7 6
                                            '    . . . . .
                                            '       a             e = 1
'       76543210                            '        ________         d = 2
Data &B01111110  '0                         '   |            |      A(K) = 3
Data &B00001100  '1                         '   |            |         c = 4
Data &B10110110  '2                         ' f |            | b      DP = 5
Data &B10011110  '3                         '   |       g   |         b = 6
Data &B11001100  '4                         '   |_______ |         a = 7
Data &B11011010  '5                         '   |            |      A(K) = 8
Data &B11111010  '6                         '   |            |         f = 9
Data &B00001110  '7                         ' e |            | c       g = 10
Data &B11111110  '8                         '   |       d    |
Data &B11011110  '9                         '   |________|
                                                       '   . . . . .
                                                      '   1 2 3 4 5
			
		
 
	
Lesezeichen