Отговори на тема  [ 10 мнения ] 
pic24 C30 portb проблем 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение 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/
Някой има ли представа защо може да става така?

_________________
Хайде де!


Вто Окт 26, 2010 4:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение 
Странно. Като махнах сензора (TCN75) нещата се оправиха. Явно TCN-а е държал линията долу.
Само ми е чудно защо. Нали след 8-ти такт (което за него е ack)трябва да освободи линията...

_________________
Хайде де!


Вто Окт 26, 2010 5:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение 
След осмия такт трябва да има девети(и задържаш клока в ниско ниво) и тогава чакаш АСК. При ниско ниво на SDA можеш да продължиш със следващи 8+1 такта или да генерираш STOP. При високо ниво на SDA(NACK - нещо не е наред) трябва да генерираш STOP.


Вто Окт 26, 2010 9:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
@dan, я потърси из форума за тоя датчик. Имаше преди 2-3 месеца пак някакъв такъв проблем и се беше решил.


Вто Окт 26, 2010 10:14 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение 
Аз наскоро пак го борих този чип, но тогава беше друго.

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

_________________
Хайде де!


Сря Окт 27, 2010 2:52 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
ха 24ката позволява да пипнеш два пъти последователно един и същи порт? 30ката е бъгната и първото пипване не се случва, ако няма между тях поне едно нопче, много дразнещ бъг, много.


Сря Окт 27, 2010 7:26 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение 
@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...

_________________
Хайде де!


Вто Ное 02, 2010 4:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение 
Странно, добавих 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:
А още по-странното е, че и симулатора си го показва, че става така...

_________________
Хайде де!


Вто Ное 02, 2010 5:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение 
Най-любезно моля господата от Мокрочип да ми простят, за всичко което отнесоха. Не съм изключил аналоговата функция на пина :oops:

_________________
Хайде де!


Вто Ное 02, 2010 5:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
не, онова е друго, ако беше 30ка нямаше да се изпълни първото обръщение, а не да пипне грешен пин.


Сря Ное 03, 2010 8:50 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 10 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни