Работает в протеусе,но не правильно работает на плате.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
mich91
Встал на лапы
Сообщения: 95
Зарегистрирован: Ср ноя 02, 2011 15:11:49

Работает в протеусе,но не правильно работает на плате.

Сообщение mich91 »

Помогите..написал одну програмку на КодеВижн, для теста кабелей,в протеусе всё работает нормально,но когда спаял,то работает но не правильно.Есть вот такой участок кода порт Д настроен как вход,с подтяжкой!!
char pin_def[8]={0b11111110,0b11111101,0b11111011,0b11110111,0b11101111,0b11011111,0b10111111,0b01111111};

char type_test(void)
{
char i;

for(i=0;i<=7;i++)
{
delay_ms(100);
PORTB=pin_def;
DDRB=~pin_def;

if(PIND!=0xFF)
{
//delay_ms(10);
return 2;

}
}

return 1;

}

И вот такая схема Изображение
По идее когда подключено как на схеме то функция type_test(void),должна возвратить 2,когда хотя б на одном из пине порта Д появится нолик,но почемуто возвращает 1,поскольку не работает как надо ,хотя в протеусе всё работает на ура ((...Может нужно добавить тот делей что я закоментировал ??Когда я сам замикаю любой пин порта Д на землю,то работает ,но когда минус идёт с другого порта ,програмноо ,то он не определяется,что может быть *?А может быть из за какого то неправильного фуз-бит(например деление на 8) ??
Реклама
Аватара пользователя
radteh
Друг Кота
Сообщения: 3087
Зарегистрирован: Пт мар 09, 2007 15:01:52
Откуда: Биробиджан

Re: Работает в протеусе,но не правильно работает на плате.

Сообщение radteh »

Приложи весь проет с кодевижена да и проеуса не помешает.
PS Это проект тестера-скс (LAN-тестера)?
Реклама
mich91
Встал на лапы
Сообщения: 95
Зарегистрирован: Ср ноя 02, 2011 15:11:49

Re: Работает в протеусе,но не правильно работает на плате.

Сообщение mich91 »

radteh писал(а):Приложи весь проет с кодевижена да и проеуса не помешает.
PS Это проект тестера-скс (LAN-тестера)?
Да это оно...Весь проект не могу,какая разница,я ж ведь говорю что этот участок кода не работает...но вот этот работает ,и только тогда когда штучно на порт Д нать нолик,тоисть перевести в режым измерения ПОРТ-ПОРТ,тогда работает....Я думаю что перед сравнением надо кидать задержку,поскоку в этом коде что работает перед сравнением ещё много кода,которое в свою очередь может быть как задержка.

Код: Выделить всё

void test_port_type(void)
{

  char n;

  PORTD=0xFF;
  PORTB=pin_def[cur_pin_out];    
  DDRB=~pin_def[cur_pin_out]; 
  PORT_TEMP=PINB;
  for(n=0;n<8;n++)
   {  
     if(!flags[n]) 
     port_out[n]='S';
     else
     port_out[n]=n+0x31;
     if(PIND==pin_def[n])
     {
       port_in[cur_pin_out]=(n+0x31);
     } 
     if(port_in[n]<5)
     { 
      port_in[n]='N';
      cut=0;
     }

   } 
  if(PORTB!=PINB && flags[cur_pin_out] )
   { 
     flags[cur_pin_out]=0; 
     for(n=cur_pin_out;n<8;n++)
     { 
     
      
      if(PORT_TEMP!=(PINB|(~pin_def[n])))
      {
        flags[n]=0; 
        short_=0; 
         
        short_cir[i_s]=n+0x31;
         i_s++ ;  
        
      }
     }
    i_s++;  
    short_cir[i_s]='•';  
   }
   else
   {
    

   
   if(PIND!=pin_def[cur_pin_out]) 
   {
     H_C=0;
   }
    
   switch(cur_pin_out+1)
   {
    case 1 :{
      if(PIND!=pin_def[2])
      { 
        C_C=0;
      }  
      };break;  
      case 2 :{
      if(PIND!=pin_def[5])
      { 
        C_C=0;
      }  
      };break;          
      case 3 :{
      if(PIND!=pin_def[0])
      { 
        C_C=0;
      }  
      };break;          
        case 4 :{
      if(PIND!=pin_def[3])
      { 
        C_C=0;
      }  
      };break;    
      case 5 :{
      if(PIND!=pin_def[4])
      { 
        C_C=0;
      }  
      };break;
      case 6 :{
      if(PIND!=pin_def[1])
      { 
        C_C=0;
      }  
      };break;
      case 7 :{
      if(PIND!=pin_def[6])
      { 
        C_C=0;
      }  
      };break;    
       case 8 :{
      if(PIND!=pin_def[7])
      { 
        C_C=0;
      }  
      };break;   
      
      
   
  }
 
 }  
}

void test_cable(void)
{
  

      char i;
      char m=0;
      i_s=0; 
      for(i=0;i<7;i++)
       flags[i]=1;
      C_C=1;
      H_C=1;
      short_=1;
      cut=1; 
      lcd_gotoxy(0,0); 
      started=1;
      if(type_test()==2) 
      {           
       cap_en=1; 
       while(cur_pin_out<8)
       {
         
         delay_ms(100);
         test_port_type();
         cur_pin_out++; 
         progress();
       } 
       lcd_gotoxy(12,0);
       lcd_puts("OK!!");
       delay_ms(1000);
       lcd_clear();
       print_state(&m);
      }
      else    
      {
       cap_en=0; 
     
         
         lcd_clear();
         test_cap_type();
         progress();
        
       
       lcd_gotoxy(12,0);
       lcd_puts("OK!!");
       delay_ms(1000);
       lcd_clear();
       print_state(&m);
       lcd_gotoxy(0,1);
        switch( P_C )
        {
         case 0: {lcd_puts("USE 2 PAIR WIRE");}break;
         case 1: {lcd_puts("USE 4 PAIR ERROR");}break;
         case 2: {lcd_puts("USE 4 PAIR WIRE");}break;
        };
      } 
       if (cur_pin_out==8)
         cur_pin_out=0; 
 
     started=0;
 
 
}
Аватара пользователя
radteh
Друг Кота
Сообщения: 3087
Зарегистрирован: Пт мар 09, 2007 15:01:52
Откуда: Биробиджан

Re: Работает в протеусе,но не правильно работает на плате.

Сообщение radteh »

У тебя в коде есть вот такой участок

Код: Выделить всё

for(i=0;i<=7;i++)
{
delay_ms(100);
PORTB=pin_def[i];
DDRB=~pin_def[i]; 
зачем постоянно дёргать режим? Попробуй так

Код: Выделить всё

DDRB=0xFF;
for(i=0;i<=7;i++)
{
delay_ms(100);
PORTB=pin_def[i];
 
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Работает в протеусе,но не правильно работает на плате.

Сообщение Engineer_Keen »

mich91 писал(а):Весь проект не могу,какая разница,я ж ведь говорю что этот участок кода не работает...
А разница в том, чтобы можно было что-то менять, компилировать у себя и сразу проверять, в каком месте проблема...
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»