I2C i MCP3221

Dyskusje ogólne na temat "cyfrówki" czyli wszystko o TTL/CMOS, językach VHDL i VERILOG, bramkach, rejestrach, przerzutnikach... Dobre miejsce na pytania odnośnie uniwersalnych programatorów (np. Willem) a także podłączania własnych peryferiów do komputera PC.
ODPOWIEDZ
Daniel Z.
-
Posty: 6
Rejestracja: 14 maja 2009, 16:05
Lokalizacja: Siennica

I2C i MCP3221

Post autor: Daniel Z. » 06 cze 2009, 17:27

Witam ma problem z ustawieniem i odczytaniem linii cyfrowej, używam kontrolera 8051 a konwerter to mcp3221

o to kod programu.

pomóżcie

Kod: Zaznacz cały


#include <REG51.H>

   sbit P1_0 = P1^0;
   sbit P1_1 = P1^1;
   sbit P1_2 = P1^2;
   sbit P1_3 = P1^3;
   sbit P1_4 = P1^4;
   sbit P1_5 = P1^5;
   sbit P1_6 = P1^6; //wskaznik czy ustawianie jest manualne
   
   sbit P0_0 =   P0^0;
   sbit P0_1 =   P0^1;
   sbit P0_6 =   P0^6;
   sbit P0_7 = P0^7;

   #define LED1    P1_0
   #define LED2    P1_1
   #define LED3    P1_2
   #define LED4    P1_3
   #define LED5    P1_4
   #define LED6    P1_5
   #define LEDM    P1_6

   #define SDA0    P0_0
   #define SCL0    P0_1
   #define SDA1    P0_6
   #define SCL1    P0_7

unsigned int bdata swiatlo;     //natezenie swiatla
unsigned int bdata manual;     //zmienna  mowiaca czy obsluga manualna (0) czy tez automat (1)
unsigned int bdata mnoznik;     //mnoznik 4096
unsigned char bdata Var1, Var2, Var3;   
volatile unsigned int bdata Key;

sbit B1 = Key^0;
sbit B2 = Key^1;
sbit B3 = Key^2;
sbit B4 = Key^3;
sbit B5 = Key^4;
sbit B6 = Key^5;
sbit B7 = Key^6;
sbit B8 = Key^7;
sbit B9 = Key^8;
sbit B10 = Key^9;
sbit B11 = Key^10;
sbit B12 = Key^11;

void ISR_Timer1(void) interrupt 3
   {
   TR1 = 0;      
   TH1 = 0xFF;      
   TL1 = 0xFF;      

    switch(manual)
    {
     case 0 :
        manual=1;
      LEDM=1;
        break;
     case 1 :
        manual=0;
      LEDM=0;
        break;
    }
   
   TR1 = 1;
   }

void Wait(int T)
   {
      int x;
      for(x=0;x<T;x++){;}
   }

void czytanie0(void)
   {
      int z;
       for(z=1;z<13;z++)
       {
         SCL0 = 0;
         SDA0 = 1;
         Wait(200);
         SCL0 = 1;
         Wait(100); // /2
         if(z==1)
        {
          B1 = SDA0;
         }
        if(z==2)
        {
          B2 = SDA0;
         }
        if(z==3)
        {
          B3 = SDA0;
         }
        if(z==4)
        {
          B4 = SDA0;
         }
        if(z==5)
        {
          B5 = SDA0;
         }
        if(z==6)
        {
          B6 = SDA0;
         }
        if(z==7)
        {
          B7 = SDA0;
         }
        if(z==8)
        {
          B8 = SDA0;
         }
        if(z==9)
        {
          B9 = SDA0;
         }
        if(z==10)
        {
          B10 = SDA0;
         }
        if(z==11)
        {
          B11 = SDA0;
         }
        if(z==12)
        {
          B12 = SDA0;
         }
        Wait(200);
       }

   }

void czytanie1(void)
   {
      int x;
       for(x=1;x==13;x++)
       {
         SCL1 = 0;
         SDA1 = 1;
         Wait(200);
         SCL1 = 1;
         Wait(100); // /2
         if(x==1)
        {
          B1 = SDA1;
         }
        if(x==2)
        {
          B2 = SDA1;
         }
        if(x==3)
        {
          B3 = SDA1;
         }
        if(x==4)
        {
          B4 = SDA1;
         }
        if(x==5)
        {
          B5 = SDA1;
         }
        if(x==6)
        {
          B6 = SDA1;
         }
        if(x==7)
        {
          B7 = SDA1;
         }
        if(x==8)
        {
          B8 = SDA1;
         }
        if(x==9)
        {
          B9 = SDA1;
         }
        if(x==10)
        {
          B10 = SDA1;
         }
        if(x==11)
        {
          B11 = SDA1;
         }
        if(x==12)
        {
          B12 = SDA1;
         }
        Wait(200);
       }
   }
   
void init()
   {
   LED1 = 0;
   LED2 = 0;
   LED3 = 0;
   LED4 = 0;
   LED5 = 0;
   LED6 = 0;
   LEDM = 0;

   TMOD &= 0x5F;
   TMOD |= 0x50;
   TH1 = 0xFF;
   TL1 = 0xFF;
   TCON |= 0x40;
   IE |= 0x08 ;

   manual=0;
   mnoznik=4096;      
   EA = 1;         
   }   

void main(void)
   {
   init();
      while(1)
      {
      if(manual==0)
      {
      czytanie0();   
      }
      else
      {
      czytanie1();
      }

      if(65294<=Key)
      {
      LED1=1;   
         if(65295<=Key)
         {
          LED2=1;
            if(65296<=Key)
            {
             LED3=1;
               if(65297<=Key)
               {
                LED4=1;
                  if(65298<=Key)
                  {
                   LED5=1;
                     if(65299<=Key)
                     {
                      LED6=1;
                     }
                  }
               }
            }
         }
      }   
      }
   } 
Mam problem z ustawieniem i odczytem z linii SDA przetwornika mcp3221,

Kod: Zaznacz cały

sbit P0_0 = P0^0;
sbit P0_1 = P0^1;
sbit P0_6 = P0^6;
sbit P0_7 = P0^7;
#define SDA0 P0_0
#define SCL0 P0_1
#define SDA1 P0_6
#define SCL1 P0_7
...
void czytanie0(void)
{
int z; 
for(z=1;z<13;z++)
{
SCL0 = 0;
SDA0 = 1;
Wait(200);
SCL0 = 1;
Wait(100); // /2
if(z==1)
{
B1 = SDA0;
}
if(z==2)
{
B2 = SDA0;
}
if(z==3)
{
B3 = SDA0;
}
if(z==4)
{
B4 = SDA0;
}
if(z==5)
{
B5 = SDA0;
}
if(z==6)
{
B6 = SDA0;
}
if(z==7)
{
B7 = SDA0;
}
if(z==8)
{
B8 = SDA0;
}
if(z==9)
{
B9 = SDA0;
}
if(z==10)
{
B10 = SDA0;
}
if(z==11)
{
B11 = SDA0;
}
if(z==12)
{
B12 = SDA0;
}
Wait(200);
}

}
mam taki kod o mam 2 przetworniki mcp tylko że w proteusie, w którym robię niewiem jak zaadresować je bo domyślnie oba maja ten sam adres i później się do nich odwoływać.

Z góry wielki dzięki

Po co dwa podobne tematy? Wrzuciłem do jednego. Ddevil
Ostatnio zmieniony 07 cze 2009, 0:38 przez Daniel Z., łącznie zmieniany 2 razy.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 05 lip 2009, 16:11

Cóż twój problem jest raczej dla szpeców od C. Ale w nocie katalogowej jest takowa notka.
The device code is followed
by three address bits: A2, A1 and A0. The default
address bits are 101. Contact the Microchip factory for
additional address bit options.
The address bits allow
up to eight MCP3221 devices on the same bus and are
used to determine which device is accessed.
Ja co prawda jakimś autorytetem w Angielskim nie jestem bo uczyłem się Rosyjskiego. Ale jak dobrze rozumiem to co jest tłustym drukiem, to aby na jednej magistrali mogło współpracować więcej niż 1 układ, należy się skontaktować z producentem, i oni ci wyprodukują układy o różnych adresach wywołania. Inaczej nici z pracą 2 lub więcej przetworników na jednej magistrali. Będą się po prostu zakłócać.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 05 lip 2009, 16:24

Na razie spróbuj z jednym się dogadać. Programowa obsługa I2C jest np. tu: http://mikrokontrolery.net/avr_c_09.htm . Co prawda to dla AVR ale przerobić możesz bez problemu.

Przetwornik widzę bierze mało prądu więc możesz zrobić przełączanie między przetwornikami na zasadzie podawania im zasilania z PIN'u procesora. Najpierw czytasz jeden, robisz przerwę, przełączasz zasilanie na drugi układ, czytasz drugi, przerwa, podajesz zasilanie na pierwszy przetwornik i tak w kółko.

Dogadanie się z przetwornikiem polega na wysłaniu mu adresu (10011011) urządzenia a on odsyła ci wynik w kolejności MSB, LSB. Szczegóły na str. 17/28 pdf'a. Na końcu składasz wynik:

Kod: Zaznacz cały

unsigned int wynik;
wynik=(MSB<<8)+LSB;

ODPOWIEDZ