Vizitator giuica marian Postat Decembrie 28, 2011 Partajează Postat Decembrie 28, 2011 Salut, De cateva zile incerc sa scriu si sa citesc dintr-un eeprom 24c04 si nu imi merge nici partea de scriere nici de citire. Pentru i2c folosesc protocolul TWI din controller cu pinii aferenti Multumesc anticipat!! Folosesc placa de dezvoltare evb4.3 si Bascom 1.11.9.0 si codul de mai jos: $regfile = "m32def.dat" $baud = 19200 $lib "I2C_TWI.LBX" $crystal = 16000000 Config Sda = Portc.1 Config Scl = Portc.0 Config Porta.0 = Input Config Porta.1 = Input Config Twi = 400000 I2cinit Porta.1 = 1 Porta.0 = 1 Const Addressw = 172 Const Addressr = 173 Declare Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte) Declare Sub Read_eeprom(byval Adres As Byte , Byval Value As Byte) Dim Adres As Byte , Value As Byte 'main loop Do If Pina.0 = 0 Then Call Write_eeprom(1 , 32) Waitms 200 If Pina.1 = 0 Then Call Read_eeprom(54 , Value) Waitms 200 Loop End 'writing a byte to EEPROM 24C04 Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte) I2cstart 'start condition I2cwbyte Addressw 'slave address I2cwbyte Adres 'asdress of EEPROM I2cwbyte Value 'value to write I2cstop ' generate stop If Err = 0 Then ' check status of operation. Print "Write is good in Location: " ; Adres ' Report success. Else ' or Print "Write failed in Location: " ; Adres ' Report failure. End If Waitms 10 'wait for 10 milliseconds Print "valoare scrisa " ; Value End Sub 'reading a byte from EEPROM 24C02 Sub Read_eeprom(byval Adres As Byte , Byval Value As Byte) I2cstart 'generate start I2cwbyte Addressw 'slave address I2cwbyte Adres 'address of EEPROM I2cstart 'repeated start I2cwbyte Addressr 'slave address (read) I2crbyte Value , Nack 'read byte I2cstop 'generate stop Waitms 10 If Err = 0 Then ' Check status of operation. Print "Read is good from : " ; Adres ' Report success. Else ' or Print "Read failed from: " ; Adres ' Report failure. End If Print "valoarea citita " ; Value End Sub Link spre comentariu
script22 Postat Decembrie 29, 2011 Partajează Postat Decembrie 29, 2011 un demo aici $regfile = "m88def.dat"$lib "i2c_twi.lbx"$crystal = 8000000$baud = 19200Config Scl = Portc.5Config Sda = Portc.4'connect A0 and A1 to ground, A2 to VCCDeclare Sub Writebyte515(address As Word , Value As Byte)Declare Function Readbyte515(address As Word) As ByteDim B As Byte , Adrs As WordDim Hdr As Byte , L As Byte , H As Byte , J As ByteDim Choice As Byte , Wstart As WordConfig Twi = 400000I2cinitPrint "24LC515 EEPROM DEMO"Do Input "0-write 10, 1-read 10, 2-read block ,3 clear" , Choice Select Case Choice Case 0 'write 10 bytes For Adrs = 0 To 15 B = Adrs Writebyte515 Adrs , B 'write value Next Case 1 'read 10 bytes For Adrs = 0 To 15 'read values back B = Readbyte515(adrs) Print B 'and show them Next Case 2 'read dump Inputhex "Start $" , Wstart Hdr = &B10100000 Hdr.3 = Wstart.15 ' A15 address bit H = High(wstart) L = Low(wstart) I2cstart I2cwbyte Hdr I2cwbyte H I2cwbyte L I2crepstart 'repeated start Hdr.0 = 1 ' we will read now I2cwbyte Hdr For J = 1 To 63 I2crbyte B , Ack 'read byte Print Hex(b) ; ","; Next I2crbyte B , Nack 'read byte Print Hex(b) I2cstop Case 3 For Adrs = 0 To 15 B = &HFF Writebyte515 Adrs , B 'write value Next End SelectLoopEnd'write a byte to the 24LC515 memorySub Writebyte515(address As Word , Value As Byte) Hdr = &B10100000 Hdr.3 = Address.15 ' A15 address bit H = High(address) L = Low(address) I2cstart I2cwbyte Hdr 'address with A15 segment bit I2cwbyte H 'MSB I2cwbyte L 'LSB I2cwbyte Value I2cstop Waitms 10End Sub'read a byte from the 24LC515 memoryFunction Readbyte515(address As Word) As Byte Hdr = &B10100000 Hdr.3 = Address.15 ' A15 address bit H = High(address) L = Low(address) I2cstart I2cwbyte Hdr I2cwbyte H I2cwbyte L I2crepstart 'repeated start Hdr.0 = 1 ' we will read now I2cwbyte Hdr I2crbyte Readbyte515 , Nack 'read byte I2cstopEnd Function Link spre comentariu
Vizitator giuica marian Postat Decembrie 30, 2011 Partajează Postat Decembrie 30, 2011 o sa incerc, mersi pentru raspuns Link spre comentariu
Vizitator giuica marian Postat Decembrie 30, 2011 Partajează Postat Decembrie 30, 2011 cred ca am o problema de comunicare cu memoria pentru ca si la citire si la scriere imi apare ca am eroare si in plus, unde afisez valoarea citita imi afiseaza Addressr, adresa de citire.Cred ca in registrul de TWI, ne putand comunica cu memoria, ramane ultima valoare scrisa si anume Addressr.O sa revin cu comment dupa ce imi fac un montaj separat si imi iau si alta memorie ca sa fiu sigur. Link spre comentariu
script22 Postat Decembrie 31, 2011 Partajează Postat Decembrie 31, 2011 incarca asafoloseste rezistori pull up de 10 K conecteaza pinii de adresa corespunzator vezi ce adresa are cipu cu adresa aleasa Link spre comentariu
Vizitator giuica marian Postat Ianuarie 1, 2012 Partajează Postat Ianuarie 1, 2012 placa are deja pullup de 10k pe SDA si SCL, iar pinii i-am folosit cei dedicati PC0 ca SCL si PC1 ca SDA.iar ce doi pini de adresa sunt pusi pe 1; cred ca l-am adresat bine. Problema e ca mi-am ars si multimetrul si nu ma pot asigura ca ce zic ei in documentatia placii e 100% adevarat. O sa incerc sapt asta si o sa-mi fac un mic montaj la lucru.Mersi pentru ajutor! Link spre comentariu
Vizitator giuica marian Postat Ianuarie 3, 2012 Partajează Postat Ianuarie 3, 2012 am reusit sa il fac sa scrie si sa citeasca un byte la orice adresa data de la tastatura. Nu am incercat sa implementez page write, read, etc, dar daca o sa am timp o sa ma mai joc cu el si o sa postez codul iar Pentru cei interesati aici este tot codul, dar nu este comentat 100% Programul este bun pentru incepatori pt ca foloseste: LCD, comunicare UART, I2C 'Proiect I/O, comunicare seriala PC - Atmega32'PORTA = output pentru stepper motor (motor de cluster) si ventilator,Pin2 = comanda uln pentru ventilator, Pin1 = albastru' Pin3 = rosu, Pin5 = negru, Pin7 = mov, pin8 = ADC de pe POT1'PORTB pinul 1 magistrala 1 wire si PINI LCD :pin2 = BL, pin3 = Rs, pin4 = E,' pin5 = Db4, pin6 = Db5, pin7 = Db6, pin8 = Db7'P0RTC I2C Pin1 = SCL, pin2 = SDA, Pin3 = led1 , Pin4 = led2'PORTD este folosit pentru comunicare seriala cu PC-ul Pin1 = Rx, Pin2 = Tx$regfile = "m32def.dat"$crystal = 16000000$lib "I2C_twi.LBX" 'foloseste pt protocolul I2C, TWI-ul hw din controller$baud = 19200 ' baud rate-ul de comunicare UARTConfig Porta = Output 'Seteaza PORTA ca outputConfig Lcd = 16 * 2 'lcd-ul este de 16 caractere ori 2 liniiConfig Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2Config Sda = Portc.1 ' seteaza pinul de comunicare date pe I2CConfig Scl = Portc.0 ' seteaza pinul de clock pentru I2CConfig Twi = 400000 ' seteaza viteza I2C in HzDeclare Sub Motoro360()Declare Sub Motori360()Declare Sub Motorxpasi()Declare Sub Lista()Declare Sub Temp()Declare Sub Convallt()Declare Sub Uselcd()Declare Sub Radc()Declare Sub Weeprom()Declare Sub Reeprom()Declare Function Decigrades(byval Sc(9) As Byte) As IntegerPortc.2 = 1Portc.3 = 1Porta = &B00000000Dim Akey As Byte , Value As Byte , Temp As IntegerDim Inpstr As String * 12Print "Salut!!!"Wait 1Print "Comanda list afiseaza lista de comenzi"Wait 1Label: ' label LabelPrint "Introduceti comanda:"Inpstr = ""DoAkey = Waitkey()If Akey = 13 Then Goto Progprincipal Inpstr = Inpstr + Chr(akey) Print Chr(akey) ;LoopProgprincipal: ' label ProgprincipaPrintSelect Case Inpstr 'compara comanda introdusa si alege varianta corespunzatoare Case "l1on" : Portc.2 = 0 Case "l1off" : Portc.2 = 1 Case "l2on" : Portc.3 = 0 Case "l2off" : Portc.3 = 1 Case "motoro360" : Call Motoro360() Case "motori360" : Call Motori360() Case "motorxpasi" : Call Motorxpasi() Case "list" : Call Lista Case "temp" : Call Temp() Case "fanon" : Porta.1 = 1 Case "fanoff" : Porta.1 = 0 Case "uselcd" : Call Uselcd() Case "radc" : Call Radc() Case "weeprom" : Call Weeprom() Case "reeprom" : Call Reeprom() Case Else : Print "Comanda invalida"End SelectGoto LabelEnd'afiseaza lista comenzilor disponibileSub Lista()Print "l1on - aprinde led1"Print "l1off - stinge led1"Print "l2on - aprinde led2"Print "l2off - stinge led2"Print "fanon - porneste ventilatorul"Print "fanoff - opreste ventilatorul"Print "motoro360 - roteste motorul 360 de grade in sens orar"Print "motori360 - roteste motorul 360 de grade in sens invers acelor de ceasornic"Print "motorxpasi - roteste motorul cu x pasi (1 pas = 7,2 grade, 50 pasi 360 grade) in sensul ales de utilizator"Print "temp - afiseaza temperatura in grade celsius"Print "uselcd - afiseaza textul scris pe lcd (max 16*2 caractere)"Print "radc - afiseaza valoarea ADC de pe POT1"Print "weeprom - permite scrierea unei adrese din eeprom"print "reeprom - permte citirea unei adrese din eeprom"End Sub'Roteste motorul in sens orar 360 de gradeSub Motoro360()Dim Z As IntegerZ = 0DoPorta = 64Waitms 10Porta = 4Waitms 10Porta = 16Waitms 10Porta = 1Waitms 10Z = Z + 1Loop Until Z = 50End Sub'roteste motorul in sens invers acelor de ceasornic 360 de gradeSub Motori360()Dim A As IntegerA = 0DoPorta = 1Waitms 10Porta = 16Waitms 10Porta = 4Waitms 10Porta = 64Waitms 10A = A + 1Loop Until A = 50End Sub'roteste motorul x pasi in sensul ales de utilizator (un pas = 7.2 grade, 50 de pasi =360 de grade)Sub Motorxpasi()Inpstr = ""Dim X As String * 2Dim B As IntegerPrint "Introduceti numarul de pasi - 1 pas=7grade"DoAkey = Waitkey()If Akey = 13 Then Goto Label4 Inpstr = Inpstr + Chr(akey) Print Chr(akey) ;LoopLabel4: 'label Label4Print "Introduceti sensul - o pentru orar, i pentru invers acelor de ceasornic"X = Waitkey()Print Chr(x)B = Val(inpstr)If X = "o" ThenDoPorta = 64Waitms 10Porta = 4Waitms 10Porta = 16Waitms 10Porta = 1Waitms 10B = B - 1Loop Until B = 0End IfIf X = "i" ThenDoPorta = 1Waitms 10Porta = 16Waitms 10Porta = 4Waitms 10Porta = 64Waitms 10B = B - 1Loop Until B = 0End IfEnd Sub'afiseaza temperatura de pe senzorul digital DS18b20Sub Temp()Config 1wire = Portb.0Dim Dsid(8) As ByteDim Sc(9) As ByteDim C As ByteDim W As WordDim Dg As IntegerDim Grade As IntegerDim Dgrade As ByteDim Count As Byte'cautare senzor de temperaturaW = 1wirecount()Dsid(1) = 1wsearchfirst()If Dsid(8) = Crc8(dsid(1) , 7) Then Print "CRC OK!!! Senzor id in hex = " ; For C = 1 To 8 Print Hex(dsid(c)) ; NextPrintEnd If'repeta citirea de 5 ori pentru a citi temperatura corectaFor Count = 0 To 4 Step 1ConvalltWaitus 200 : Waitus 200 : Waitus 200 : Waitus 200:1wverify Dsid(1)Waitms 1001wwrite &HBESc(1) = 1wread(9)If Sc(9) = Crc8(sc(1) , 8) ThenDg = Decigrades(sc(9))Grade = Dg \ 10Dgrade = Dg Mod 10End IfNext CountPrint Grade ; "." ; Dgrade ; " grade C"End Sub'comanda senzorul sa pregateasca in scratchpad temperaturaSub Convallt()1wreset1wwrite &HCC1wwrite &H44End Sub'transforma scratchpadul in decigradeFunction Decigrades(byval Sc(9) As Byte)Decigrades = 0Decigrades = Makeint(sc(1) , Sc(2))Decigrades = Decigrades * 10Decigrades = Decigrades / 16End Function'afiseaza pe lcd 16*2 caractereSub Uselcd()InitlcdDim Y1 As Byte , Y2 As ByteY1 = 1Y2 = 0ClsPortb.1 = 1 'porneste backlight-ul de la LCDPrint "introduceti textul (max 16 caractere):"DoAkey = Waitkey()If Akey = 13 Then Goto Label0Print Chr(akey) ;Y2 = Y1 - 16If Y1 = 33 Then Y1 = 0 ' cand s-a depasit si a doua linie se trece dinou la prima si se rescrieIf Y1 < 17 Then Locate 1 , Y1 'daca sunt mai putin de 16 caractere afiseaza pe prima linieIf Y1 > 16 Then Locate 2 , Y2 ' cand s-a depasit prima linie se trece la urmatoareLcd Chr(akey)Y1 = Y1 + 1LoopLabel0: 'label Label0PrintEnd Sub'afiseaza valoare ADC de pe POT1Sub Radc()Config Adc = Single , Prescaler = Auto , Reference = InternalDim Ad_read As WordStart AdcAd_read = Getadc(7)Print Ad_readStop AdcEnd Sub'scrie un byte, citit de la tastatura, intr-o adresa citita de la tastatura din eeprom 24C64Sub Weeprom()Dim Hw As Byte , Lw As ByteInpstr = ""Print "introduceti adresa (0000 - 8192): " ;DoAkey = Waitkey()If Akey = 13 Then Goto Label1 Inpstr = Inpstr + Chr(akey) Print Chr(akey);LoopLabel1: 'label Label1Temp = Val(inpstr)Hw = High(temp)Lw = Low(temp)Inpstr = ""PrintPrint "introduceti valoarea (0 - 255): " ;DoAkey = Waitkey()If Akey = 13 Then Goto Label2 Inpstr = Inpstr + Chr(akey) Print Chr(akey);LoopLabel2: ' label Label2PrintValue = Val(inpstr) I2cstart 'start condition I2cwbyte &HA0 'slave address I2cwbyte Hw 'high asdress of EEPROM I2cwbyte Lw 'low adress of EEPROM I2cwbyte Value 'value to write I2cstop ' generate stopIf Err = 1 Then ' check status of operation. Print "scrierea nu a reusit" ' Report failure.End If Waitms 10 'wait for 10 millisecondsEnd Sub'citeste un byte dintr-o adresa citita de la tastatura eeprom 24C64Sub Reeprom()Value = 0Dim Hr As Byte , Lr As ByteInpstr = ""Print "introduceti adresa (0000 - 8192): " ;DoAkey = Waitkey()If Akey = 13 Then Goto Label3 Inpstr = Inpstr + Chr(akey) Print Chr(akey);LoopLabel3:PrintTemp = Val(inpstr)Hr = High(temp)Lr = Low(temp) I2cstart 'generate start I2cwbyte &HA0 'slave address(write) I2cwbyte Hr 'high adress of EEPROM I2cwbyte Lr 'low adress address of EEPROM I2crepstart 'repeated start I2cwbyte &HA1 'slave address (read) I2crbyte Value , Nack 'read byte I2cstop 'generate stopWaitms 10If Err = 0 Then ' Check status of operation. Print "Valoare: " ; Value ' Report success and value. Else ' or Print "citirea nu a avut succes" ' Report failure. End IfEnd Sub Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum