Отговори на тема  [ 13 мнения ] 
Проблем с динамична индикация? 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Сря Ное 10, 2004 1:06 am
Мнения: 161
Местоположение: Нова Загора
Мнение Проблем с динамична индикация?
Имам голям проблем с 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) се изписва коректно.


Пет Май 15, 2009 1:17 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Съб Юни 24, 2006 8:25 pm
Мнения: 2292
Мнение Re: Проблем с динамична индикация?
Трябва да имаш пауза между показването на отделните разряди, за да се осигури време за запушване на транзисторите. Допълнително можеш да им помогнеш с подходящи резистори. Иначе се получава пренос на знака към предишния сегмент.

_________________
Две плюс две е приблизително равно на четири. Факт!


Пет Май 15, 2009 6:50 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
1. Направи си опресняването да ти е на някой таймер и в прекъсване. Така времето ти ще е коректно и лесно за управление.
2. В самото опресняване реда на мислите трябва да е следния :
- изключваш всички аноди.
- зареждаш "следващата" цифра в портХ.
- включваш "следващия" анод.
- излизаш от опресняването (и чакаш следващо прекъсване).

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


Пет Май 15, 2009 9:44 am
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

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


Пет Май 15, 2009 9:59 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Съб Юни 24, 2006 8:25 pm
Мнения: 2292
Мнение 
Прочети пак какво сме ти написали.
В случая на @Cekins няма нужда от изкуствено въвеждане на пауза между показване на разредите, защото има естествена такава - докато зареди 595.

_________________
Две плюс две е приблизително равно на четири. Факт!


Пет Май 15, 2009 10:05 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 13, 2007 12:12 pm
Мнения: 712
Мнение 
Колегите са ти описали всичко ,а ето и нещо по-практично:
Код:
.
.
.
.
#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();
}


Пет Май 15, 2009 10:20 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Амчи естествено че ще ти светят, я огледай пак какво си написал в програмата!
За анодите ти трябва +V съответно би трябвало да ползваш PNP транзистори които съответно се отпушват с GND(нула). Та ти запушваш анодния транзистор пишеш каквото искаш и пак го отпушваш, като така всички анодни транзистори стоят отпушени, а се ззапушва само един баш когато точно на него искаш да покажеш нещо ...


Пет Май 15, 2009 1:40 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Сря Ное 10, 2004 1:06 am
Мнения: 161
Местоположение: Нова Загора
Мнение 
аууууу,вярно! Как само съм се объркал.... :oops: :cry:
Всичко си дойде на мястото! Много благодаря на всички и се извинявам за глупавата грешка!
Продължавам по пътеката на пиковцете...


Пет Май 15, 2009 2:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
BONGO написа:

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



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


Пет Май 15, 2009 10:23 pm
Профил ICQ WWW
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Сря Ное 10, 2004 1:06 am
Мнения: 161
Местоположение: Нова Загора
Мнение 
Аз си ги обичам тях :D Виж след година- две съм заслужил титлата "П И К О Б О Р Е Ц" :idea:


Пет Май 15, 2009 11:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
Направи една софра на Никола, той ти е и близо, и може и по-скоро да я получиш титлата :D :D :D


Пет Май 15, 2009 11:49 pm
Профил ICQ WWW
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Сря Ное 10, 2004 1:06 am
Мнения: 161
Местоположение: Нова Загора
Мнение 
:D :D :D :D :D :D :D :D :D


Пет Май 15, 2009 11:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Съб Май 16, 2009 12:53 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 13 мнения ] 

Кой е на линия

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


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

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