Erledigt Fernsteuerrung endweder per I2C oder IR ?

Thorsten_Sch

Mitglied
31. Okt. 2010
152
0
16
47
HH
Sprachen
  1. BascomAVR
Hallo forum Gemeinde
Ich habe einen hauptcontroller in einen Sicherung kasten in der garage, wenn ich aus der garage stehe sehe ich die schaltung nicht und das LCD nicht, ist es irgendwie möglich das man einen I2C Chip nimmt und so Programmiert das man es auf eine Handsteuerung sehen kann sowie eine ( fernbedinung )???? bitte um Ratschläge von euch......

Vielen Dank
Thorsten Sch.
 
Also wenn du die Schaltung nicht siehst fällt IR ja schon mal flach.
I2C oder SPI würde natürlich gehen, setzt aber voraus dass Hauptschaltung und Bedienteil elektrisch miteinander verbunden sind (3-4 Leitungen).
Sonst bleibt nur noch der Weg per Funk. Da gibt es einige fertige Module, ZigBee wäre ein Beispiel.
 
Ich hab ehrlich gesagt anfangs nicht wirklich verstanden, worums eigentlich geht...
Anscheinend soll von einer vorhandenen Schaltung (mit irgendeinem Controller) das Userinterface abgekoppelt werden. Ob, bzw mit welchem Aufwand das zu machen ist, hängt vom Controller, vom Display bzw dessen Anbindung an den Controller ab. Unter anderem.
Zu den möglichen Wegen hat Thomas ja das wesentliche gesagt:
Direktes Licht (auch IR) setzt 'ne direkte Sichtverbindung vorraus (Glasfaser mal beiseite),
bleiben die üblichen seriellen Verbindungen (SPI, TWI, UART), die ggf auch gefunkt werden können (ZigBee, Bluetooth, etc)
 
Hallo Thorsten Sch.

Warum kommt keine Antwort, ob es mit Kabelverbindung möglich währ. Die Wortwahl „Handsteuerung“ verwirt mich.
Somit kann es doch nur mit einer Funkbrücke realisiert werden oder?
Wir könnten mit Sicherheit helfen wenn wir mehr Informationen bekommen würden.
Helfe ob Hartware oder Programmierung für Funkbrücken, I²C usw. Aber nur mit „bitte um Ratschläge von euch“ reicht es nicht.

Mit freundlichen Grüßen
Fred
 
Hallo Zusammen endschuldige ich arbeite in schicht arbeit soory...

ich würde es per I2C-BUS machen dazu würde ich die leitung nachaussen verlegen in eine feuchtraumdose und da die handgehäuse mit tastern und LCD und sowie led die den status anzeigen!
das währ ja mein vohrschlag......

Gruß Thorsten Sch.
 
Hallo Thorsten,

mit I2C-BUS Hart-Software(BASCOM) habe ich viel Erfahrungen. Es gibt viele Preisgünstige IC’s und hat man mal ein BUS- System zum laufen sind Erweiterungen kaum Grenzen gesetzt, wenn nicht alle µs eine Auswertung getroffen werden muss.
Nun kommen die ersten Fragen:
1. Leitungslänge zur Nebenstelle(Leitungslänge sollte ohne zusätzlichen IC nicht größer als 10 Meter sein)
2. soll Nebenstelle die Spannungsversorgung von Hauptstelle bekommen(dann 4 Adern nötig VCC,GND,SDA und SCL)
3. Was für ein MC ist vorhanden. Sind die HW-Pins SDA und SCL noch frei.
4. Wen alles passt und bekomme nach Anfrage für Software noch Antworten, kannst du dann MC neu programmieren?
Eine große Hilfe währ es du sendest vorab, den aktuellen Code. Kann auch eine PN sein.
Als Ruheständler habe ich genug Zeit, dein Vorhaben zum Erfolg zu führen.

Mit freundlichen Grüßen
Fred
 
Hallo Fred
1. Die länge würde ca. 5Meter sein.
2. Die spannung wurde von hauptcontroller bekommen.
3. ich benutze einen ATmega8 würde auch auf einen ATmega168 Gehen und I2C-Bus ist frei weil da schon ein I2C-LCD Dran Hängt.
4. Ja
so dann will ich mal den Code senden hier

CodeBox BascomAVR
$lib "Lcd_i2c.lib"  'ersetzt die Standard LCD Library
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32

Const Pcf8574_lcd = &H70  'I2C Adresse &H40
Config I2cdelay = 15  'delay von 5=20µs=50kHz,10=10µs=100kHz;5=5µs=200KHz
Config Scl = Portc.5  'I2C SCL Pin
Config Sda = Portc.4  'I2C SDA Pin
Dim _lcd_e As Byte
_lcd_e = 64

I2cinit
'Mini Zeichen symbole
Deflcdchar 0 , 32 , 32 , 32 , 4 , 12 , 4 , 4 , 4  '1
Deflcdchar 1 , 32 , 32 , 32 , 14 , 2 , 14 , 8 , 14  '2
Deflcdchar 2 , 32 , 32 , 32 , 14 , 2 , 14 , 2 , 14  '3
Deflcdchar 3 , 32 , 32 , 32 , 8 , 8 , 14 , 4 , 4  '4
Deflcdchar 4 , 32 , 32 , 32 , 32 , 4 , 14 , 4 , 32  '+
Deflcdchar 5 , 32 , 32 , 32 , 32 , 32 , 12 , 32 , 32  '-

Cls
Locate 1 , 1
Lcd "KLINGEL-MELDER"
Locate 2 , 1
Lcd "V3/Sch.2015"
Waitms 800
'---Ausgänge---
'------------------------
Config Portd.6 = Output  'PD6 - Realis_1 - Katzen
Realis_1 Alias Portd.6
'------------------------
Config Portd.5 = Output  'PD5 - Realis_2 - Prtivat
Realis_2 Alias Portd.5
'------------------------
Config Portd.4 = Output  'PD4 - Realis_3 - Hauptleitung Aus
Realis_3 Alias Portd.4
'------------------------
Config Portd.3 = Output  'PD3 - Realis_4 - Licht
Realis_4 Alias Portd.3
'------------------------
Config Portd.2 = Output  'PD2 - Realis_5
Realis_5 Alias Portd.2
'------------------------
Config Portc.0 = Output  'PC2 - LED Realis 1-4
Led_realis Alias Portc.0
'------------------------
Config Portc.1 = Output  'PC1 - LED Taster ( TEST )
Led_taster Alias Portc.1
'------------------------
Config Portc.2 = Output  'PC2 - LED Eingang1
Led_eing1 Alias Portc.2
'------------------------
Config Portc.3 = Output  'PC3 - LED Eingang2
Led_eing2 Alias Portc.3
'------------------------
'Config Portd.1 = Output  'PD1 - Leer_01
'Leer_01 Alias Portd.1
'--------Ausgänge--------
'--------Eingänge--------
Config Portb.0 = Input  'PD0 - Ein_1
Portb.0 = 0
Input_1 Alias Pinb.0
Config Portb.1 = Input  'PD1 - Ein_2
Portb.1 = 0
Input_2 Alias Pinb.1
Config Portb.2 = Input  'PD2 - Ein_3
Portb.2 = 0
Input_3 Alias Pinb.2
Config Portb.3 = Input  'PD3 - Ein_4
Portb.3 = 0
Input_4 Alias Pinb.3
Config Portd.1 = Input  'PB1 - Taster ( TEST )
Portd.1 = 1
Taster_test Alias Pind.1
'-------Eingänge--------
Declare Sub Klingel_pk  'Klingel ( P ) und ( K )
Declare Sub Klingel_p
'Declare Sub Klingel_3  'Klingel ( P )
Declare Sub Klingel_4  'Wartung programm
Declare Sub Ausgang_test
Dim I As Long  'TIMER LICHT ( REALIS ) EINGANG
Dim A As Byte
Dim B As Byte
A = &B10000000  'PCF8574 PORT7 AUS
B = &B00000000  'PCF8574 PORT7 AN
I2csend &H70 , A  'I2C - LCD Hintergrund AUS

Do
If Input_1 = 1 Then Gosub Klingel_p  'KLINGEL-PRIVAT & KATZEN 0kleber
If Input_2 = 1 Then Gosub Klingel_pk  'KLINGEL-PRIVAT
'Debounce Input_3 , 1 , Klingel_3 , Sub  'Wartung an der anlage
Debounce Input_4 , 1 , Klingel_4 , Sub
If Taster_test = 1 Then Gosub Ausgang_test
'------------------------------------------------------------------------
If I = 0 Then  'Timer LICHT
  Realis_1 = 0
  Waitms 1
Else
  Decr I
End If
Loop
'-----------------------------------------------------------------------
Sub Klingel_pk
I2csend &H70 , B
E = 6000000
Realis_1 = 1  'TIMER LICHT EINGANG
I = 9000000  'TIMER LICHT EINGANG
Led_eing2 = 1
Led_realis = 1  '
Cls
Locate 1 , 1
Lcd "KLINGEL-MELDER"
Locate 2 , 1
Lcd "( P ) & ( K )"
Realis_3 = 1
Waitms 400
Realis_3 = 0 : Realis_4 = 1
Waitms 400
Realis_4 = 0
Waitms 200
Realis_4 = 1 : Realis_3 = 1
Waitms 300
Realis_3 = 0
Waitms 300
Realis_4 = 0
Cls
Locate 1 , 1
Lcd "KLINGEL-MELDER"
Locate 2 , 1
Lcd "B E R E I T"
Waitms 700
Led_eing2 = 0
Led_realis = 0
I2csend &H70 , A
End Sub
'-----------------------------------------------------------
Sub Klingel_p
I2csend &H70 , B  'TIMER LICHT EINGANG
Led_eing1 = 1
Led_realis = 1
Cls
Locate 1 , 1
Lcd "KLINGEL-MELDER"
Locate 2 , 1
Lcd "( P ) & ( - )"
Realis_3 = 1
Waitms 400  'Voher 500
Realis_3 = 0
Waitms 200
Cls
Locate 1 , 1
Lcd "KLINGEL-MELDER"
Locate 2 , 1
Lcd "B E R E I T"
Waitms 700
Led_eing1 = 0
Led_realis = 0
I2csend &H70 , A
End Sub
'----------------------------------------------------------
'Klingel_3:
'---------------------------------------------------------
Klingel_4:
I2csend &H70 , B
  Toggle Realis_2
  Toggle Realis_5
  If Realis_2 = 1 Then
  Cls
  Locate 1 , 1
  Lcd "SERVICE - A N"
  Led_realis = 1
  Else
  Cls
  Locate 2 , 1
  Lcd "SERVICE - AUS"
  Wait 2
  Cls
  Locate 1 , 1
  Lcd "KLINGEL-MELDER"
  Locate 2 , 1
  Lcd "B E R E I T"
  I2csend &H70 , A
  Led_realis = 0
Waitms 2
End If
Return
'--------------------------------------------------------
Sub Ausgang_test
I2csend &H70 , B
Led_taster = 1
Locate 1 , 1
Lcd "Realis - 2 AUS"
Realis_2 = 1
Wait 2
Cls
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "Realis&LED"
Led_realis = 1
Wait 2
Cls
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "REALIS1__ON"
Realis_1 = 1
Wait 2
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "REALIS1_AUS"
Realis_1 = 0
Wait 2
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "REALIS2__ON"
Realis_2 = 1
'Wait 2
'Locate 1 , 1
'Lcd "Funktion TEST"
'Locate 2 , 1
'Lcd "REALIS2_AUS"
'Realis_2 = 0
'Wait 2
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "REALIS3__ON"
Realis_3 = 1
Wait 2
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "REALIS3_AUS"
Realis_3 = 0
Wait 2
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "REALIS4__ON"
Realis_4 = 1
Wait 2
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "REALIS4_AUS"
Realis_4 = 0
Wait 2
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "REALIS5__ON"
Realis_5 = 1
Wait 2
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "REALIS5_AUS"
Realis_5 = 0 : Led_realis = 0
Wait 2
Cls
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "LICHT AUSSEN"
Wait 2
Cls
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "Licht - _AN"
Realis_1 = 1
Wait 2
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "Licht - AUS"
Realis_1 = 0
Wait 2
Cls
Locate 1 , 1
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "LED EIN1&2"
Wait 2
Locate 1 , 2
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "EIN1 = _ON"
Led_eing1 = 1
Wait 2
Locate 1 , 2
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "EIN1 = AUS"
Led_eing1 = 0
Locate 1 , 2
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "EIN2 = _ON"
Led_eing2 = 1
Wait 2
Locate 1 , 2
Lcd "Funktion TEST"
Locate 2 , 1
Lcd "EIN2 = AUS"
Led_eing2 = 0
Wait 2
Cls
Locate 1 , 1
Lcd "FERTIG GETESTET"
Locate 2 , 1
Lcd "Alles aus"
Led_taster = 0
Realis_2 = 0
Wait 2
I2csend &H70 , A
End Sub

Return
End


Verleicht sieht der code wir aus aber es funktionert so wie ich es denke grins.....

Viele Grüße Thorsten Sch.
 
Hier Die Platine dazu
Schaltung in Hutschienen Gehäuse.PNG IMG_20150910_122020~1.jpg IMG_20150910_122009~1.jpg
 
Hallo Thorsten,

Wo liegt dein Problem? Hast doch I2C sogar für LCD, nun kannst du doch viele neue „Teilnehmer“ am BUS anhängen. Z.B noch 7
PCF8574 IC’s musst nur Hard und Software eine andere Adresse geben.
Vor langer Zeit habe ich ein Einsteiger im BUS- System helfen können. Siehe Anhang.
Habe deinen Code flüchtig gelesen, ist schon etwas eigenwillig. Finde keine Busfreigabe. Ist aber das A&O wenn mehrere Teilnehmer angesprochen werden sollen.
Wenn noch Fragen einfach melden.

Mit freundlichen Grüßen
Fred
 

Anhänge

  • LCD mit I2C ansteuern.jpg
    LCD mit I2C ansteuern.jpg
    77,6 KB · Aufrufe: 12
  • IC2-Adress-Hilfe.zip
    5,6 KB · Aufrufe: 8
Hallo Fred was ich noch nicht so recht verstanden habe ist einen taster an den PCF8574 Anschliesen und einen Port
Von Atmega zu schalten oder auch an und aus? das mit den Nack im befehl will bei mir nicht so recht klick machen ne hilfe stellung
währ nicht schlecht.....

Wünsche noch einen Schönen Samstag der Deutschen Einheit
Thorsten Sch.
 
Hallo,
nun noch ein großer Demo- Code. Dort findest du bestimmt einen passenden Bereich. Oder benötigst du eine Hardwarebeschreibung?


CodeBox BascomAVR
$regfile "m32def.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 64
$baud = 19200

'gibt den Erstellungszeitpunkt im europäischen Format DD-MM-YY hh:nn:ss
'und die Code-Version auf Hyperterminal aus.
Print
Print "erstallt am  : " ; Version(1)
Print "Version Code : " ; Version(3)
Print
Waitms 100
$lib "i2c_TWI.lib"  'Hardware I²C einbinden
Config Twi = 100000  ' Takt 100kHz
'+++ 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 DS 18S20 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 zwei Nachkommastellen
Config Single = Scientific , Digits = 2  '2 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
' Slaveadressen für Porterweiterung
Const Pcf8574_lcd = &H70  '&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
Lcd_aktualisieren = 255  'ist Startanzeige
'############################################

'##### 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 Beispielnoch 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
'+++++++++++++++++++++++++++++++
')
Mem_addr = 0  ' Sicher ist Sicher
'**** Hauptschleife ****
Do
 Waitms 500  '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
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
'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
 '--- 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 = 1 Then Number_from_rs(1) = Datum
  If S = 2 Then Number_from_rs(2) = Zeit
  If S = 3 Then Number_from_rs(3) = Var2
  If S = 4 Then Number_from_rs(4) = Var3
  If S = 5 Then Number_from_rs(5) = Var4
  If S = 6 Then Number_from_rs(6) = Var5
  If S = 7 Then Number_from_rs(7) = 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  'Schleifenzähler wieder auf 1 setzen
Return
'### ENDE ext EEPROM schreiben ###

'-----------------------------------------------------------
'### BEGINN aus ext.EEPROM lesen  ###
Lesen:
 'Config Base = 0  'Zähler mit 0 beginnen
  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  '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  'zählt Teilnehmer
  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 = Pcf8574_lcd Then
  Print "gefunden  " ; "h  " ; Hex(chipaddress) ; "  b " ; Bin(chipaddress)
  Print "ist ein PCF 8574 Adr 000"  'LCD 4x20 am Bus
  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 PCF8574 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
 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 DS^18B20 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. Macht 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
 Return
'------------------------------------------------------
Analog_dat:
'Helligkeit lesen
'4 LEDs(5mm) parallel und 10n Kontensator Kathode an GND Anode an Pin
  Hell = Getadc(7)  '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üt 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
 Wait 1  'Zeit nur für Testanzeige
 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
 Wait 1  'Zeit nur für Testanzeige
'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
  Wait 1  'Zeit nur für Testanzeige
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
  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 ; "  "
End If

'hier zur LCD - Anzeige für Temperatursensoren
If Lcd_aktualisieren = 253 Then
  Locate 1 , 1  'Cursor auf 1 Zeile, 1 Spalte
  Lcd "  Temperatur wird  "
  Locate 2 , 1  'Cursor auf 2 Zeile, 1 Spalte
  Lcd "___  " ; "gelesen" ; "  ___ "
  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

Gruß
Fred
 
Oha hallo Fred geht es auch bischen kleiner dieser code beispiel 3 taster 3 ausgänge + I2C-LCD, da komm ich noch nicht so recht mit soory irgendiw kleiner plus hardware beschreibung
 
Der PCF8574 ist erstmal ein serielles Schieberegister, Du kannst also salopp gesagt ein Byte in den Chip (vereinfacht gesagt auf die 8 Ausgangsbeine) hineinschreiben, oder den tatsächlichen Wert dieser Beine herauslesen lassen. Das ganze halt über den I²C.

Die einzelnen Beine des PCF... sind dabei sowas ähnliches wie ein, als Eingang mit aktiviertem Pullup konfiguriertes AVR-Bein zu verstehen.
Jedes P7..P0 des PCF habe je 'ne interne Push-Pull Stufe, die beim beschreiben des PCF angesteuert wird. Die beine werden dann vom PCF her entweder auf Gnd gelegt, oder über eine 100µA-Stromquelle auf Vcc (ähnlich einem Pullup). Ist das Bein extern "offen", geht es über die Quelle auf high, wird es (stärker als mit 100µA) gegen Gnd belastet, geht es auf low.
Liest Du aus dem PCF, wird der tatsächliche Zustand der P7..P0 ausgelesen.
Klemmst Du also an die P's Taster gegen Gnd, und schreibst Highs in den PCF, werden die entsprechenden Vcc-Stromquellen auf die P's aufgeschaltet.Beim auslesen des PCF werden die Highs zurückgelesen, es sei denn. der Taster gegen Gnd ist geschlossen. Ist der Taster stärker als die 100µA, wird eben 'n low gelesen...

Mit NACK (No Acknowledge) signalisiert der Reciever nach einem komplett übertragenem Byte, daß keine weiteren Bytes mehr empfangen werden. Mit ACK (Acknowledge) signalisiert er nach einem komplett übertragenem Byte, daß er weitere Bytes empfangen würde. Technisch gesehen zieht der Transmitter bei den 8 zu sendenden (transmit) Bits eines Bytes bei 'ner "0" SDA auf Gnd, bei 'ner "1" zieht der externe Pullup SDA auf Vcc. Im 9ten "Bit" läßt der Transmitter SDA frei, und horcht, ob der Reciever SDA seinerseits auf Gnd zieht (ACK), oder es auch freiläßt (NACK).
 
Hallo LotadaC,
dein Profibeschreibung, nehme ich an, wird wohl Thorsten nicht weiter zum Ziel führen.
Mit $lib "i2c_TWI.lib" muss er sich in seinem Projekt nicht mit Nack/Ack Signale das leben schwer machen.
Darum „kümmert“ sich ja die Lib in Bascom.
So Thomas nun benötigst du zwei Expander IC’s einen für LCD und einen für Taster-Eingabe und LED-Anzeige.
Werte in den nächsten Tagen ein Projekt erstellen.
Bitte entschuldige wenn es etwas länger dauert. Muss ja erst mal Hartware aufbauen und Software nach Wunsch erstellen und testen.
P.S wenn ich einen Lösungsvorschlag einstelle, muss dieser erst mal in meiner Werkstatt funktioniere. Probleme gibt es für Anwender immer(wie Software hat Fehler oder Hardware ist nicht realisierbar usw.
Mit freundlichen Grüßen
Fred
 
Hallo Fred ich werde meine augen auf endfang stellen, bin gespannt was so kommt....
und äh ich heise nicht
sonder Thorsten aber macht nicht alles ok kann passieren grins.
so dann schönes wochende bis die tage...

Gruß Thorsten Sch.
 
dein Profibeschreibung, nehme ich an, wird wohl Thorsten nicht weiter zum Ziel führen.
Mit $lib "i2c_TWI.lib" muss er sich in seinem Projekt nicht mit Nack/Ack Signale das leben schwer machen.
Darum „kümmert“ sich ja die Lib in Bascom.
Du benutzt doch selbst in Deinem ellenlangen Code den NACK-Parameter bei "i2crbyte" (Zeile 312, Zeile 608).
Ich habe diesbezüglich eigentlich nur geschrieben, daß der Reciever (readbyte) damit signalisiert, ob er weitere Bytes empfangen will, oder ob nach dem Byte Schluss sein soll.
Mit NACK (No Acknowledge) signalisiert der Reciever nach einem komplett übertragenem Byte, daß keine weiteren Bytes mehr empfangen werden. Mit ACK (Acknowledge) signalisiert er nach einem komplett übertragenem Byte, daß er weitere Bytes empfangen würde. Technisch gesehen zieht der Transmitter bei den 8 zu sendenden (transmit) Bits eines Bytes bei 'ner "0" SDA auf Gnd, bei 'ner "1" zieht der externe Pullup SDA auf Vcc. Im 9ten "Bit" läßt der Transmitter SDA frei, und horcht, ob der Reciever SDA seinerseits auf Gnd zieht (ACK), oder es auch freiläßt (NACK).
Dasselbe läßt sich übrigens der Bascom-Hilfe bei i2crbyte entnehmen.
Ich meinte damit, folgendes zu beantworten:
...das mit den Nack im befehl will bei mir nicht so recht klick machen...

Meine ersten beiden Absätze bezogen sich auf:
was ich noch nicht so recht verstanden habe ist einen taster an den PCF8574 Anschliesen und einen Port
Von Atmega zu schalten oder auch an und aus?
wobei mir die eigentliche Frage da nicht ganz klar geworden ist (Ist eine derartige Vergewaltigung der deutschen Sprache eigentlich strafbar??). Deswegen hatte ich verdeutlichen wollen, daß beim beschreiben des PCF dessen Ausgänge zwischen der schwachen Stromquelle und Gnd geschaltet werden können, beim lesen die tatsächlichen logischen Pegel an den Beinen gelesen werden, womit er eigentlich seine Fragen selbst beantworten können müßte.

Willst Du jetzt versuchen, ihm mit irgendwelchen Hinweisen das Verständnis/Wissen für den ganzen Kram zu vermitteln, oder willst Du das komplett für ihn programmieren, Fred?
 
Zuletzt bearbeitet:
Hallo LotadaC,

Deine Frage: (Ist eine derartige Vergewaltigung der deutschen Sprache eigentlich strafbar??)
Meine Antwort: Wenn ja, könnte ich nicht „irgendwelchen Hinweisen das Verständnis/Wissen für den ganzen Kram zu vermitteln“, würde ja lebenslang im Zuchthaus sitzen.
Den „ellenlangen“ Code ist ein in der Praxis getesteter. Wusste bis dato nicht was benötigt wird. Sind ja viele Sub’s als Anregungen enthalten.
Ich werde nicht mehr „versuchen“ mein „Kram“ zum Thema ins Forum zu stellen.
Thorsten, Thorsten kann sich per PN melden, wenn er unerwartet, im Forum nicht zum Erfolg kommen sollte.
Somit hat sich deine letzte Frage auch erledigt.

Mit freundlichen Grüßen
Fred
P.S schmolle nicht. Respektiere nur deine Hinweise.
 
Deine Frage: (Ist eine derartige Vergewaltigung der deutschen Sprache eigentlich strafbar??)
Meine Antwort: Wenn ja, könnte ich nicht „irgendwelchen Hinweisen das Verständnis/Wissen für den ganzen Kram zu vermitteln“, würde ja lebenslang im Zuchthaus sitzen.

off-topic:
Hallo @fredred, ich denke es hat sich auf Thorsten_Sch bezogen. Hier hatte LotadaC etwas nicht ganz verstanden, das lag an der Ausdrucksweise von Thorsten (siehe oberhalb letztes Zitat). Anscheinend hat Thorsten Schwierigkeiten das eine oder andere richtig auszudrücken, zumindest gibt er hier einen Hinweis in seinem Fuß.

P.S. Willkommen im Forum :)

Dirk :ciao:
 
Hallo an alle die hier immer und alles rumnörgeln müssen ich habe es in meiner leiste stehen, mir egal was andere meinen es geht ja nicht um
die schreibweise hier oder? fredfred hilft mir und nicht wie andere hier nörgeln okay......

Vielen dank fredfred für deine hilfe......

Schönen Sonntag....
 
Hallo Dirk,

Danke für Nachricht.
Na klar ist die Frage und die Antworten von Thorsten schon unverständlich. Somit auch meine Hinweise und Anfragen zum Thema. Wichtig ist dann nachzufragen, was für Hilfe er wirklich benötigt, um zu helfen. Davon „lebt“ ein Forum aber nicht die Rhetorik oder Rechtschreibung in den Vordergrund zu stellen. Ist doch nur wichtig zu wissen, wo genau, Hilfe benötigt wird. Als Helfer kennt man ja im Ansatz nie dessen Level.

Mit freundlichen Grüßen#
Fred
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)