Zitat von
wberger
Stell doch mal den Schaltplan online. Ich frage mich, wie du Ports RB6 und 7 zwischen LED und
I2C multiplext. LED gegen plus oder gegen Masse? Welcher LED Vorwiderstand? Welcher
I2C Pull-up?
Gruß
Wolfgang
Die (low current)LED's sind mit Vorwiderständen 1,5k gegen 5V geschaltet.
Und in diesem AUgenblick wird mir schon mein erster Fehler klar Ich deklariere ja die PORT's als Ausgang und bekomme ja einen TTL-Signal am Ausgang. Aber wie sage ich dem PIC, dass er mir je nach DIP-Schalterstellung vom 8574 an dem jeweiligen PIC-Pin, den Massebezug herstellen soll?
Im Datenblatt vom Pic16f84a steht, dass die Pins 6/7 vom PortB für serielle Datenübertragung dienen. Kann ich aber trotzdem meine SDA/SCL-Leitung zum Bsp an PORTA anschliessen?
In meiner Software muss ich eben das ganze "multiplexen", in dem ich die PortB Pins 6 und 7 immer zwischen Input/Output deklariere.
ICh habe jetzt keinen Schaltplan parat aber habe hier einen gekritzelt
http://i33.tinypic.com/i69f8g.jpg
Code:
;************************************************************************************************************************************
; Programm EXPANDER.asm: Demoprogramm SeriellePorterweiterung mit PCF 8574 ,
; Porterweiterung dient als Eingang; eingegebene Daten werden an Port B über 8 LEDs ausgegeben .
; PIC 16F84A, f = 4 MHz
;************************************************************************************************************************************
#include <P16F84A.INC>
list P=PIC16F84A
__CONFIG _XT_OSC &_WDT_OFF
errorlevel -302 ;Eliminate bank warning
ZAEHL1 equ 21H ;
ZAEHL2 equ 22H ;
ZAEHL3 equ 23H ;
;Definition
#define sda PORTB, 7 ;RB,7 Datenleitung SDA
#define scl PORTB, 6 ; RB,6 Taktleitung SCL
; Konstanten
teiladrs equ 0x41 ; Bauteil-Adresse: 41h fuer Lesen aus PCF 8574
; Ziele der Registeroperationen
w equ 0
f equ 1
org 0x0 ; Programmanfang bei PC = 0
start goto init
;************************************************************************************************************************************
; Erzeugen der Startbedingung: 1-0-Uebergang von SDA, waehrend SCL = 1 ist
;************************************************************************************************************************************
bstart bcf scl ;sichergehen, dass scl auch 0 ist
bsf scl ;scl=1
call pause
bsf sda ;sda=1
call pause
bcf sda ;sda=0
call pause
bcf scl ;scl=0
return
;************************************************************************************************************************************
; Erzeugen der Stoppbedingung: 0 -1- Uebergang von SDA, waehrend SCL = 1
;************************************************************************************************************************************
bstop bcf sda ;sichergehen, dass sda auch wirklich 0 ist
call pause ;
bsf scl ; Takt auf High
call pause ;
bsf sda ;0-1 -Flanke von sda
return
;************************************************************************************************************************************
; Lesen eines bit aus dem Expander und Ablegen in ZAEHL3
;************************************************************************************************************************************
bitein bsf STATUS,RP0 ;auf Bank 1 umschalten
movlw 0xBF ;1011 1111 ins w-reg
movf TRISB ;RB7 = Input / RB6 muss Output bleiben, da der takt vom Pic erzeugt wird
bcf STATUS,RP0 ;
bsf sda ;
bsf scl ;
call pause ;
bcf ZAEHL3,0 ;
btfsc sda ;
bsf ZAEHL3,0 ;
bcf scl ;
return
;************************************************************************************************************************************
; Bestätigungsbit an das EEPROM augeben
;************************************************************************************************************************************
bitaus bsf STATUS,RP0 ;sda auf Output setzen
bcf sda ;
bcf STATUS,RP0 ;
btfss ZAEHL3,1 ; teste ob bit1 im zaehl3 =0 dann sda=0
goto I2C_Weiter1 ;
bsf sda ;wenn bit1=1 dann setze sda=1
goto I2C_Weiter2 ;
I2C_Weiter1 bcf sda ;
I2C_Weiter2 bsf scl ;
call pause ;
bcf scl ;
return
;************************************************************************************************************************************
; Uebertragen eines Datenbytes aus ZWISCH ueber EEPROM,do ins PCF 8574; ZWISCH muss vorher aus DATAUS
; geladen sein. Nach dem 8. bit erfolgt ein 9. Taktpuls und Test des Bestaetigungsbits vom Eeprom auf 0. Ist das
; Bestaetigungsbit = 1, wird als Fehlermeldung RA0 = 1 gesetzt (LED).
;************************************************************************************************************************************
I2C_Schr movlw 0x08 ;
movwf ZAEHL2 ;
I2C_Schl2 bcf ZAEHL3,1 ;
btfsc ZAEHL1,7 ;
bsf ZAEHL3,1 ;
call bitaus ;
rlf ZAEHL1,f ;
decfsz ZAEHL2,f ;
goto I2C_Schl2 ;
call bitein ;
return
;************************************************************************************************************************************
; Lesen eines Datenbytes aus PCF 8574 nach DATEIN; danach Bestaetigungsbit =1 ausgeben,
; um Stoppbedingung zu ermöglichen
;************************************************************************************************************************************
I2C_Lesen clrf ZAEHL1 ;
movlw 0x08 ;
movwf ZAEHL2 ;
bcf STATUS,0 ;
I2C_Schl1 rlf ZAEHL1,f ;
call bitein ;
btfsc ZAEHL3,0 ;
bsf ZAEHL1,0 ;
decfsz ZAEHL2,f ;
goto I2C_Schl1 ;
bsf ZAEHL3,1 ;
call bitaus ;
return
;************************************************************************************************************************************
; Programmbeginn
;***********************************************************************************************************************************
init bsf STATUS,RP0 ;
clrf PORTB ;
bcf STATUS,RP0 ;
;************************************************************************************************************************************
; Daten aus PCF 8574 lesen
lies clrf ZAEHL1 ;
clrf ZAEHL2 ; Vorbereiten zum Lesen des PCF 8574
clrf ZAEHL3 ;
call bstart ; Startbedingung uebertragen
movlw teiladrs ;
movwf ZAEHL1 ; Bauteiladresse f. Lesen (41h) uebertragen
call I2C_Schr ;
call I2C_Lesen ; 1 Datenbyte aus PCF 8574 lesen
call bstop ; Stoppbedingung uebertragen
;************************************************************************************************************************************
; Daten von PCF 8574 in DATEIN
bsf STATUS, RP0 ;
clrf TRISB ;
bcf STATUS, RP0 ;
movf ZAEHL1,w ; ZAEHL1 nach w
movwf PORTB ; und nach Port B
clrw
call pause ; 10 ms Pause zum Anzeigen
goto lies
org 1FF
goto start
;************************************************************************************************************************************
;Pausenzeit
;************************************************************************************************************************************
pause nop
return
end
Lesezeichen