Erledigt Fernsteuerrung endweder per I2C oder IR ?

Hi Tschoeatsch,

Jetzt hab' ich mal eine Frage, in diesem Beitrag http://www.makerconnect.de/index.php?threads/proplem-mit-pcf8574-port-in-bascom-ansteuern.3275/ ist im letzten code-Block, letzter Beitrag, 2x ein 'reset...' von verschiedenen Datenbits und 1x soll der Ausgang dabei 1 werden im anderen Fall 0. Ist das jetzt auch ein Schreibfehler, oder hab' ich mal wieder nix gerallert?

du meinst wohl das folgende ...

Als Beispiel noch ein kleiner Programmschnipsel ...
Code:
DIM PCF8574_Lesedaten AS BYTE
DIM PCF8574_Sendedaten AS BYTE
PCF8574_Sendedaten = &B1101_0111   ' Alle Pins auf High die Eingaenge sein sollen
' P0-P2 ist Eingang (Taster)
' P3    ist Ausgang (Relais ueber Transistor)
' P4    ist Eingang (Taster)
' P5    ist Ausgang (LED nach Vcc)
' P6-P7 ist Eingang (Taster)


RESET PCF8574_Sendedaten.5         ' Pin5 des PCF8574 auf 0 (GND) setzen (zB LED5 anschalten) <=====
RESET PCF8574_Sendedaten.3         ' Pin3 des PCF8574 auf 1 (Vcc) setzen (zB Relais1 anschalten) <=====
I2cstart                           ' Startsignal auf dem I2C-Bus senden. Anfang vom Transfer
I2cwbyte PCF8574_Schreibadresse    ' Mit der Schreibadresse dem IC sagen das
                                   ' das nächste Byte ausgegeben werden soll
I2cwbyte PCF8574_Sendedaten        ' Nun das Byte senden was ausgegeben werden soll
I2cstop                            ' Stopsignal auf dem I2C-Bus senden. Transfer ist zu Ende


I2cstart                           ' Startsignal auf dem I2C-Bus senden. Anfang vom Transfer
I2cwbyte PCF8574_Leseadresse       ' Mit der Leseadresse dem IC sagen das
                                   ' das er nun mit Daten senden dran ist
I2crbyte PCF8574_Lesedaten , Nack  ' Ein Byte aus dem Eingaberegister (von den IO-Pins) lesen
I2cstop                            ' Stopsignal auf dem I2C-Bus senden. Transfer ist zu Ende
' In der Variable PCF8574_Lesedaten findet man nun in den entsprechenden
' Bits die Zustände der IO-Pins vom PCF8574
Diese beiden RESET-Zeilen die ich jetzt mit dem <=== markiert habe.

Durch "RESET PCF8574_Sendedaten.5" setze ich nur das Bit 5 in der Bytevariable "Sendedaten" zurück (also auf 0)
Es sind also zwei Bitmanipulationen die in dem Byte die Bits 3+5 auf 0 setzen. Alle anderen Bits im Byte bleiben unberührt.

Aber stimmt :eek: ... Laut dem Kommentar sollte das Bit 3 auf 1 gesetzt werden.
Es sollte da also SET und nicht RESET heißen :D Muß ich mal ändern ...

Gruß
Dino
 
Hi Thorsten, ich weiß jetzt nicht, was dein gerade gepostetes Programm zeigen soll. Bleiben wir mal bei deinem zuletzt beschriebenen Problem, deine Leds leuchten, obwohl sie nicht sollten, war doch so? Mir ist bei diesem Programm aufgefallen, dass du i2cstart, i2cwbyte.., i2cstop, was ja zusammen gehört, mit einem i2csend mittendrin störst, was ja selbst ein i2cstart, i2cwbyte und i2cstop beinhaltet. Schau mal in der bascom-Hilfe unter i2csend. Geh mal dein Programm durch und achte auf i2csend-Anweisungen. Wenn die vor einem i2cstop platziert ist, passt das nicht. Verschieb das i2csend nach dem i2cstop.
 
Hallo Tschoeatsch,

hatte ich schon nachgefragt „was soll I2csend &H70 , A an dieser Stelle bewirken“. Ist doch ein Statment in Bascom und sollte wie du es richtig schreibst NIE dort stehen.

So wie es Thorsten immer vermittelt hat, ist IC mit &H70 für LCD gedacht und &H74 für LED.
Befehl I2csend z.B. in einer Sub ist [Schreibadresse, Portadresse]
Wenn schon I2csend dann sollte es doch so aussehen. I2csend &H74,&B11111111 nun sind alle Ausgänge auf H und LED’s aus.

Nun werde ich langsam mühte Thorsten zu helfen. Seine letzte Antwort zeigt, er übernimmt ein Code vom Fachbuch, ist ja okay. Will aber nicht begreifen, dass diese Lernbeispiele sind und für sein eigenes Projekt angepasst werden müssen.
Na klar führen viele Wege nach Rom und jeder Programmierer hat eine eigene „Handschrift“ aber die Grundlagen sollten man schon wissen.

Mit freundlichen Grüßen
Fred
 
Hallo,

Noch ein kleiner Nachtrag für Thorsten.
In Bascom gibt es, historisch gewachsen, noch kleine Makel die zu beachten sind.
Bei der Schreibweise ist es so das die "Schreibadresse" oder "Leseadresse" Dezimal oder Hexadezimal angegeben werden kann und die "Portadresse" kann in Dezimal, Hexadezimal oder auch Binär angegeben werden
Gruß
 
Hallo Forum und Bastler hier mein fertiger code mit den PCF8574_Taster sowie LED:


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



'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

Const Pcf8574_lcd = &H70  '&H70 - LCD 2x16
Const Pcf8574_taster_schreibadresse = &B01110010  '&H72 - Taster ( Out )
Const Pcf8574_taster_leseadresse = &B01110011  '&H73 - Taster ( In )
Const Pcf8574_led_schreibadresse = &B01110100  '&H74 - LED ( Out )
Const Pcf8574_led_leseadresse = &B01110101  '&H75 - LED ( In )

I2cinit

Cls
Locate 1 , 1
Lcd "KLINGEL-MELDER"
Locate 2 , 1
Lcd "V3/Sch.2015"
Wait 2

'---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 Taster As Byte
Dim Led As Byte
Dim I As Long  'TIMER LICHT ( REALIS ) EINGANG
Dim E As Long
'PCF8574_P.7_LCD - Hintergrund
Dim A As Byte
Dim B As Byte
A = &B10000000  'PCF8574 PORT.7 AUS
B = &B00000000

Dim Led0 As Bit
Dim Led1 As Bit
Dim Led2 As Bit
Dim Led3 As Bit

I2csend &H70 , A  'PCF8574 PORT.7 AN

Do
Gosub Ausgang_led
Gosub Programm_1
'-----I2C-TASTER------
If Taster.0 = 0 Then Gosub Klingel_p
If Taster.1 = 0 Then Gosub Klingel_pk
If Taster.2 = 0 Then Gosub Klingel_4
If Taster.3 = 0 Then Gosub Ausgang_test
'-----I2C-TASTER------
'-----ATMega-TASTER---
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  'Keine Funktion
Debounce Input_4 , 1 , Klingel_4 , Sub  'Wartung an der Anlage
If Taster_test = 0 Then Gosub Ausgang_test  'Ausgang TEST
'-----ATmega-TASTER---
If I = 0 Then  'Timer LICHT
  Realis_1 = 0
  Waitms 1
Else
  Decr I
End If
Loop

'---I2C-Taster-Programm---
Programm_1:
I2cstart
I2cwbyte Pcf8574_taster_leseadresse
I2crbyte Taster , Nack
I2cstop
Return
'---I2C-Programm-Taster---

Sub Klingel_pk
Led1 = 1 : Led0 = 1
Gosub Ausgang_led
Waitms 10
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"
Wait 1
Led_eing2 = 0
Led_realis = 0
Led0 = 0 : Led1 = 0
Gosub Ausgang_led
Waitms 10
I2csend &H70 , A  'LCD - AUS
End Sub
'-----------------------------------------------------------
Sub Klingel_p
Led0 = 1
Gosub Ausgang_led
Waitms 10
I2csend &H70 , B  'LCD - AN
Led_eing1 = 1
Led_realis = 1
Cls
Locate 1 , 1
Lcd "KLINGEL-MELDER"
Locate 2 , 1
Lcd "( P ) & ( - )"
Realis_3 = 1
Waitms 300  'Voher 500
Realis_3 = 0
Waitms 500
Cls
Locate 1 , 1
Lcd "KLINGEL-MELDER"
Locate 2 , 1
Lcd "B E R E I T"
Wait 1
Led_eing1 = 0
Led_realis = 0
Led0 = 0
Gosub Ausgang_led
Waitms 10
I2csend &H70 , A  'LCD - AUS
End Sub
'----------------------------------------------------------
'---------Noch-Bearbeiten----------
'Klingel_3:
'I2csend &H70 , B  'LCD - AN
'I2cstart
'I2cwbyte Pcf8574_led_schreibadresse
'I2cwbyte &B11111011
'I2cstop
'I2csend &H70 , A
'  Toggle I2csend &H70
'  If Realis_1 = 1 Then
'  Cls
'  Locate 1 , 1
'  Lcd "LICHT AUSSEN AN"
'  Else
'  Cls
'  Locate 1 , 1
'  Lcd "LICHT AUSSEN AUS"
'  I2cstart
'  I2cwbyte Pcf8574_led_schreibadresse
'  I2cwbyte &B11111111
'  I2cstop
'  Realis_1 = 0
'Waitms 2
'I2csend &H70 , A  'LCD - AUS
'End If
'Return
'-------NOCH-BEABEITEN-------------
'---------------------------------------------------------
Klingel_4:
Led2 = 1
Gosub Ausgang_led
Waitms 10
I2csend &H70 , B  'LCD - AN
Realis_5 = 1
  Toggle Realis_2
  Toggle Led_realis
  If Realis_2 = 1 Then
  Cls
  Locate 1 , 1
  Lcd "SERVICE - A N"
  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"
  Wait 1
  Led2 = 0
  Gosub Ausgang_led
  Waitms 10
  Realis_5 = 0
I2csend &H70 , A  'LCD - AUS
End If
Return
'--------------------------------------------------------
Sub Ausgang_test
Led3 = 1
Gosub Ausgang_led
Waitms 10
I2csend &H70 , B  'LCD - AN
Led_taster = 1
Cls
Locate 1 , 1
Lcd "FUNKTION TEST"
Locate 2 , 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 EIN_1&2"
Wait 2
Locate 1 , 1
Lcd "FUNKTION TEST"
Locate 2 , 1
Lcd "EIN1 = _ON"
Led_eing1 = 1
Wait 2
Locate 1 , 1
Lcd "FUNKTION TEST"
Locate 2 , 1
Lcd "EIN1 = AUS"
Led_eing1 = 0
Wait 2
Locate 1 , 1
Lcd "FUNKTION TEST"
Locate 2 , 1
Lcd "EIN2 = _ON"
Led_eing2 = 1
Wait 2
Locate 1 , 1
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
Waitms 500
Cls
Locate 1 , 1
Lcd "KLINGEL-MELDER"
Locate 2 , 1
Lcd "B E R E I T"
Wait 2
Led3 = 0
Gosub Ausgang_led
Waitms 10
I2csend &H70 , A  'LCD - AUS
End Sub

Return

'--I2C-LED_Programm------
Ausgang_led:
Led = 0
If Led0 = 0 Then Led = Led + 1  'LED 0
If Led1 = 0 Then Led = Led + 2  'LED 1
If Led2 = 0 Then Led = Led + 4  'LED 2
If Led3 = 0 Then Led = Led + 8  'LED 3

I2cstart
I2cwbyte Pcf8574_led_schreibadresse
I2cwbyte Led
I2cstop
Return
'---I2C-LED-Programm------

End

ja ich weis das mit A und B könte man noch änderen aber bis jetzt bin ich zufrieden mit den code ausher mit der LCD TEXT anzeigen, wird später folgen.

Gruß Thorsten Sch.
 

Ü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)