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

Проблем с динамична индикация?
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=6816
Страница 1 от 1

Автор:  BONGO [ Пет Май 15, 2009 1:17 am ]
Заглавие:  Проблем с динамична индикация?

Имам голям проблем с 3 разредна динамична седемсегментна индикация :(

Ето това е подпрограмата която управлява 3-те сегмента:




Код:
byte CONST  LED_MAP[11] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0,0x10,0xFF};
long int d1,d2,d3;



void display(long int a1)          // Подпрограма индикация LED

  {
             
    d1=a1/100;                         
    d2=(a1-100*d1)/10;             
    d3=(a1-100*d1-10*d2);         
   
                         
    output_b(LED_MAP[d1]);         
    output_high(PIN_C5);
    delay_ms(2);
    output_low(PIN_C5);
   


    output_b(LED_MAP[d2]);         
    output_high(PIN_C6);
    delay_ms(2);
    output_low(PIN_C6);
   

    output_b(LED_MAP[d3]);         
    output_high(PIN_C7);
    delay_ms(2);
    output_low(PIN_C7);
   
  }


Ситуацията е следната - PIC16F886 XT 4MHz, индикацията е закачена на ПОРТ B, а анодите на порт C.
Симулацията в Протеус работи идеално, но на истинския процесор смесва трите цифри и не мохе да се разбере нищо :(
Опреснявам индикацията през 10мс

П.П

Интересното е че ако задам число с три еднакви цифри ( например 555) се изписва коректно.

Автор:  sthx [ Пет Май 15, 2009 6:50 am ]
Заглавие:  Re: Проблем с динамична индикация?

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

Автор:  Cekins [ Пет Май 15, 2009 9:44 am ]
Заглавие: 

1. Направи си опресняването да ти е на някой таймер и в прекъсване. Така времето ти ще е коректно и лесно за управление.
2. В самото опресняване реда на мислите трябва да е следния :
- изключваш всички аноди.
- зареждаш "следващата" цифра в портХ.
- включваш "следващия" анод.
- излизаш от опресняването (и чакаш следващо прекъсване).

Аз го правя с масиви и брояч за поредна цифра. Така после в програмата само зареждаш цифра 1,2,3 и т.н. Процедурата в прекъсването се грижи за всичко останало. Последния проект дето правих беше с 15 7сег. индикатора обаче ползвах 3 бр. последователно навързани 74НС595 и за анодите и за катодите. Транзисторите не съм имал нужда да ги чакам да се запушат, а ползвам ВС807. Само дето като имам повече от 7(8) цифри ги опреснявам по сегменти а не по цифри. Така времето за свете е 1/7 (1/8) зависи дали се ползва точка или не.

Автор:  BONGO [ Пет Май 15, 2009 9:59 am ]
Заглавие: 

Аз използвам Таймер 1 през RTOS и опреснявам през всеки 10мс, но пробвах и през 200мс - все същата работа.... най-ми е интерсно,защо Протеуса ми ги изписва коректно при емулация, Слагах допълнителни закъснявания,все така...
Почвам да си мисля че проблема е в харуера, може би ще си поиграя с резисторите в базите на транзисторите...

Автор:  sthx [ Пет Май 15, 2009 10:05 am ]
Заглавие: 

Прочети пак какво сме ти написали.
В случая на @Cekins няма нужда от изкуствено въвеждане на пауза между показване на разредите, защото има естествена такава - докато зареди 595.

Автор:  fan [ Пет Май 15, 2009 10:20 am ]
Заглавие: 

Колегите са ти описали всичко ,а ето и нещо по-практично:
Код:
.
.
.
.
#use rtos(timer=0, minor_cycle=1ms)
.
.
.
unsigned int8 const CmaxIndic = 3;

unsigned int8  CONST  LED_MAP[11] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0,0x10,0xFF};
unsigned int8  d1,d2,d3;
unsigned int16 a1 = 0;
.
.
.
#task(rate=5ms)
void Tasks_Indic( void )          // Подпрограма индикация LED
{
static unsigned int8 Temp_Indic = 0; 
           
    d1=a1/100;                         
    d2=(a1-100*d1)/10;             
    d3=(a1-100*d1-10*d2);         
   
   switch(Temp_Indic){
     case  0:               
      output_low(PIN_C7);
      delay_us(20);
      output_b(LED_MAP[d1]);
      output_high(PIN_C5);
      break;
     case  1:       
      output_low(PIN_C5);
      delay_us(20);
      output_b(LED_MAP[d2]);
      output_high(PIN_C6);
        break;   
      default:
      output_low(PIN_C6);
      delay_us(20);
        output_b(LED_MAP[d3]);         
      output_high(PIN_C7);
        break;
   }     
   Temp_Indic++;
   if(Temp_Indic >= CmaxIndic) Temp_Indic = 0;    
    
}
       
void main()
{
.
.
.
// TODO: USER CODE!!
   rtos_run();
}

Автор:  Cekins [ Пет Май 15, 2009 1:40 pm ]
Заглавие: 

Амчи естествено че ще ти светят, я огледай пак какво си написал в програмата!
За анодите ти трябва +V съответно би трябвало да ползваш PNP транзистори които съответно се отпушват с GND(нула). Та ти запушваш анодния транзистор пишеш каквото искаш и пак го отпушваш, като така всички анодни транзистори стоят отпушени, а се ззапушва само един баш когато точно на него искаш да покажеш нещо ...

Автор:  BONGO [ Пет Май 15, 2009 2:05 pm ]
Заглавие: 

аууууу,вярно! Как само съм се объркал.... :oops: :cry:
Всичко си дойде на мястото! Много благодаря на всички и се извинявам за глупавата грешка!
Продължавам по пътеката на пиковцете...

Автор:  relsys [ Пет Май 15, 2009 10:23 pm ]
Заглавие: 

BONGO написа:

Продължавам по пътеката на пиковцете...



не... не.... те пиковете са си като всички компютри, правят това което им кажеш а не което искаш ...... :P :P :P

Автор:  BONGO [ Пет Май 15, 2009 11:27 pm ]
Заглавие: 

Аз си ги обичам тях :D Виж след година- две съм заслужил титлата "П И К О Б О Р Е Ц" :idea:

Автор:  relsys [ Пет Май 15, 2009 11:49 pm ]
Заглавие: 

Направи една софра на Никола, той ти е и близо, и може и по-скоро да я получиш титлата :D :D :D

Автор:  BONGO [ Пет Май 15, 2009 11:59 pm ]
Заглавие: 

:D :D :D :D :D :D :D :D :D

Автор:  Nikola Kirov [ Съб Май 16, 2009 12:53 am ]
Заглавие: 

То съм разправял разни неща за пикоборците и ТКЗС-то. :):)
Ти си си Пикоборец. Не се притеснявай.
Самата титла е "Горд Пикоборец". Върха на пикоборското изкуство. Мечтата ма Мокрочипския мениджър по продажбите :):)
Но тя не се получава на софра а с цената на мнооооого мъки. Разбира се безсмислени. Но трябва и да си и природно доста тъп. Питай Румен как е достигнал висините :):):) Но подозирам че има и по напреднали от него в това изкуство. Може да сондираш за челен опит ;)

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