Hallo WL,
also, ich habe hier 2 Tsic306, der Eine steckt in einem Steckboard mit LCD-Display und Mega8.
Der Andere hängt an einer 2m Strippe und ist an einer fertig aufgebauten Schaltung angeschlossen.
Projekt LED-Thermometer, an dem ich nun schon einige Wochen sitze. Sollte höchstens 1 bis 2 Wochen dauern.
Dieses LED-Thermom. hat einen SAA1064, vier etwas größere 7Segment-LEDs und einen tiny44 (wegen I2C).
Weiterhin habe ich noch zwei Netzteile (ein 5V-Schaltnetzteil und ein Trafonetzteil mit 7805), die abwechselnd
an beiden Schaltungen angeklemmt waren.
Ich dachte schon das ich den Fehler gefunden habe, denn jedesmal wenn ich das Schaltnetzteil an das Steckboard
angeschlossen habe, zeigte die LCD-Anz. springende Werte. Beim Trafonetzteil war das nicht so.
Nun habe ich das Trafonetzteil an das LED-Therm. angeschlossen (weil hier sonst immer das Schaltnetzteil angelötet
war) und dachte das jetzt alles funktioniert.
Die Enttäuschung war groß, die Anzeige-Werte springen weiterhin. Am Netzteil liegt es jedenfalls beim LED-Therm. nicht.
Die Variable "InRegister" beim LED-Therm. ausgeben lässt sich erstmal nicht realisieren.
Am Besten ist, ich schicke hier mal den gesamten Code vom LED-Thermometer rüber.
Vielleicht habe ich dort einen Fehler gemacht und Du kannst mir einen Tipp zur Verbesserung geben.
O.k., die vielen If Then Anweisungen sind peinlich, aber als Anfänger wuste ich mir nicht anders zu helfen.
Gruß
berger38
Code:
' LED_Thermometer.bas
$regfile = "attiny44.dat" ' ...............................................specify the used micro
$crystal = 12000000 ' ....................................................externer Quarz mit 12MHz
$hwstack = 40 ' ...........................................................default use 40 for the hardware stack
$swstack = 16 ' ...........................................................default use 10 for the SW stack
$framesize = 32 ' ..........................................................default use 32 for the frame space
Ddrb = &B0000
Portb = &B0000
Ddra = &B11111111
Porta = &B10101111
Config Sda = Porta.6
Config Scl = Porta.4
Config Int0 = Falling
On Int0 Int0int
Enable Int0
Enable Interrupts
Dim Inregister As Word
Dim Bitzaehler As Byte , Parity1 As Byte , Parity2 As Byte
Dim Parity_z1 As Byte , Parity_z2 As Byte , I As Byte
Dim Parity_err As Byte , Messungok As Bit
Dim Timeout As Word , Io As Byte
Dim Zahl As Word
Dim Ziffer1 As Integer , Ziffer2 As Integer , Ziffer3 As Integer
Dim Rest1 As Integer
Dim Hz1 As Integer , Hz2 As Integer
Dim Temperatur As Single
Dim Wert1 As Integer
Dim Wert2 As Integer
Dim Minus As Single
Dim Digi1 As Byte , Digi2 As Byte , Digi3 As Byte , Digi4 As Byte
Do
Io = 1 '...............................................................wir nehmen mal an das alles gut wird
Gosub Neuemessung '............................................Neue Messung vorbereiten
Do
Waitms 1 : Incr Timeout
Loop Until Messungok = 1 Or Timeout > 200 '.............Telegramm abwarten / "MessungOK" wird in "Int0Int:"
If Timeout > 200 Then '..........................................generiert
Io = 0 : Temperatur = -99 '.....................................!!! FEHLER !!!
End If
Wert1 = Temperatur '.............................................Dezimalzahl in ganze Zahl umgewandelt
If Wert1 >= 0 Then Minus = 0 '.................................wird als 0.0 angezeigt
If Wert1 <= -1 Then Minus = - '................................wird als -0.0 angezeigt
If Wert1 >= 0 Then Wert2 = Wert1 '..........................positiver Wert bleibt positiv zum Rechnen
If Wert1 <= -1 Then '.............................................zum Rechnen muss hier negativer Wert
Wert2 = Abs(wert1) '..............................................in positiven Wert umgewandelt werden
End If
Zahl = Wert2 '.......................................................Umwandlung in Word zum besseren Rechnen
Ziffer1 = Zahl / 100 '..............................................Rechenzyklus um eine max. 3 stellige Zahl
Hz1 = Ziffer1 * 100 '..............................................in ihre einzelnen Ziffern zu zerlegen
Rest1 = Zahl - Hz1
Ziffer2 = Rest1 / 10
Hz2 = Ziffer2 * 10
Ziffer3 = Rest1 - Hz2
Waitms 200
If Minus = - Then Digi1 = &H40
If Minus = 0 Then Digi1 = &H00
If Ziffer1 = 0 Then Digi2 = &H00
If Ziffer1 = 1 Then Digi2 = &H06
If Ziffer1 = 2 Then Digi2 = &H5B
If Ziffer1 = 3 Then Digi2 = &H4F
If Ziffer1 = 4 Then Digi2 = &H66
If Ziffer1 = 5 Then Digi2 = &H6D
If Ziffer1 = 6 Then Digi2 = &H7D
If Ziffer1 = 7 Then Digi2 = &H07
If Ziffer1 = 8 Then Digi2 = &H7F
If Ziffer1 = 9 Then Digi2 = &H6F
If Ziffer2 = 0 Then Digi3 = &H3F + 128
If Ziffer2 = 1 Then Digi3 = &H06 + 128
If Ziffer2 = 2 Then Digi3 = &H5B + 128
If Ziffer2 = 3 Then Digi3 = &H4F + 128
If Ziffer2 = 4 Then Digi3 = &H66 + 128
If Ziffer2 = 5 Then Digi3 = &H6D + 128
If Ziffer2 = 6 Then Digi3 = &H7D + 128
If Ziffer2 = 7 Then Digi3 = &H07 + 128
If Ziffer2 = 8 Then Digi3 = &H7F + 128
If Ziffer2 = 9 Then Digi3 = &H6F + 128
If Ziffer3 = 0 Then Digi4 = &H3F
If Ziffer3 = 1 Then Digi4 = &H06
If Ziffer3 = 2 Then Digi4 = &H5B
If Ziffer3 = 3 Then Digi4 = &H4F
If Ziffer3 = 4 Then Digi4 = &H66
If Ziffer3 = 5 Then Digi4 = &H6D
If Ziffer3 = 6 Then Digi4 = &H7D
If Ziffer3 = 7 Then Digi4 = &H07
If Ziffer3 = 8 Then Digi4 = &H7F
If Ziffer3 = 9 Then Digi4 = &H6F
I2cstart '.................................................................I2c-Bus starten
I2cwbyte &H70 '.......................................................schreibe Empfangsadresse
I2cwbyte &H00 '.......................................................schreibe Register-Adresse
I2cwbyte &H27 '.......................................................schreibe Einstellungen, auch LED-Helligkeit
I2cwbyte Digi1 '........................................................Digit 1 = ( z.B. Ziffer 2 )
I2cwbyte Digi2 '........................................................Digit 2 = ( z.B. Ziffer 3 )
I2cwbyte Digi3 '........................................................Digit 3 = ( z.B. Ziffer 7 )
I2cwbyte Digi4 '........................................................Digit 4 = ( z.B. Ziffer 9 )
I2cstop '..................................................................Ende der Durchsage
Loop
Neuemessung:
Timeout = 0
Messungok = 0
Parity_err = 0
Inregister = 0
Bitzaehler = 0
Parity_z1 = 0
Parity_z2 = 0
Return
Int0int:
Incr Bitzaehler
Select Case Bitzaehler
Case 1 '...........................................................................Start-Bit MSB
Case 2 To 9 '....................................................................Daten MSB
Waitus 60 '.......................................................................ungefähr Mitte (gesamt-Bitbreite=125µs)
Shift Inregister , Left
If Pinb.2 = 1 Then '............................................................Bit="1" ?
Inregister = Inregister Or 1 '................................................dann rein damit
Incr Parity_z1 '.................................................................."1"-Bits zählen
End If
Case 10 '..........................................................................Parity-Bit MSB
Waitus 60
Parity1 = Parity_z1 Mod 2 '..................................................gerade ?
If Pinb.2 = 1 And Parity1 = 0 Then
Incr Parity_err '..................................................................FEHLER !
End If
Case 11 '..........................................................................Start-Bit LSB
Case 12 To 19 '.................................................................Daten LSB
Waitus 60 '.......................................................................ungefähr Mitte (gesamt-Bitbreite=125µs)
Shift Inregister , Left
If Pinb.2 = 1 Then '............................................................Bit="1" ?
Inregister = Inregister Or 1 '................................................dann rein damit
Incr Parity_z2 '................................................................."1"-Bits zählen
End If
Case 20 '.........................................................................Parity-Bit LSB
Waitus 60
Parity2 = Parity_z2 Mod 2 '.................................................gerade ?
If Pinb.2 = 1 And Parity2 = 0 Then
Incr Parity_err '.................................................................FEHLER !
End If
If Parity_err = 0 Then
Temperatur = Inregister * 250
Temperatur = Temperatur / 256
Temperatur = Temperatur - 500
Temperatur = Temperatur
Parity_err = 0
Inregister = 0
Bitzaehler = 0
Parity_z1 = 0
Parity_z2 = 0
Messungok = 1
Waitms 3
Else
Temperatur = -99
Io = 0 '......................................................................Parity-Fehler
End If
End Select
Return
'.............so ist es etwas übersichtlicher !..................
Lesezeichen