Hi!
also ich bin übrigens der Gast von 2 threads weiter oben sorry....
hab mich jetzt mal hingesetzt und das versucht sitz jetzt aber schon 4 stunden an dem slave.. will einfach nicht.. es währe echt total genial wenn sich jemand der sich auskennt mal meinen code ansieht! is auch schön kurz nur zum testen vielleicht hab ich ja nur irgend ne kleinigkeit vergessen.. naja den master hab ich aus den schnipseln von www.sprut.de zusammengesetzt aber vielleicht liegts ja auch an dem... ich verzweifel hier auf jedenfall fast.. wäre echt spize wenn sich jemand die mühe macht sich das anzusehen!!
hier mal die codes (für PIC16F877 @ 4mHz):
Master:
Code:
#include <P16f877.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF & _BODEN_OFF
adresse1 EQU 0x26 ; Variablen Declarieren ;)
loops EQU 0x28
loops2 EQU 0x29
temp EQU 0x2A
; reicht vorerst an vars will ja nix übertreibn
org 0
goto init
; init the I2C stuff::::::::::::::::::::::::::::::::::::::::::::::::::::
init
movlw B'01001000'
movwf adresse1
bsf STATUS, RP0 ; Bank1
movlw B'00011000' ; trisc 2+3 inputs für I2C
movwf TRISC ;
movlw B'00000000' ; trisd outputs für Servos
movwf TRISD ;
movlw B'00000000' ; trisb outputs für LEDs und Relais
movwf TRISB ;
movlw d'2' ; clock = 4/(4*(2+1)) = 333kHz
movwf SSPADD ; für I2C
bcf STATUS, RP0 ; Bank 0
movlw B'00001000' ; master mode, clock=Fosc/(4*(SSPADD+1))
movwf SSPCON ;
bsf SSPCON, SSPEN ; MSSP-Modul enable
goto main
; rdy with initing:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; General routines:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; delay 1sec::
WAIT
top1 movlw .110 ; timing adjustment variable (1ms)
movwf loops2
top21 nop ; sit and wait
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
decfsz loops2, F ; inner loops complete?
goto top21 ; no, go again
decfsz loops, F ; outer loops complete?
goto top1 ; no, go again
retlw 0 ; yes, return from subWAIT
; I2C routines:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; bus übernehmen::
i2c_takeover bcf PIR1, SSPIF ; SSPIF Bit löschen
bsf STATUS, RP0
bsf SSPCON2, SEN ; Bus Übernahme anweisen
bcf STATUS, RP0
i2c_t1 btfss PIR1, SSPIF ; Testen, ob Bus schon übernommen wurde
goto i2c_t1 ; nein, noch nicht
bcf PIR1, SSPIF ; ja, der Bus ist mein! nun noch SSPIF zurücksetzen
return
; w senden an adresse1::
i2c_sendw1 movwf temp
movfw adresse1
movwf SSPBUF ; -> zum I2C-Slave übertragen
i2c_t2 btfss PIR1, SSPIF ; ACK schon empfangen?
goto i2c_t2 ; nein, noch nicht
bcf PIR1, SSPIF ; ja, Daten sind im Slave, nun noch SSPIF zurücksetzen
movfw temp
movwf SSPBUF ; -> zum I2C-Slave übertragen
i2c_t3 btfss PIR1, SSPIF ; ACK schon empfangen?
goto i2c_t3 ; nein, noch nicht
bcf PIR1, SSPIF ; ja, Daten sind im Slave, nun noch SSPIF zurücksetzen
return
; bus freigeben::
i2c_free bsf STATUS, RP0
bsf SSPCON2, PEN ; Bus Freigabe anweisen
bcf STATUS, RP0
i2c_t6 btfss PIR1, SSPIF ; Bus schon freigegeben?
goto i2c_t6 ; nein, noch nicht
bcf PIR1, SSPIF ; ja, alles fertig, nun noch SSPIF zurücksetzen
return
;:::::::::::::::::::::::main program:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::..
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::....
main
clrf PORTB
call WAIT
call WAIT
call i2c_takeover
bsf PORTB, 0
movlw b'11111111'
call i2c_sendw1
bsf PORTB, 1
call i2c_free
bsf PORTB, 2
call WAIT
call WAIT
bsf PORTB, 3
call i2c_takeover
movlw b'00000000'
call i2c_sendw1
call i2c_free
goto main
end
Slave:
Code:
#include <P16f877.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF & _BODEN_OFF
adresse1 EQU 0x26 ; Variablen Declarieren ;)
adresse2 EQU 0x27
loops EQU 0x28
loops2 EQU 0x29
s_copy EQU 0x2A
w_copy EQU 0x2B
temp EQU 0x2C
; reicht vorerst an vars will ja nix übertreibn
org 0
goto init
org 4 ; Interruptvector
intvec bcf INTCON, GIE ; disable Interupt
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
movwf s_copy ;
; Intrupt servic routine
Int_serv
call receivedata
swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w
bcf INTCON, T0IF ; Interupt-Flag löschen
bsf INTCON, GIE ; enable Interupt
retfie
receivedata bsf STATUS, RP0 ; Bank1
btfss SSPSTAT, BF
goto receivedata
movfw SSPBUF
movwf PORTB
bcf STATUS, RP0 ; Bank 0
bcf PIR1, SSPIF
return
; init the I2C stuff::::::::::::::::::::::::::::::::::::::::::::::::::::
init
bsf STATUS, RP0 ; Bank1
movlw B'00011000' ; trisc 2+3 inputs für I2C
movwf TRISC ;
movlw B'00000000' ; trisd outputs für Servos
movwf TRISD ;
movlw B'00000000' ; trisb outputs für LEDs und Relais
movwf TRISB ;
movlw d'01001000' ; adress
movwf SSPADD ; für I2C
bcf STATUS, RP0 ; Bank 0
clrf PORTB
clrf PORTD
movlw B'00001100' ; slave mode
movwf SSPCON ;
bsf SSPCON, SSPEN ; MSSP-Modul enable
bsf INTCON, GIE ; Interupt erlauben
goto main
; rdy with initing:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;:::::::::::::::::::::::main program:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::..
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::....
main
nop
goto main
end
Vielen dank im voraus ich weiss is n haufn arbeit son code durchzugehn aber ich wär euch echt dankbar!
mfg.
m0
Lesezeichen