| Автор |
Съобщение |
|
BONGO
Ранг: Новодошъл
Регистриран на: Сря Ное 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 |
|
 |
|
sthx
Ранг: Форумен бог
Регистриран на: Съб Юни 24, 2006 8:25 pm Мнения: 2292
|
 Re: Проблем с динамична индикация?
Трябва да имаш пауза между показването на отделните разряди, за да се осигури време за запушване на транзисторите. Допълнително можеш да им помогнеш с подходящи резистори. Иначе се получава пренос на знака към предишния сегмент.
_________________ Две плюс две е приблизително равно на четири. Факт!
|
| Пет Май 15, 2009 6:50 am |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 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 |
|
 |
|
BONGO
Ранг: Новодошъл
Регистриран на: Сря Ное 10, 2004 1:06 am Мнения: 161 Местоположение: Нова Загора
|
Аз използвам Таймер 1 през RTOS и опреснявам през всеки 10мс, но пробвах и през 200мс - все същата работа.... най-ми е интерсно,защо Протеуса ми ги изписва коректно при емулация, Слагах допълнителни закъснявания,все така...
Почвам да си мисля че проблема е в харуера, може би ще си поиграя с резисторите в базите на транзисторите...
|
| Пет Май 15, 2009 9:59 am |
|
 |
|
sthx
Ранг: Форумен бог
Регистриран на: Съб Юни 24, 2006 8:25 pm Мнения: 2292
|
Прочети пак какво сме ти написали.
В случая на @Cekins няма нужда от изкуствено въвеждане на пауза между показване на разредите, защото има естествена такава - докато зареди 595.
_________________ Две плюс две е приблизително равно на четири. Факт!
|
| Пет Май 15, 2009 10:05 am |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 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 |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Амчи естествено че ще ти светят, я огледай пак какво си написал в програмата!
За анодите ти трябва +V съответно би трябвало да ползваш PNP транзистори които съответно се отпушват с GND(нула). Та ти запушваш анодния транзистор пишеш каквото искаш и пак го отпушваш, като така всички анодни транзистори стоят отпушени, а се ззапушва само един баш когато точно на него искаш да покажеш нещо ...
|
| Пет Май 15, 2009 1:40 pm |
|
 |
|
BONGO
Ранг: Новодошъл
Регистриран на: Сря Ное 10, 2004 1:06 am Мнения: 161 Местоположение: Нова Загора
|
аууууу,вярно! Как само съм се объркал....
Всичко си дойде на мястото! Много благодаря на всички и се извинявам за глупавата грешка!
Продължавам по пътеката на пиковцете...
|
| Пет Май 15, 2009 2:05 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
|
| Пет Май 15, 2009 10:23 pm |
|
 |
|
BONGO
Ранг: Новодошъл
Регистриран на: Сря Ное 10, 2004 1:06 am Мнения: 161 Местоположение: Нова Загора
|
Аз си ги обичам тях  Виж след година- две съм заслужил титлата "П И К О Б О Р Е Ц" 
|
| Пет Май 15, 2009 11:27 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
|
| Пет Май 15, 2009 11:49 pm |
|
 |
|
BONGO
Ранг: Новодошъл
Регистриран на: Сря Ное 10, 2004 1:06 am Мнения: 161 Местоположение: Нова Загора
|
|
| Пет Май 15, 2009 11:59 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
То съм разправял разни неща за пикоборците и ТКЗС-то.  :)
Ти си си Пикоборец. Не се притеснявай.
Самата титла е "Горд Пикоборец". Върха на пикоборското изкуство. Мечтата ма Мокрочипския мениджър по продажбите  :)
Но тя не се получава на софра а с цената на мнооооого мъки. Разбира се безсмислени. Но трябва и да си и природно доста тъп. Питай Румен как е достигнал висините  :):) Но подозирам че има и по напреднали от него в това изкуство. Може да сондираш за челен опит 
|
| Съб Май 16, 2009 12:53 am |
|
|