Mihai Sprinceana
Un forum de programare cu de toate. Va astept sa va inscrieti si sa deveniti moderatori. Oricine este binevenit aici sa se inscrie si sa aiba acces la informatie free! Fiecare este liber sa adauge proiecte programe free etc. Ajutati acest forum sa devina o comunitate puternica unde fiecare invata de la fiecare! Tot ce trebuie sa faceti este sa va inregistrati si fiecare contributie se poate dovedi utila in timp! Forumul este free informatia free dk aveti timp liber ajutati si pe ceilalti si invatati si voi in acelasi timp! Haideti sa facem ceva pt.a ne ajuta intre noi! Cititi regulament postare forum inainte de a posta!
Lista Forumurilor Pe Tematici
Mihai Sprinceana | Inregistrare | Login

POZE MIHAI SPRINCEANA

Nu sunteti logat.
Nou pe simpatie:
alexxandra
Femeie
24 ani
Timis
cauta Barbat
26 - 59 ani
Mihai Sprinceana / Assembler 8051 / Transmisia I2C  
Autor
Mesaj Pagini: 1
mihaispr
Administrator

Inregistrat: acum 18 ani
Postari: 2142
;Trasnsmisia I2C(cum transmit datele pe I2C-datele sunt transmise in 8biti, ultimul bit numit Acknowledge ; 1 instructiune poate dura 1,085ms
;SDA- Serial Data
;SCL- Serial Clock
$mod51


;==========================================================================================
;    Tabela de salt rutine Monitor
;==========================================================================================

Kern_Table    Equ    50h

; Rutine UART
UART_Init    Equ    Kern_Table
GetChar        Equ    Kern_Table+3
PutChar        Equ    Kern_Table+6
PutByte        Equ    Kern_Table+9
PutDec        Equ    Kern_Table+12
PutBin        Equ    Kern_Table+15
PutCRLF        Equ    Kern_Table+18
PutSpace    Equ    Kern_Table+21
PutDPTR        Equ    Kern_Table+24
PutMsg        Equ    Kern_Table+27

; Rutine conversie
Hex2Asc        Equ    Kern_Table+30
Asc2Hex        Equ    Kern_Table+33

; Rutine temporizare
Delay_ms    Equ    Kern_Table+36
Delay_sec    Equ    Kern_Table+39

; Rutine I2C
I2C_Init    Equ    Kern_Table+42
Send_SLAW    Equ    Kern_Table+45
Test_I2C_Device    Equ    Kern_Table+48
I2CReadByte    Equ    Kern_Table+51
I2CWriteByte    Equ    Kern_Table+54
I2CStart    Equ    Kern_Table+57
I2CStop        Equ    Kern_Table+60
Get_ACK        Equ    Kern_Table+63
Send_ACK    Equ    Kern_Table+66
Send_NAK    Equ    Kern_Table+69
I2CShiftOut    Equ    Kern_Table+72
I2CShiftIn    Equ    Kern_Table+75

; Rutine SPI
SPI_Init    Equ    Kern_Table+78
SPIShiftOut    Equ    Kern_Table+81
SPIShiftIn    Equ    Kern_Table+84

; Rutine Monitor
Mon_L        Equ    Kern_Table+87
GetCmd        Equ    Kern_Table+90
ProcL        Equ    Kern_Table+93
ProcRec        Equ    Kern_Table+96
Dump_Code    Equ    Kern_Table+99
Dump_IRAM    Equ    Kern_Table+102
Fill        Equ    Kern_Table+105
MoveBlock    Equ    Kern_Table+108
Compare_Mem    Equ    Kern_Table+111
HexGen        Equ    Kern_Table+114







SDA bit P1.6
SCL bit P1.7
contor DATA 00h


org 8000h
;    jmp main


main:
    mov P1,#11000000b
    call i2c_start
    ;    mov A,#10011100b
    mov A,#01000000b

    call i2c_send
    call i2c_stop
   
    jmp     Mon_L


i2c_start:

    setb SCL        ; setam SCl pe 1
    call delay5us        ; se apeleaza intarzierea pt respectarea tSTA din SCL
    clr SDA            ; se trece linia de date in 0
    call delay5us        ;pt respectarea tSTA din SDA
    clr SCl
    call delay5us
    ret   



delay5us:
    NOP;ocupa 1 ciclu=1us
ret

i2c_stop:
    setb SCL
    call delay5us
    setb SDA
ret

i2c_send:
    mov contor,#08h
    loop_send:
        RLC     A
        mov     SDA,C; nu se intarzie pt ca tSU;DAT=250ns
        setb     SCl; s-a setat ceasul
        call     delay5us
        clr     SCl
        NOP
        NOP
        DJNZ     contor,loop_send; se decrementeaza contorul si se sare la loop_send
        setb     SDA
        nop
        setb     SCL
        mov     C,SDA
        mov     P1.0,C
        clr    SDA
        call     delay5us
        clr     SCL
ret

i2c_receive:
    mov contor,#08h; primire 8 biti date
    loop_receive:

      setb SCL ;setare ceas in 1
      mov C,SDA ;stocare in carry ceea ce este in SDA(Serial Data)
      rlc A ;rotire acumulator(biti transmisi secvential)
      nop ;delay 1microsecunda
      nop ;delay 2microsecunde
      clr SCL ;setare ceas in 0(SCL-Serial Clock)
      call delay5ms ;intarziere de 5microsecunde
      djnz contor,loop_rec
      clr SDA ;setare linii date in 0
      setb SCL ;setare ceas in 1
      call delay5ms
      clr SCL ;nemodificare date pt.ceas in 1 si setam deci in 0 linia de ceas
      setb SDA ;pt.primire din nou a datelor
      ret    
end


pus acum 17 ani
   
Pagini: 1