Mir geht es in erster Linie darum Chips wie z.B. der DS3213 und damit verbunden die I2C Programmierung verstehen zu lernen.
Ich bin auch über 60 und brauche halt etwas länger, um das alles zu kapieren, und ich will wissen, was ich mache.
Beim Arduino geht ja alles mit Lib's und wehe, es geht nicht.
Das mit dem alter verstehe ich aber das mit Arduino verstehe ich überhaupt nicht. Ich kenne bei dem sehr verbreidetem System das die µC von AVR sind und die meisten Module auch ein ISP bereitstellen. Somit ist ein Zwischenschritt über ein Bootloader auch nicht nötig wenn man sich für Bascom- Pprogrammierung entschieden hat. Nur der verwendete Programmer ist oft ein Problem. Lib’s sind doch „nur Codeschnipsel“ die einen bei der eigenen Programmierung viel abnehmen können. Nicht nur Tippen nein der Lösungsweg ist es.
In diesem Fall geht es mir darum, die Zeit, wenn nötig, aus der Systemzeit des PC's auszulesen, damit ich das nicht immer von Hand einstellen muss.
Da sind wir wieder bei meinem Thema die „ZEIT“. Also du hast die Zeit , wann auch immer, ein PC an dein Projekt anzuschließen um eine genaue Zeit zu synchronisieren okay. Aber das alles benötig mehr Zeit als die Projektzeit sehr genau zu halten. Warum denkst du das dein RTC- Modul( meist mit 32,768 k Quarz bestückt) eine genauere Zeit wie die durch den [/QUOTE]µC erzeugten mit 16,000 M Quarz Oszillator bereit gestellt werden kann. Dein PC erstellt die Uhrzeit auch nur so wie es dein Controller auch macht, wenn erlaubt.
Die PC- Zeit kann natürlich auch nur so genau sein wie die Raumzeit, diese beziehen wir zur Zeit aus dem Web.
Was ich damit sagen möchte. Nicht die Schnelligkeit des Einzelnen ist immer entscheidend nein die Beständigkeit aller.
[/QUOTE]
Mein DS3231 hat sich zwischendurch wieder mehrfach zurückgesetzt, was ich schon in #6 beschrieben habe.
Das Problem besteht also weiterhin.
Ansonsten reicht es mir, in einem Programm die aktuelle Uhrzeit auszulesen, um z.B. einen Datenlogger mit einem Zeit Stempel zu versehen.[
QUOTE]
Woher weist du das es am RTC- Init liegt ?
Bist du dir sicher das es nicht ein Fehler in der Buslinie ist?
Könnte es sein das die Auswertung des µC nicht falsch aber fehlerhaft ist?
Kann es sein du hast keine Zeit dein Projekt Schritt für Schritt zu realisieren ?
Um dein Hauptanliegen zu erfüllen würde ich Vorschlagen teste erst mal den I²C Bus mit nur einen Teilnehmer. LCD- Displays solle erst als letztes im Bus „mitfahren“ dürfen. Die sind so was von faul das Protokoll umzusetzen, das es damit immer wieder Probleme gibt.
Egal was und wie viele Busteilnehmer du anschließen möchtest, mache immer vorab ein Bustest. Mal ein Beispiel hier.
'***********************************
'* hier die minimal Vaiante *
'***********************************
$regfile "m32def.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 64
$baud = 19200
Waitms 100
$lib "i2c_TWI.lib" 'Hardware I²C einbinden
Config Twi = 100000 'Takt 100kHz 400 geht auch noch
' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
Twcr = &B00000100 ' nur TWEN setzen
'+++ zum Test ob I²C Hardware OK ist +++
Gosub I2c_test
'++++++++++++++++++++++++++++++++++++++
'für Test die am Port B.0 angeschlossenen Temperatursensoren
Declare Sub Ds1820_alleseriennummern()
'Temperatursensor Anschluß an Portpin B.0
Dim 1wtemp_adresse_1(8) As Byte ' Adresse des Temperatursensors 1
Dim 1wtemp_adresse_2(8) As Byte ' Adresse des Temperatursensors 2
Dim Temp_bytes(9) As Byte
Dim Tempdif As Integer
Dim Tempdif1 As Integer 'Variable zur Temp. Berechnung DeziGrad
Dim Temp1 As Single
Dim Temp2 As Single
'Temperatursensoren DS18S20 + DS18B20 an PortB.0 (Bascom Unterprogramm einbinden)
Config 1wire = Portb.0 'Temperatursensor 1und2
Portb.0 = 1 'Port auf H schalten
'------Temperatursensor erkennen-------
'testet die am Portpin B.0 angeschlossenen Temperatursensoren
Call Ds1820_alleseriennummern()
1wtemp_adresse_1(1) = 1wsearchfirst() 'ist der erste gefundene Sensor
1wtemp_adresse_2(1) = 1wsearchnext() 'suche nächsten
'1wtemp_adresse_3(1) = 1wsearchnext() 'wenn noch mehr erweitern
'Analog-Port aktivieren
Config Adc = Single , Prescaler = Auto , Reference = Internal '= Referenzspannung auf 2.56 Volt
Start Adc
'an Port-Pin A7 LED als Lichtsensor
Dim Hell As Word
'Hinweis: Diese Einstellung reserviert ein paar ROM-Speicher mehr..
'nur nötig wenn eine Var den Typ Single hat. Die letzte Stelle wird gerundet.
'Format für Single eine Nachkommastelle
Config Single = Scientific , Digits = 1 '1 Nachkommastellen oder wie auch immer
'### ist I²C IC für LCD ##################
$lib "Lcd_i2c.lib" 'ersetzt die Standard LCD Library
Dim _lcd_e As Byte 'LCD im 4-Bit Modus betreiben
_lcd_e = 128
Config Lcd = 20 * 4 'Spalten und Zeilen festlegen
' Slaveadressen für Porterweiterung
Const Pcf8574_lcd = &H40 '&B01110000 Dez = 112
Initlcd
'--- Variable für Anzeigeauswahl ---
Dim Lcd_aktualisieren As Byte 'Zähler für LCD-Anzeigen
'Warte bis LCD bereit, falls gleichzeitig Spannung eingeschaltet wird
Waitms 250
'############################################
'##### ist Analog I²C IC ## hiermal in Dez ##
'Const Pcf8591 = 144 'von &H90 &B10010000 AdrPins ist 000
Const Pcf8591 = 158 'bis &H9E &B10011110 AdrPins ist 111
'Variablen für Analog IC
Dim Wadr As Byte
Dim Radr As Byte
Dim I2c_kanal As Byte , I2c_wert As Byte
Dim A0 As Byte
Dim A1 As Byte
Dim A2 As Byte
Dim A3 As Byte
'#############################################
'#### ist Expander I²C IC ## hiermal in Hex ##
Const Pcf8574 = &H7E '&B01111110 Dez = 126 AdrPins ist 111
Const Eingang_schreib_adresse = &B01111110
Const Eingang_lese_adresse = &B01111111
Dim Taste As Byte 'ist Daten Variable Eingang
Dim Alte_tasten As Byte 'ist Merker
' ist Beispiel
'noch ein Expander I²C IC
Const Ausgang_schreib_adresse = &B01111100 '&B01111100 Dez = 125 AdrPins ist 110
Const Ausgang_lese_adresse = &B01111101
Dim Led As Byte 'ist Daten Variable Ausgang(LEDs)
Dim Z As Byte 'Zähler für Testschleife
'#############################################
'##### ist DigPoti I²C IC ####################
Const Ds1803 = &B01011110 '&H9E Dez 158 AdrPins ist 111
'**** Variablen für IC-Poti ****
Dim Poti0 As Byte 'ist Daten Variable Poti0
Dim Poti1 As Byte 'ist Daten Variable Poti1
Dim Potix As Byte 'ist Daten Variable tandem Poti
Dim W0 As Single 'Echtwert
Dim W1 As Single 'Echtwert
'#############################################
'*********************************************************
'* ist eine Test-Sub für Data extern EEprom als Speicher *
'* am I²C Bus ein 24c64 angeschlossen zum speichern *
'* und lesen der Variablen *
'* alle Variablen werden als Strings konvertiert. *
'* somit unabhänig vom Daten-Typ. Auch lange Texte sind *
'* kein Problem mehr. *
'*********************************************************
'---- Eeprom Konstanten festlegen ----
'mehrer unterschiedliche I²C IC am Bus "anzuhängen" ist mit Dev_addr Select kein Problem.
Const Dev_addr_write = &B10100000 'EEPROM Schreibadresse (ST24C64)
Const Dev_addr_read = &B10100001 'EEPROM Leseadresse (ST24C64)
'hier Objekt Einstellungen
Const Stringanz = 6 'String Var Anzahl beginnt mit 0 somit 7 Var
Const Stringmax = 8 'für jedes String 8 Byte reserviert.
Const Speichervoll = 16000 'maximale Speichergröße in Byte (zB.ST24C64)
'############################################
'!!!!!!! Übergabe von Konstanden NICHT ändern !!!!!!!!!!
Const Byteschleife = Stringanz + 1 'bedingt durch String
Const Stringab = Stringmax + 1
Dim Aktschleife As Word
Aktschleife = Stringanz * Stringmax
Aktschleife = Aktschleife + 9 'ist Summe aller Byte + String Endzeichen
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Dim Mem_addr As Word 'Adress Zähler
Dim J As Byte 'Laufvariable für Byte Schleife
Dim Mem_addr_low_byte As Byte At Mem_addr Overlay 'da Eeprom > 8kByte aufteilen
Dim Mem_addr_high_byte As Byte At Mem_addr + 1 Overlay
Dim Aktionen As Word 'Schreib-Zähler
Dim Aktionenl As Word 'Lese-Zähler
Dim S As Byte 'Laufvariable für for-next Schleife schreiben
Dim Number_from_rs(byteschleife) As String * Stringab 'Array der Schreib-Variablen
Dim Four_byte_var_write As String * Stringmax
Dim Byte_var_write(stringmax) As Byte At Four_byte_var_write Overlay ' Elemente Arrayindex
Dim L As Word 'Zyklus fortschreiben lesen 'alle Single_Variablen auslesen
Dim Four_byte_var_read As String * Stringmax
Dim Byte_var_read(stringmax) As Byte At Four_byte_var_read Overlay ' Elemente, Arrayindex
'!!!!! ist nur für Test mit Taster also anpassen !!!!
Config Pinc.3 = Input 'Taster für EEprom schreiben
Portc.3 = 1 'Port auf H schalten
Taster_s Alias Pinc.3 'Taster ein Namen geben
Config Pinc.2 = Input 'Taster für EEprom lesen
Portc.2 = 1 'Port auf H schalten
Taster_l Alias Pinc.2 'Taster ein Namen geben
Config Portc.4 = Output
Eepvoll Alias Portc.4 'LED-Warnung für EEprom voll
'Gosub Lesen 'nach Reset erstmal lesen
'### hier werden die Variablen für Eeprom-Test festgelegt ##########
Dim Datum As String * Stringmax
Dim Zeit As String * Stringmax
Dim Var2 As String * Stringmax
Dim Var3 As String * Stringmax
Dim Var4 As String * Stringmax
Dim Var5 As String * Stringmax
Dim Var6 As String * Stringmax
'(
'+++ Beispiel1 für Single ++++++
Dim Temperatur1 As Single
Temperatur1 = 19.55 'sind 4Byte
Var2 = Str(temperatur1) 'Single als String übergeben
'+++++++++++++++++++++++++++++++
'+++ Beispiel2 für Single ++++++
Dim Temperatur2 As Single
Temperatur2 = -3.55 'sind 4Byte
Var3 = Str(temperatur2) 'Single als String übergeben
'+++++++++++++++++++++++++++++++
')
Lcd_aktualisieren = 255 'ist Startanzeige
Gosub Anzeigen
Wait 4 'nur für Test
Mem_addr = 0 'Sicher ist Sicher
'**** Hauptschleife ****
Do
Waitms 100 'Test Zeit für Terminal-Testanzeige
'Analog Ports lesen
Gosub Analog_dat 'Abfrage Controller AD(Lichtsensor)
Gosub Analog_dat_bus 'Abfrage I2C-Bus AD
'Beispiel: Poti Abfrage
' Gosub Poti_ic_test
'Beispiel: I²C-Bus alle Ports als Eingang
Gosub Eingang
'Beispiel: I²C-Bus alle Ports als Ausgang
' Gosub Ausgang
'Temperatursensoren lesen
Gosub Temperaturmessung 'Abfrage Controller 1wire Bus
'für Eeprom-Test einfach mal so eingefügt
Datum = "01.02.14"
Zeit = "15:10:00"
Var2 = Str(temp1) 'ist Beispiel Temperatursensor1
Var3 = Str(temp2) 'ist Beispiel Temperatursensor2
Var4 = Str(hell) 'ist Beispiel Helligkeit
Var5 = "fredred"
Var6 = "Test-OK"
'(
'für Test Speicher löschen
Datum = ""
Zeit = ""
Var2 = ""
Var3 = ""
Var4 = ""
Var5 = ""
Var6 = ""
')
'!!!alle Variablen für Test mit Hyperterminal anzeigen!!!
Print
Print "lese die Sensoren 1wire an Portb.0 Controller"
Print "Temp1 " ; Var2
Print "Temp2 " ; Var3
Print
Print "lese Lichtsensor von Getadc(7)"
Print "Hell " ; Var4
Print
Print "lese Port-Pins AD I2C "
Print "A0: " ; " Wert ist " ; A0
Print "A1: " ; " Wert ist " ; A1
Print "A2: " ; " Wert ist " ; A2
Print "A3: " ; " Wert ist " ; A3
Print
Print "lese alle 8 Portpin's Expander"
Print "Taste 1 = " ; Taste.0
Print "Taste 2 = " ; Taste.1
Print "Taste 3 = " ; Taste.2
Print "Taste 4 = " ; Taste.3
Print "Taste 5 = " ; Taste.4
Print "Taste 6 = " ; Taste.5
Print "Taste 7 = " ; Taste.6
Print "Taste 8 = " ; Taste.7
Print
'Print "lese DigPoti" 'wird in Sub durchgeführt da für Test eine Schleife eingebaut.
'Print "Volt-P0 = " ; W0
'Print "Volt-P1 = " ; W1
'Print
'!!! ausgewählte Daten in Eeprom schreiben oder lesen !!!
'Aktionen mit Taster in Echt durch Ereignis ersetzen zB. Timer
Debounce Taster_s , 0 , Schreiben , Sub 'Taster entprellen
Debounce Taster_l , 0 , Lesen , Sub
'(
'--- hier zum Daten schrieben --------
If Taster_s = 0 Then 'wenn Taste gedrückt schreiben
Waitms 100 'nur für Test
Gosub Schreiben
End If
'--- hier zum Daten lesen ------------
If Taster_l = 0 Then 'wenn Taste gedrückt lesen
Waitms 100 'nur für Test
Gosub Lesen
End If
')
Loop
'**** END Hauptsschleife ****
'### BEGINN in ext EEPROM schreiben (byte write method) ###
Schreiben:
Config Base = 0 'Zähler mit 0 beginnen ist wichtig für lesen
'--- für Test ---
Print "Byte der Var-Variablen schreiben " ; "Aktionen " ; Aktionen
Print
'----------------
Mem_addr = Aktionen * Aktschleife 'step Aktionen
'LED Anzeige wenn Eeprom gelesen werden sollte
If Mem_addr >= 113 Then Eepvoll = 1 '113 ist nur ein Beispiel kann auch [Speichervol- xxx] sein
For S = 0 To Stringanz 'for-next mit 0 beginnen da Base = 0
If S = 0 Then Number_from_rs(0) = Datum
If S = 1 Then Number_from_rs(1) = Zeit
If S = 2 Then Number_from_rs(2) = Var2
If S = 3 Then Number_from_rs(3) = Var3
If S = 4 Then Number_from_rs(4) = Var4
If S = 5 Then Number_from_rs(5) = Var5
If S = 6 Then Number_from_rs(6) = Var6
Four_byte_var_write = Number_from_rs(s) 'String Variable S schreiben
For J = 0 To Byteschleife 'Laufschleife schreiben
I2cstart
I2cwbyte Dev_addr_write 'Sendet ext. EEPROM Adresse zum Schreiben
I2cwbyte Mem_addr_high_byte 'Sendet Speicher-Schreibadresse
I2cwbyte Mem_addr_low_byte 'Sendet Speicher-Schreibadresse
I2cwbyte Byte_var_write(j) 'Sendet Datenbyte
I2cstop
Mem_addr = Mem_addr + 1 'Schreibadresse mit jedem Schleifendurchlauf erhöhen
Waitms 10 'Warten auf ext. EEPROM Rückmeldung
'--- nur für Test ---
Print "Var-Variable " ; S ; " = Adresse " ; Mem_addr ; " Bytewert " ; Byte_var_write(j)
'--------------------
Next J
'--- nur für Test ---
Print "!! Ausgabe !! " ; Four_byte_var_write
Print
'---------------------
Next S
'ist Speicher am Ende dann wieder von vorn
If Mem_addr = Speichervoll Then
'schreiben beginnt wieder ab Adr 0. Rest bleib erhalten.
Aktionen = 0
End If
Incr Aktionen 'nächsten Schreibzyklus anstoßen
Config Base = 1 'Wichtig: Schleifenzähler wieder auf 1 setzen
Return
'### ENDE ext EEPROM schreiben ###
'-----------------------------------------------------------
'### BEGINN aus ext.EEPROM lesen ###
Lesen:
'Zähler mit 0 beginnen da este Zelle 0 ist. Ansonsten wird lesen beendet wenn Inhalt leer.
'siehe Abfrage "wenn -NAN"
Config Base = 0
Mem_addr = 0 'da Variable auch für schreiben gesetz ist zum lesen zurück setzen.
Aktionenl = 0 'starte Lesung bei Adr 0
For Mem_addr = Aktionenl To Speichervoll 'ist max Byte für Eeprom
'--- nur für Test ---
'Print "Byte der 6 Var-Variablen lesen " ; "Zyklus " ; Aktionenl
'Print
'--------------------
For L = 0 To Stringanz
For J = 0 To Byteschleife 'Laufschleife lesen
I2cstart
I2cwbyte Dev_addr_write 'Sendet ext. EEPROM Adresse zum Schreiben
I2cwbyte Mem_addr_high_byte 'Sendet Speicher-Leseadresse
I2cwbyte Mem_addr_low_byte 'Sendet Speicher-Leseadresse
Waitms 10
I2cstart 'zweites Start ohne vorheriges Stop (siehe Datenblatt "random address read")
I2cwbyte Dev_addr_read 'Sendet ext. EEPROM Adresse zum Lesen
I2crbyte Byte_var_read(j) , Nack 'Liest Datenbyte
I2cstop
Mem_addr = Mem_addr + 1 'Leseadresse mit jedem Schleifendurchlauf erhöhen
'--- nur für Test ---
' Print "Var_Variable " ; L ; " = Byte " ; Mem_addr ; " Bytewert " ; Byte_var_read(j)
'--------------------
'wenn -NAN dann Auslesung beenden(soll nicht unbeschriebenen Speicher lesen)
If Four_byte_var_read = "" Or Byte_var_read(j) = 255 Then
Print Mem_addr ; " Byte gelesen "
Eepvoll = 0 'LED aus
Return
End If
Next J
'### BEGINN Terminal_log Ausgabe für Auswertungen in Excel ###
'### CSV Trenzeichen ist [;] ###
Print Four_byte_var_read ; ";" ;
'Daten wurden gelesen
Eepvoll = 0 'LED aus
'Nach Zwischenauslesung Speicherbereich fortsschreiben soll ja nicht
'immer die gleichen Zellen beschreiben("Lebensdauer")
If Mem_addr = Speichervoll Then
'schreiben beginnt wieder ab Adr 0. Rest bleib erhalten.
Aktionen = 0
End If
Next L
Print Chr(3) 'wird benötigt für CSV(End Off Text nach Zyklus)
Incr Aktionenl 'Lesezyklus hochzählen bis -Nan
Next Mem_addr
Config Base = 1 'Wichtig:Schleifenzähler wieder auf 1 setzen
Return
'#### ENDE ext.EEPROM lesen ####
'-----------------------------------------------------
I2c_test:
Dim Chipaddress As Byte
Dim Anzahl As Byte
'I²C Porterweiterung testen
'Alle Adresen suche und Anzeigen
'Step 2 soll nur IC Addresse aufrufen "hast dich gemeldet"
Print "I2C Scan start"
For Chipaddress = 0 To 254 Step 2 ' IC's am I²C-Bus erkennen
I2cstart 'send start
I2cwbyte Chipaddress 'sende Adresse auf Bus
If Err = 0 Then 'Chip gefunden
Incr Anzahl
'nur für Test
'Print "Hex-Adr " ; Hex(chipaddress)
'Waitms 500
'da Adressen bekannt in Anwendung in Klartext anzeigen
If Chipaddress = Pcf8574_lcd Then
Print "gefunden " ; "h " ; Hex(chipaddress) ; " b " ; Bin(chipaddress)
Print "ist ein PCF 8574P Adr 000 für LCD" 'LCD 4x20 am Bus
Print
End If
If Chipaddress = Dev_addr_write Then 'ist &B10100000 EEPROM Schreibadresse (ST24C64)
Print "gefunden " ; "h " ; Hex(chipaddress) ; " b " ; Bin(chipaddress)
Print "ist ein ST24C64 Adr 000"
Print
End If
If Chipaddress = Pcf8591 Then 'ist &B10011110 Analog Schreibadresse (PCF8591)
Print "gefunden " ; "h " ; Hex(chipaddress) ; " b " ; Bin(chipaddress)
Print "ist ein PCF 8591 Adr 111"
Print
End If
If Chipaddress = Pcf8574 Then
Print "gefunden " ; "h " ; Hex(chipaddress) ; " b " ; Bin(chipaddress)
Print "ist ein PCF8574AP Adr 111"
Print
End If
If Chipaddress = Ds1803 Then
Print "gefunden " ; "h " ; Hex(chipaddress) ; " b " ; Bin(chipaddress)
Print "ist ein DS1803 Adr 111"
Print
End If
'hier können noch weitere I²C IC Teilnehmer abgefragt werden.
'(
Print
If Chipaddress = xxx Then
Print "gefunden " ; "h " ; Hex(chipaddress) ; " b " ; Bin(chipaddress)
Print "ist ein ICxxx Adr xxx"
Print
End If
')
End If
'zählt Teilnehmer
Next
Print "am I2C " ; Anzahl ; " Bus-Teilnehmer gefunden "
Return
'-------------------------------------------------------------------------------
'############# nach Neustart Temperatursensor Test ###############
'wird dieser Test Erfolgreich beendet wird die "Messung" oben in den Variablen
'geschrieben [1wtemp_adresse_1(1)] ist der erste Sensor und
'und [1wtemp_adresse_2(1)] ist der zweite usw.
'Gibt die Seriennummer aller Sensoren des Bus aus.
'wenn Hardware-Fehler wird dieser angezeigt.
Sub Ds1820_alleseriennummern()
Local Crc As Byte
Local I As Integer
Local Anzahl As Integer
Dim Adresse(8) As Byte
Adresse(1) = 1wsearchfirst() 'prüft den ersten Teilnehmer am Bus
If Err = 0 Then 'Wenn err, dann gibt es keinen Sensor
'********************************************************
'* [DS18x20] DS18S20 ist ein 9 Bit Family Adr &H10 *
'* und DSB20 ein 12 Bit Family Adr &H28 *
'* somit große Unterschiede bei der "Empfindlichkeit" *
'* Das lesen der Bit's ist somit auch Unterschiedlich. *
'********************************************************
'!! meine Erfahrungen zeigen. an ein Pin-Port sollten !!
'!! immer die gleichen Family IC "hängen" !!
'ist nur für Info die Hex-Adresse ist "Name" mit dieser Kenntnis
'kannst Du mit [1wwrite &H55 und 1wwrite Sensor1_id("Name") , 8
'jeden einzeln ansprechen. Mach bei mehreren Sensoren Sinn.
Print
Print "Sensoren an Port B.0 prüfen"
Print "sind Hex-Adresse der DS18x20"
'ab hier prüfen
Do
Crc = Crc8(adresse(1) , 7)
If Crc <> Adresse(8) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!"
For I = 1 To 8
Print Hex(adresse(i)) ;
Print " ";
Next
Print
Adresse(1) = 1wsearchnext() 'nächste suchen
Loop Until Err = 1
End If
Anzahl = 1wirecount() 'Anzahl der Sensoren
Print "Anzahl der Sensoren am Bus: " ; Anzahl
If Anzahl = 0 Then Print "kein Sensor gefunden"
Print
Print "Test abgeschlossen"
Print "Hauptprogramm wird gestartet"
Print
Wait 5
End Sub
'----------------------------------------------
Temperaturmessung:
'bei allen Sensoren den Messvorgang starten
1wreset
1wwrite &HCC ' SKIP ROM, alle Sensoren ansprechen
1wwrite &H44 ' CONVERT T, Temperatur messen
'Zeit geben
Waitms 100
'===== erster Temp.-Sensor ist ein S Typ=====
1wreset
1wverify 1wtemp_adresse_1(1)
1wwrite &HBE ' Read Scratchpad, Temperatur auslesen
'Zeit geben
Waitms 100
Temp_bytes(1) = 1wread(8)
Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen
Tempdif = Tempdif * 50
Tempdif = Tempdif - 25.5
Tempdif1 = Temp_bytes(8) - Temp_bytes(7)
Tempdif1 = Tempdif1 * 100
Tempdif1 = Tempdif1 / Temp_bytes(8)
Tempdif = Tempdif + Tempdif1
Temp1 = Tempdif / 100
Var2 = Str(temp1)
Waitms 10
'(
'===== zweiter Temp.-Sensor wenn auch ein S Typ =====
' Anfrage senden
1wreset
1wverify 1wtemp_adresse_2(1)
1wwrite &HBE ' Read Scratchpad, Temperatur auslesen
'Zeit geben
Waitms 10
Temp_bytes(1) = 1wread(8)
Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen.
Tempdif = Tempdif * 50
Tempdif = Tempdif - 25.5
Tempdif1 = Temp_bytes(8) - Temp_bytes(7)
Tempdif1 = Tempdif1 * 100
Tempdif1 = Tempdif1 / Temp_bytes(8)
Tempdif = Tempdif + Tempdif1
Temp2 = Tempdif / 100
'Zeit zum Messen geben
Waitms 10
')
'===== erster Temp.-Sensor wenn es ein B Typ ist =====
' Anfrage senden
1wreset
1wverify 1wtemp_adresse_2(1)
1wwrite &HBE ' Read Scratchpad, Temperatur auslesen
'Zeit geben
Waitms 100
Temp_bytes(1) = 1wread(9)
Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen.
Tempdif = Tempdif / 8 'hier der Unterschied
Tempdif = Tempdif * 50
Tempdif = Tempdif - 25
Tempdif1 = Temp_bytes(8) - Temp_bytes(7)
Tempdif1 = Tempdif1 * 100
Tempdif1 = Tempdif1 / Temp_bytes(8)
Tempdif = Tempdif + Tempdif1
Temp2 = Tempdif / 100 'hier der Unterschied
Var3 = Str(temp2)
' Waitms 10
Lcd_aktualisieren = 253 'ist Startanzeige
Gosub Anzeigen
Return
'------------------------------------------------------
Analog_dat:
'Helligkeit lesen
'4 LEDs(5mm) parallel und 10n Kontensator Kathode an GND Anode an Pin
Hell = Getadc(7)
Gosub Anzeigen 'Sensor(LED) an Port-Pin A7
Return
'------------------------------------------------------
'I²C Analog IC = Pcf 8591 Adr-Pin alle H = 111
'Binär für besseres Verständnis. Kann auch in Hex oder Dez angegeben werden.
'oder I2c_Kanal als For-Next Schleife.
Analog_dat_bus:
Wadr = &B10011110 ' Schreibadresse für 8591
Radr = &B10011111 ' Leseadresse
I2c_kanal = &B00000001 'Port-Pin selektieren
Gosub Geti2cadc 'Wert holen
A0 = I2c_wert 'Wert in Variable schreiben
I2c_kanal = &B00000010
Gosub Geti2cadc
A1 = I2c_wert
I2c_kanal = &B00000011
Gosub Geti2cadc
A2 = I2c_wert
I2c_kanal = &B00000100
Gosub Geti2cadc
A3 = I2c_wert
'Sub in Sub spart einige RAM speicher
Geti2cadc: 'Werte abholen
I2cstart
I2cwbyte Wadr 'Schreibadresse senden
I2cwbyte I2c_kanal
I2cwbyte 0 ' Null auf D/A-Wandler
I2cstop
Waitms 10
I2cstart ' Start 'Leseadresse übermitteln
I2cwbyte Radr
I2crbyte I2c_wert , 9 'Wert lesen
I2cstop
Return
'------- End Analog Abfrage ----------------------
'******ist die Poti-Demo wird gestartet wenn Oben akteviert *********
' zum Kennenlernen wie die 2 Potis angesprochen werden.
'----SUB Bus IC-Poti Adr = b01011110 alle Adr Pins auf H
Poti_ic_test:
Lcd_aktualisieren = 254 'Anzeige Flag setzen
Print "erstes Poti hochregeln"
For Poti0 = 0 To 255 'Poti0 = Zähler. Später durch Ereignis ersetzen
I2cstart
I2cwbyte &B01011110 'control-byte
I2cwbyte &B10101001 'ist Poti0
I2cwbyte Poti0 'Byte-Wert schreiben
I2cstop 'Bus frei geben
'ab hier Umrechnung in Volt
W0 = 0.018 * Poti0 'abgleichen
Print "Volt-P0 = " ; W0
Gosub Anzeigen 'Anzeige Flag wird vor Start der Sub gesetzt
Next
Print "zweites Poti hochregeln"
For Poti1 = 0 To 255 'Poti1 = Zähler. Später durch Ereignis ersetzen
I2cstart
I2cwbyte &B01011110 'control-byte
'hier kommt der Unterschied
I2cwbyte &B10101010 'ist Poti1
I2cwbyte Poti1 'Byte-Wert schreiben
I2cstop
'ab hier Umrechnung in Volt
W1 = 0.018 * Poti1 'abgleichen
Print "Volt-P1 = " ; W1 'Nur Test
Gosub Anzeigen 'aktuallisieren
Next
'beide Potis gleichzeitig abregeln
Print "beide Potis gleichzeitig abregeln" 'Nur Test
For Potix = 255 To 0 Step -1 'Potix = Zähler. Später durch Ereignis ersetzen
I2cstart
I2cwbyte &B01011110 'control-byte
'hier kommt der Unterschied
I2cwbyte &B10101111 'Potix = Poti0 und Poti1= Tandempoti
I2cwbyte Potix 'zu schreibende Werte
I2cstop
W0 = 0.018 * Potix 'Nur Test
W1 = 0.018 * Potix
Print "Poti0 " ; W0 ;
Print " Poti1 " ; W1
Gosub Anzeigen 'aktuallisieren
Next
Return
'**********Ende Demo****************************
'---Beispiel alle Ports für IC2 als Eingänge ---------
Eingang:
I2cstart
I2cwbyte Eingang_schreib_adresse
I2cwbyte &B11111111 'alle Ports als Eingang. geschalten wird mit GND
I2cstop
I2cstart
I2cwbyte Eingang_lese_adresse
I2crbyte Taste , Nack 'Taste lesen
'Print Bin(taste) 'nur für Test
I2cstop
Waitms 100
Return
'---Beispiel alle Ports für IC2 als Ausgänge -------
Ausgang:
I2cstart
I2cwbyte Ausgang_schreib_adresse
'I2cwbyte &B00000000 'alle Ports als Ausgang gegen Vcc
I2cwbyte &B11111111
I2cstop
'nur für Test
Led.z = 0 'sind alle Portpins
For Z = 0 To 7
I2cstart
I2cwbyte Ausgang_schreib_adresse
I2cwbyte Led.z
Print "LED-An " ; Z ; " " ; Led.z
I2cwbyte Led.z
Print "LED-Aus " ; Z ; " " ; Led.z
Waitms 100 'warte 100 Millisekunden
Next
'alle LED's abschalten
I2cwbyte Ausgang_schreib_adresse
Led = 1
I2cwbyte Led
Print Led
Wait 1 'warte 1Sekunde
I2cstop
Return
'************ Bereich für LCD -Anzeigen *4x20 ********
Anzeigen:
'Cls 'wenn gewünscht lösche alten Inhalt
'****** Startfenster *******
If Lcd_aktualisieren = 255 Then
Print "Startanzeige"
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd " Hallo LCD ist OK "
Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte
Lcd " Hauptprogramm wird "
Locate 3 , 1 'Cursor auf 3 Zeile, 1 Spalte
Lcd " gestartet "
Locate 4 , 1 'Cursor auf 4 Zeile, 1 Spalte
Lcd " Bitte warten "
End If
'***************************
'hier zur LCD - Anzeige für Poti
If Lcd_aktualisieren = 254 Then
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd " Poti Anzeige "
Locate 2 , 2 'Cursor auf 2 Zeile, 2 Spalte
Lcd " *Werte in Volt* "
Locate 3 , 2 'Cursor auf 3 Zeile, 2 Spalte
Lcd " Poti0 = " ; W0 ; " "
Locate 4 , 2 'Cursor auf 4 Zeile, 2 Spalte
Lcd " Poti1 = " ; W1 ; " "
Waitms 500 'nur für Test
End If
'hier zur LCD - Anzeige für Temperatursensoren
If Lcd_aktualisieren = 253 Then
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd " Sensoren lesen "
Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte
Lcd " Licht " ; Hell ; " "
Locate 3 , 1 'Cursor auf 3 Zeile, 1 Spalte
Lcd " Temp1: " ; Var2 ; " ßC "
Locate 4 , 1 'Cursor auf 4 Zeile, 1 Spalte
Lcd " Temp2: " ; Var3 ; " ßC " 'Zeichen[ß] ist bei verwendeten LCD Gradsymbol
End If
'***************************
'hier weitere Anzeige Modi (zur Zeit 3 von 255 )
'If Lcd_aktualisieren = 252 Then 'und so weiter
'einfach eine Lcd_aktualisieren x hier rein kopieren und anpassen.
' End If
Return
Dann betrachte in aller Ruhe jeden einzeln Schritt. Wenn dich nun noch etwas unverständlich ist, dann beschreibe es so genau wie möglich und du wirst eine Lösung bekommen. Kann natürlich auch so eine ehrliche sein wie meine „So geht es nicht wenn die Zeit nicht als Raumzeit betrachtet wird“ oder natürlich auch so eine „mach aus dem Komma ein Punkt“.Verschweigen oder wissen meist selber nicht wann dies ersetzen „Sinn“ macht
Mit freundlichen Grüßen fredred