|
Динамическая Индикация + Proteus VSM 7, Совместимы ли, че не так делаю ? |
|
|
|
Jun 24 2007, 14:18
|

Участник

Группа: Новичок
Сообщений: 40
Регистрация: 4-06-06
Пользователь №: 17 766

|
Приветствую! Илектронный циферблат с 4мя 7ми-сегментными цифрами (в будущем будет часами) реализую с помощью динамики в IAR следующим образом: Код #define byte unsigned char #define dynIndexingTime 20000 #define MaxValue 50
#define CharCodeBusDDR DDRB #define CharCodeBus PORTB #define kathodBusDDR DDRD #define kathodBus PORTD
void my_putChar(byte ind); byte charTable(byte ind);
byte N1,N10,N100,N1000;
int main( void ) { int counter,ind; CharCodeBusDDR=0xFF; kathodBusDDR=0x0F;
kathodBus=0xFE;
N1=0; N10=0; N100=0; N1000=0;
counter=0; ind=0;
for(;;) { counter++;
if (counter > MaxValue) { counter=0; N1++; if (N1>9) { N1=0; N10++; } if (N10>9) { N10=0; N100++; } if (N100>9) { N100=0; N1000++; } if (N1000>9){ N1000=0; } }
if (ind==4) ind=0; my_putChar(ind++);
__delay_cycles(dynIndexingTime); // Wait
kathodBus=~((~kathodBus)<<1); if (kathodBus==0xEF) kathodBus=0xFE;
}
}
void my_putChar(byte ind) //ind->index "0" -> N1,singles '1'->N10,decades '2'->N100,hundreds '3'->N1000,thousands { if (ind==0) CharCodeBus =charTable(N1); else if (ind==1) CharCodeBus =charTable(N10); else if (ind==2) CharCodeBus =charTable(N100); else if (ind==3) CharCodeBus =charTable(N1000); }
byte charTable(byte ind) { switch(ind) { case 0: return 0x3F; case 1: return 0x06; case 2: return 0x5B; case 3: return 0x4F; case 4: return 0x66; case 5: return 0x6D; case 6: return 0x7D; case 7: return 0x07; case 8: return 0x7F; case 9: return 0x6F; } return 0x01; } Результаты в Proteusе не соответствуют ожидаемым. Подскажите пжста в чем проблема, может какие настройки специальные в Proteusе или напутал чего? Благодарю зарание ! Hex File Proteus 7 fileИзвиняюсь за Rapidshare, не мог втыкнуть по другому.
Сообщение отредактировал dio - Jun 24 2007, 14:06
|
|
|
|
|
Jun 24 2007, 21:32
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
http://nix-06.nm.ru/Primer_c/Primer_c_1.htmlправда я теперь делаю немного подругому: определил один раз хедер, теперь использую  Код /******************************************************************************* * Digits.h ******************************************************************************/
#ifndef DIGITS_H #define DIGITS_H
// segment bit def #define DIGIT_0 0 #ifndef DIGIT_H #define DIGIT_H (1<<7) #define DIGIT_G (1<<6) #define DIGIT_F (1<<5) #define DIGIT_E (1<<4) #define DIGIT_D (1<<3) #define DIGIT_C (1<<2) #define DIGIT_B (1<<1) #define DIGIT_A (1<<0) #endif // ifndef DIGIT_H
/* NAME A | B | C | D | E | F | G | H(dp) /* comment */ #define CG_0 DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_D | DIGIT_E | DIGIT_F | DIGIT_0 | DIGIT_0 /* 00, 0 */ #define CG_1 DIGIT_0 | DIGIT_B | DIGIT_C | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 /* 01, 1 */ #define CG_2 DIGIT_A | DIGIT_B | DIGIT_0 | DIGIT_D | DIGIT_E | DIGIT_0 | DIGIT_G | DIGIT_0 /* 02, 2 */ #define CG_3 DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_D | DIGIT_0 | DIGIT_0 | DIGIT_G | DIGIT_0 /* 03, 3 */ #define CG_4 DIGIT_0 | DIGIT_B | DIGIT_C | DIGIT_0 | DIGIT_0 | DIGIT_F | DIGIT_G | DIGIT_0 /* 04, 4 */ #define CG_5 DIGIT_A | DIGIT_0 | DIGIT_C | DIGIT_D | DIGIT_0 | DIGIT_F | DIGIT_G | DIGIT_0 /* 05, 5 */ #define CG_6 DIGIT_A | DIGIT_0 | DIGIT_C | DIGIT_D | DIGIT_E | DIGIT_F | DIGIT_G | DIGIT_0 /* 06, 6 */ #define CG_7 DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 /* 07, 7 */ #define CG_8 DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_D | DIGIT_E | DIGIT_F | DIGIT_G | DIGIT_0 /* 08, 8 */ #define CG_9 DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_D | DIGIT_0 | DIGIT_F | DIGIT_G | DIGIT_0 /* 09, 9 */ #define CG_A DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_0 | DIGIT_E | DIGIT_F | DIGIT_G | DIGIT_0 /* 10, A */ #define CG_B DIGIT_0 | DIGIT_0 | DIGIT_C | DIGIT_D | DIGIT_E | DIGIT_F | DIGIT_G | DIGIT_0 /* 11, B */ #define CG_C DIGIT_A | DIGIT_0 | DIGIT_0 | DIGIT_D | DIGIT_E | DIGIT_F | DIGIT_0 | DIGIT_0 /* 12, C */ #define CG_D DIGIT_0 | DIGIT_B | DIGIT_C | DIGIT_D | DIGIT_E | DIGIT_0 | DIGIT_G | DIGIT_0 /* 13, D */ #define CG_E DIGIT_A | DIGIT_0 | DIGIT_0 | DIGIT_D | DIGIT_E | DIGIT_F | DIGIT_G | DIGIT_0 /* 14, E */ #define CG_F DIGIT_A | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_E | DIGIT_F | DIGIT_G | DIGIT_0 /* 15, F */ #define CG_c DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_D | DIGIT_E | DIGIT_0 | DIGIT_G | DIGIT_0 /* 16, c */ #define CG_g DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_D | DIGIT_0 | DIGIT_F | DIGIT_G | DIGIT_0 /* 17, g */ #define CG_h DIGIT_0 | DIGIT_0 | DIGIT_C | DIGIT_0 | DIGIT_E | DIGIT_F | DIGIT_G | DIGIT_0 /* 18, h */ #define CG_H DIGIT_0 | DIGIT_B | DIGIT_C | DIGIT_0 | DIGIT_E | DIGIT_F | DIGIT_G | DIGIT_0 /* 19, H */ #define CG_J DIGIT_0 | DIGIT_B | DIGIT_C | DIGIT_D | DIGIT_E | DIGIT_0 | DIGIT_0 | DIGIT_0 /* 20, J */ #define CG_L DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_D | DIGIT_E | DIGIT_F | DIGIT_0 | DIGIT_0 /* 21, L */ #define CG_n DIGIT_0 | DIGIT_0 | DIGIT_C | DIGIT_0 | DIGIT_E | DIGIT_0 | DIGIT_G | DIGIT_0 /* 22, n */ #define CG_N DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_0 | DIGIT_E | DIGIT_F | DIGIT_0 | DIGIT_0 /* 23, n_up */ #define CG_o DIGIT_0 | DIGIT_0 | DIGIT_C | DIGIT_D | DIGIT_E | DIGIT_0 | DIGIT_G | DIGIT_0 /* 24, o */ #define CG_P DIGIT_A | DIGIT_B | DIGIT_0 | DIGIT_0 | DIGIT_E | DIGIT_F | DIGIT_G | DIGIT_0 /* 25, P */ #define CG_q DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_0 | DIGIT_0 | DIGIT_F | DIGIT_G | DIGIT_0 /* 26, q */ #define CG_r DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_E | DIGIT_0 | DIGIT_G | DIGIT_0 /* 27, r */ #define CG_S DIGIT_A | DIGIT_0 | DIGIT_C | DIGIT_D | DIGIT_0 | DIGIT_F | DIGIT_G | DIGIT_0 /* 28, S */ #define CG_t DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_D | DIGIT_E | DIGIT_F | DIGIT_G | DIGIT_0 /* 29, t */ #define CG_U DIGIT_0 | DIGIT_B | DIGIT_C | DIGIT_D | DIGIT_E | DIGIT_F | DIGIT_0 | DIGIT_0 /* 30, U */ #define CG_y DIGIT_0 | DIGIT_B | DIGIT_C | DIGIT_D | DIGIT_0 | DIGIT_F | DIGIT_G | DIGIT_0 /* 31, y */ #define CG_MINUS DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_G | DIGIT_0 /* 32, - */ #define CG_OPEN DIGIT_A | DIGIT_0 | DIGIT_0 | DIGIT_D | DIGIT_E | DIGIT_F | DIGIT_0 | DIGIT_0 /* 33, [ */ #define CG_CLOSE DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_D | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 /* 34, ] */ #define CG_LOW DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_D | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 /* 35, _ */ #define CG_GRAD DIGIT_A | DIGIT_B | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_F | DIGIT_G | DIGIT_0 /* 36, ╟ */ #define CG_LAMBDA DIGIT_A | DIGIT_B | DIGIT_C | DIGIT_0 | DIGIT_E | DIGIT_0 | DIGIT_G | DIGIT_0 /* 37, lambda */ #define CG_NONE DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 | DIGIT_0 /* 38, none */
#endif // ifndef DIGITS_H
|
|
|
|
|
Jun 24 2007, 21:48
|

Участник

Группа: Новичок
Сообщений: 40
Регистрация: 4-06-06
Пользователь №: 17 766

|
Цитата(defunct @ Jun 24 2007, 17:56)  А почему бы не сделать макет устройства и не проверять на нем? На данный момент нет такой возможности. Что касается Proteus, то время уже потрачено. Кроме того это нужно для следующих проэктов, где макет будет сложно себе позволить. Цитата(SasaVitebsk @ Jun 24 2007, 23:01)  Вот это круто.  Я бы не додумался. Вы наверное раньше на PIC музыцировали?  Если честно, не понял, в каком смысле? PIC в глаза не видел  Извиняюсь, забыл пояснить, что циферблатом является самодельная светодиодная панель, хотя это особо не меняет дела.
Сообщение отредактировал dio - Jun 24 2007, 21:39
|
|
|
|
|
Jun 25 2007, 00:06
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(dio @ Jun 25 2007, 06:57)  vooon
спасибо за идею, но хотел бы заострить внимание на суть самого вопроса: способен ли Proteus воспроизвести реально динамическую индикацию? Если да, то как ? Ну а если нет, тогда кто может ? Года два назад пытался ради интереса смоделировать динамическую индикацию в Proteus'е, долго мучился, так ничего и не получилось. На макетке же все работало на ура. Как Вам и посоветовал уважаемый defunct, не тратьте зря время на протеус (ИМХО это игрушка), а спаяйте реальное железо. Вот, можно здесь почитать по протеусу. Цитата(dio @ Jun 25 2007, 05:48)  Что касается Proteus, то время уже потрачено. Не продолжайте его тратить зря... Хотя не совсем зря... Какой-то опыт все-равно будет. Цитата(dio @ Jun 25 2007, 05:48)  Кроме того это нужно для следующих проэктов, где макет будет сложно себе позволить.  Ну так не годится (ИМХО). Нужно собрать нормальную макетку, либо купить готовую и отлаживать на ней софт, железо. Все равно же в конечном счете придется проверять наработки на готовом железе. И наверняка при переносе проекта с протеуса на реальное железо возникнут не легко устраняемые баги. Цитата(dio @ Jun 25 2007, 05:48)  Если честно, не понял, в каком смысле? PIC в глаза не видел  Реализация этого: Код byte charTable(byte ind) { switch(ind) { case 0: return 0x3F; case 1: return 0x06; case 2: return 0x5B; case 3: return 0x4F; case 4: return 0x66; case 5: return 0x6D; case 6: return 0x7D; case 7: return 0x07; case 8: return 0x7F; case 9: return 0x6F; } return 0x01; } сильно напоминает программирвоание МК PIC на ассемблере. Подобным образом описывались таблицы, из которых можно было извлечь число, местоположение которого определялось смещением, записанным в регистр w микроконтроллера.
--------------------
Выбор.
|
|
|
|
|
Jun 25 2007, 00:29
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
Цитата(dio @ Jun 25 2007, 02:57)  способен ли Proteus воспроизвести реально динамическую индикацию? Если да, то как ? Ну а если нет, тогда кто может ? один раз мне удалось - увеличил шаг времени, и стало показывать все сегменты.
|
|
|
|
|
Jun 25 2007, 08:09
|

Участник

Группа: Новичок
Сообщений: 40
Регистрация: 4-06-06
Пользователь №: 17 766

|
Цитата(AndryG @ Jun 25 2007, 07:35)  Нормально Протеус с динамической индикацией работает ... увеличить нужно время реакции у индикаторов и усё работает. прекрасно, но к сожалению этой настройки нет в 7SEG-COM-CAT компоненте
|
|
|
|
|
Jun 25 2007, 19:21
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
В принципе то что я выложил вчера без проверки - работает, но ошибки в инициализации таймеров. Короче в голове. Если сравните сегодняшнюю, то увидите их.  Несколько переписал для удобства. Теперь можно выводить в двух режимах часы:мин и мин:сек. У меня это, естественно, не часы, а, собственно таймер, но принцип понятен. Если надо схему, чтобы понять что к чему, - стучи - выложу. Прога рабочая. Я её проверил. Очень опытный паяльщик оказался.  Сходу нашёл ошибку в верхнем ключе, и исправил.  В результате вместо КП505 были запаяны КТ3107. Резисторы поменяны. Ну и в завершение ЕН-ка запаяна раком. После восстановления схемы - всё заработало.  Да кстати ещё один вариант вот здесь лежит http://nix-06.nm.ru/
Прикрепленные файлы
main.zip ( 2.14 килобайт )
Кол-во скачиваний: 64
|
|
|
|
|
Jun 25 2007, 19:21
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(dio @ Jun 25 2007, 01:57)  vooon
спасибо за идею, но хотел бы заострить внимание на суть самого вопроса: способен ли Proteus воспроизвести реально динамическую индикацию? Если да, то как ? Ну а если нет, тогда кто может ? Кто или что может?  Я и протеус тоже это может    Вообже динамика у протеуса работает немного так сказать кривовато. Суть в том что перед засвечиванием следующего сегмента необходимо 1 запереть порты ( DDR) 2 сформировать новую засветку 3 переключить следующий сегмент 4 открыть порты 5 сделать небольшую паузу и томже духе следующий сегмент. В реале работает и без открывания\запирания портов ,так как время нитожно мало ,а протеус реагирует.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|