$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