Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

pic24 C30 portb проблем
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=8233
Страница 1 от 1

Автор:  dan [ Вто Окт 26, 2010 4:40 pm ]
Заглавие:  pic24 C30 portb проблем

Здравейте!
Понеже I2C интерфейса на Pic24fj32GA004 ми прави само проблеми, реших да си спретна една софтуерна имплементацийка на I2C на същите пинове (защото платката вече съм я направил).
До някъде нещата се получиха: Изпращам нормални старт условие и данни, но щом добавих и код за четене на ACQ от сензора нещата се объркаха. Какво ставана: щом добавих кода за ack, при стартиране на програмата не се качва нивoтo на SDA.(има нещо като малко импулсче).
Свързал съм SDA и SCL с 1,5k pull-up резистори.
в main има следното:
Код:
init();
idle_line();
startI2C();
temp1=0x90;
writeI2C(temp1);
wait_ack();

while(1){}

в файла за I2C имам:
Код:
void init(){
TRISAbits.TRISA7=0;
TRISCbits.TRISC6=0;
AD1PCFGbits.PCFG8=1;//disable analog function

//PORTBbits.RB8=1;
//PORTBbits.RB9=1;

LATBbits.LATB8=1;
LATBbits.LATB9=1;

TRISBbits.TRISB8=0;
TRISBbits.TRISB9=0;

TRISBbits.TRISB15=0;
ODCBbits.ODB8=1;//open drain
//ODCBbits.ODB9=1;//open drain
wait_5us();
//PORTBbits.RB8=1;
//PORTBbits.RB9=1;

LATBbits.LATB8=1;
LATBbits.LATB9=1;


}
//**************************************************************************

idle_line:
Код:
idle_line(){

SDA=1;
SCL=1;
wait_5us();
wait_5us();

};

старт:
Код:
void   startI2C(){

   wait_5us();
   SCL=1;
   SDA=0;
   wait_5us();
   SCL=0;
//wait_5us();
};

изпращане на данни:
Код:
void   writeI2C(char   iicwrite){
char   temp_var;
mask=0x80;
for(i=0;i<8;i++)
{
   SCL=0;
   wait_5us();
   temp_var=iicwrite & mask;
   if(temp_var)
   {
      SDA=1;
   }
   else
   {
      SDA=0;
   }
   wait_5us();
      
   SCL=1;
   mask=mask >> 1;
   wait_5us();
   wait_5us();

}


за ACQ :
Код:
void   wait_ack(){
      ack.bit=0;
      SCL=0;
      TRISBbits.TRISB9=1;
      wait_5us();
      SCL=1;
      wait_5us();
      if(SDA=0)
      {
      ack.bit=1;
      }
               }

Ето oсцилограма, ако изпращам само данните (без кода за ack):
http://img253.imageshack.us/i/send0x90withoutacq.png/
А с добавен код за ack:
http://img401.imageshack.us/i/send0x90withacq.png/
Някой има ли представа защо може да става така?

Автор:  dan [ Вто Окт 26, 2010 5:09 pm ]
Заглавие: 

Странно. Като махнах сензора (TCN75) нещата се оправиха. Явно TCN-а е държал линията долу.
Само ми е чудно защо. Нали след 8-ти такт (което за него е ack)трябва да освободи линията...

Автор:  CarBeta [ Вто Окт 26, 2010 9:46 pm ]
Заглавие: 

След осмия такт трябва да има девети(и задържаш клока в ниско ниво) и тогава чакаш АСК. При ниско ниво на SDA можеш да продължиш със следващи 8+1 такта или да генерираш STOP. При високо ниво на SDA(NACK - нещо не е наред) трябва да генерираш STOP.

Автор:  Cekins [ Вто Окт 26, 2010 10:14 pm ]
Заглавие: 

@dan, я потърси из форума за тоя датчик. Имаше преди 2-3 месеца пак някакъв такъв проблем и се беше решил.

Автор:  dan [ Сря Окт 27, 2010 2:52 am ]
Заглавие: 

Аз наскоро пак го борих този чип, но тогава беше друго.

Наистина щом смъкнах последния клок на '0' и чипчето освободи линията SDA.

Автор:  zaphod [ Сря Окт 27, 2010 7:26 am ]
Заглавие: 

ха 24ката позволява да пипнеш два пъти последователно един и същи порт? 30ката е бъгната и първото пипване не се случва, ако няма между тях поне едно нопче, много дразнещ бъг, много.

Автор:  dan [ Вто Ное 02, 2010 4:56 pm ]
Заглавие: 

@zaphod
Сега забелязах подобен бъг и тук: в следния код:
Код:
#define   SDA   PORTBbits.RB9
#define   SCL   PORTBbits.RB8


/*********************************************************/
idle_line(){
TRISBbits.TRISB8=0;
TRISBbits.TRISB9=0;
SDA=1;
SCL=1;
wait_5us();

На реда за сетване на RB9 ми се изчиства предварително сетнатия RB13...

Автор:  dan [ Вто Ное 02, 2010 5:09 pm ]
Заглавие: 

Странно, добавих NOP-чета, но проблема си остана същия.
Код:
idle_line(){
TRISBbits.TRISB8=0;
TRISBbits.TRISB9=0;
asm ("nop");
SDA=1;
asm ("nop");
SCL=1;
asm ("nop");
wait_5us();

Докато използвах pic12 и pic16 си бях свикнал с шадоу регистрите, ама егати 24-ката, ако и тук трябва да ги ползвам :evil:
А още по-странното е, че и симулатора си го показва, че става така...

Автор:  dan [ Вто Ное 02, 2010 5:40 pm ]
Заглавие: 

Най-любезно моля господата от Мокрочип да ми простят, за всичко което отнесоха. Не съм изключил аналоговата функция на пина :oops:

Автор:  zaphod [ Сря Ное 03, 2010 8:50 am ]
Заглавие: 

не, онова е друго, ако беше 30ка нямаше да се изпълни първото обръщение, а не да пипне грешен пин.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/