Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Uruchomienie obsługi I2C w HT-PICC

08 Gru 2007 17:56 1059 4
  • Poziom 32  
    Witam,

    Mam problem z uruchomieniem obsługi I2C w HT-PICC na PIC12F675. Podłączenie wygląda następująco: SCL na GPIO0, SDA na GPIO1. Procedury do I2C wzięte z kompilatora, porty zdefiniowane jak trzeba (chyba) a co bym nie wysłał i nie odebrał to zawsze odbiera 0xFF. Rezystory podciągające dałem 4k7, wewnętrzne PULL-UP-y wyłączone. Nie wiem co jest źle. Usiłuję sczytać coś z termometru cyfrowego TMP100 i z eeprom-u 24C01 (A0,A1,A2 do masy, WP wisi w powietrzu). Odczytuje zawsze same 0xFF. Walczę z tym już kilka dni i zero rezultatów, próbowałem napisać własne procedury odczytu z magistrali ale też wynik zawsze 0xFF. Nie wiem co robię źle.
    Na początku kompilator krzyczał, że nie rozumie definicji TRISIOx (gdzie x to numer pinu) ale po zamianie na początku i2c.c #include <htc.h> na #include <pic12rf675.h> zaczął się kompilować bez błędów. Fragmenty kodu poniżej:

    Code:
    definicje z i2c.h:
    

    /* Uncomment the next line to use the PIC's SSP Module*/
    #define I2C_MODULE 1

    #ifdef I2C_MODULE
    /* I2C module uses PORT C */
    #define SCL     GPIO0             /* clock on port C bit 2 */
    #define SCL_DIR         TRISIO0
    #define SDA     GPIO1                     /* data on port C bit 1 */
    #define SDA_DIR         TRISIO1
    #define I2CTRIS TRISIO
    //#define MASTER_MODE     0B0111 ????
    #define MASTER_MODE     0B1011          /* I2C firmware controlled Master Mode (slave idle) */
    #define SSPMode(val)   SSPCON &=0xF0; SSPCON|=(val & 0xf)

    #else
    /* Change port as required - defaults to port b */
    #define   SCL      GPIO0      /* clock on port B bit 2 */
    #define   SCL_DIR      TRISIO0

    #define SDA      GPIO1             /* data on port B bit 1 */
    #define   SDA_DIR      TRISIO1
    #define I2CTRIS TRISIO

    #endif

    program główny, zapis i odczytanie z eepromu:

    #include <htc.h>
    #include "delay.h"
    #include "i2c.h"
    .
    .
    .
    void main () {

    OPTION = 0b10000000;
    CMCON = 0x07;
    ANSEL = 0x00;
    TRISIO = 0b11101110;
    GPIO = 0xFF;

    i2c_WriteTo(160);   
    i2c_PutByte(1);
    i2c_PutByte(0x36);
    DelayMs(10);


    i2c_WriteTo(160);   
    i2c_PutByte(1);   

    i2c_ReadFrom(161);   
    H = i2c_GetByte(I2C_LAST);   

    wyslijrs(H);

    while(1);

    }


    Próbowałem dodawać i2c_Start(); i i2c_Stop(); przed i po zapisie/odczycie. Nic to nie dało nadal tylko 0xFF. Skończyły mi się już pomysły.
  • Pomocny post
    Poziom 23  
    Witam

    Zobacz na procedury z załącznika i jak jest obsługiwana pamięc 24cXX, może na ich podstawie napiszesz obsługe czujnika.

    Ustawienia pinów są takie:
    Code:

    #define SDA_PIN RA4   
    #define SCL_PIN RA5   
    #define SDA_DIR TRISA4
    #define SCL_DIR TRISA5
  • Poziom 32  
    Witam,

    Już działa, po dopasowaniu procedur zamieszczonych przez Ciebie, odczytuje to co było zapisane, dziękuję.

    Program wygląda mniej więcej tak:
    Code:
    void main () {
    

    OPTION = 0b10000000;
    CMCON = 0x07;
    ANSEL = 0x00;
    TRISIO4 = 0;

    i2c_start();
    i2c_out_byte(160);
    i2c_nack();   
    i2c_out_byte(1);
    i2c_nack();
    i2c_out_byte('K');
    i2c_nack();
    i2c_stop();
    DelayMs(10);

    i2c_start();
    i2c_out_byte(160);
    i2c_nack();
    i2c_out_byte(1);
    i2c_nack();   
    i2c_stop();
    i2c_start();
    i2c_out_byte(161);   
    i2c_nack();
    H = i2c_in_byte();
    i2c_nack();
    i2c_stop();

    wyslijrs(H);

    while(1);
       }


    Teraz zaczynam walkę z termometrami, historia się powtarza z eepromu czyta dobrze ale z termometru 0xFF :/
  • Poziom 23  
    Hej

    Co to za wartość 160 ? Pierwszy wysłany bajt powinien być adresem np:
    ADD1 ADD0 SLAVE ADDRESS
    0 0 1001000
    dodajac 0 lub 1 na koncu jako R/W mamy 144 lub 145. Maksymalna wartość adresu + R/W wg pdfa to 159, 0x9F, 10011111.
  • Poziom 32  
    Ten program u góry jest do eepromu. Do termometru jeszcze się pisze, póki co wygląda tak:

    Code:
    i2c_start();
    
    i2c_out_byte(0x94);
    i2c_ack();   
    i2c_out_byte(0x01);
    i2c_ack();
    i2c_out_byte(0x60);
    i2c_ack();
    i2c_stop();
    i2c_start();
    i2c_out_byte(0x94);
    i2c_ack();   
    i2c_out_byte(0x02);
    i2c_ack();
    i2c_stop();

    DealyMs(500);

    i2c_start();
    i2c_out_byte(0x95);
    i2c_ack();
    H = i2c_in_byte();
    i2c_ack();
    L = i2c_in_byte();
    i2c_nack();
    i2c_stop();


    Odbiera same 0xFF;