Hier sind wie versprochen ein Bild und der fertige Code.
(Die Option vier Sensoren abzufragen und mit dem Taster durchzuschalten ist noch nicht ganz fertig aber sonst funktioniert es einwandfrei).
Schaltplan:
https://www.roboternetz.de/phpBB2/al...hp?pic_id=2485
Bild:
https://www.roboternetz.de/phpBB2/al...hp?pic_id=2484
Code:
$regfile = "M8def.dat"
$crystal = 4000000
'--------Segmente---------------
Config Portd = Output
Portd = 1 'anfangs alles aus
'----------Anode Display---------
Config Portb = Output
Digit1 Alias Portb.1
Digit2 Alias Portb.2
Digit3 Alias Portb.3
Digit4 Alias Portb.4
Dp Alias Portb.5
Portb = 1 'auch hier alles aus
'---------------Taster------------
Config Pind.7 = Input
Pind.7 = 1
'Taster Alias Pind.7
'---------AD-Wandler Config-------------
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
'--------Timer Config----------------
Dim Stelle As Byte 'Umschaltung zehner/einer/grad_zeichen
Stelle = 1 'start mit Zehner
Config Timer0 = Timer , Prescale = 64
On Timer0 Timer_routine 'wird 4.000.000/64/256 ~ 244 mal pro Sekunde aufgerufen
Enable Timer0
Enable Interrupts
'Declare Sub Naechste
Dim Messung As Integer
Dim Wert_stelle(4) As Byte 'Variable für die einzelnen Stellen im Array(3)
Dim I As Byte 'Variable für Ausgabe der einzelnen Zeichen
Dim Temp As Integer 'Variable für Temperatur nach Berechnung
Dim Segmente(12) As Byte 'Variable für einzelne Segmente jeder Ziffer
Dim Messung2 As Integer 'für Minuszeichen
Dim Messpunkt As Byte
Messpunkt = 0
Const Offset = 150.5
Restore Segment_daten 'Tabelle der Zeichen laden
For I = 1 To 12
Read Segmente(i)
Next I
Wert_stelle(3) = 11 '°fest auf Stelle 3
Wert_stelle(4) = 12 'minus fest auf Stelle 4
Do
'If Taster = 0 Then Gosub Naechste
Messung = Getadc(messpunkt) * 64 'Messung des ADC in Variable(Messung) speichern und mit 64 multiplizieren
Messung = Messung / 101 'Messung mit 101 dividieren
Messung = Messung - Offset
Temp = Messung / 10 'für direkte Temperaturanzeige 150 abziehen 'ganzahlige Division, also 47 / 10 = 4
Wert_stelle(1) = Temp + 1
Temp = Messung Mod 10 'Mod ergibt den Rest der Division, also bei 47 / 10 ist Mod = 7
Wert_stelle(2) = Temp + 1
Messung2 = Getadc(messpunkt)
If Messung2 < 237 Then Portb.0 = 1 'wenn getadc(0) kleiner als 237 (0°) dann minus an
If Messung2 > 237 Then Portb.0 = 0
Waitms 1000 'hier vielleicht noch eine kleine Pause - um pendeln zwischen 2 temperaturen zu reduzieren
Loop
End
Timer_routine:
Portb.stelle = 1 'Vorherige Stelle ausschalten
Portd = 1 'zusätzlich alle Segmente aus
Incr Stelle 'auf nächste Stelle umschalten
If Stelle = 5 Then Stelle = 1 'am Ende wieder zurück zur ersten Stelle
Portd = Segmente(wert_stelle(stelle)) 'Neue Segmente ausgeben
Portb.stelle = 0 'neue Stelle einschalten
Return
'Sub Naechste
'Incr Messpunkt
'If Messpunkt = 2 Then Messpunkt = 0
'End Sub
Segment_daten:
'gemeinsame Anode:
' 0 1 2 3 4 5 6 7 8 9
'Data &H3F , &H6 , &H05B , &H04F , &H066 , &H06D , &H07D , &H7 , &H7F , &H6F
'gemeinsame kathode:
' 0 1 2 3 4 5 6 7 8 9 grad minus
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00 , &H10 , &B10011100 , &B1011
Lesezeichen