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:
Slave: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
Vielen dank im voraus ich weiss is n haufn arbeit son code durchzugehn aber ich wär euch echt dankbar!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
mfg.
m0







Zitieren

Lesezeichen