dio 0 24 июня, 2007 Опубликовано 24 июня, 2007 (изменено) · Жалоба Приветствую! Илектронный циферблат с 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, не мог втыкнуть по другому. Изменено 24 июня, 2007 пользователем dio Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 24 июня, 2007 Опубликовано 24 июня, 2007 · Жалоба циферблат с 4мя 7ми-сегментными цифрами (в будущем будет часами) реализую с помощью динамики в IAR следующим образом: А почему бы не сделать макет устройства и не проверять на нем? Если вам интересен конечный результат - т.е. часы, то зачем тратить время на протеус? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 24 июня, 2007 Опубликовано 24 июня, 2007 · Жалоба 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 музыцировали? :) Помоему эта ария оттуда. Я сегодня сделаю что-то подобное. Отлажу и выложу сюда. Ждите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vooon 0 24 июня, 2007 Опубликовано 24 июня, 2007 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dio 0 24 июня, 2007 Опубликовано 24 июня, 2007 (изменено) · Жалоба А почему бы не сделать макет устройства и не проверять на нем? На данный момент нет такой возможности. Что касается Proteus, то время уже потрачено. Кроме того это нужно для следующих проэктов, где макет будет сложно себе позволить. :07: Вот это круто. :) Я бы не додумался. Вы наверное раньше на PIC музыцировали? :) Если честно, не понял, в каком смысле? PIC в глаза не видел :( Извиняюсь, забыл пояснить, что циферблатом является самодельная светодиодная панель, хотя это особо не меняет дела. Изменено 24 июня, 2007 пользователем dio Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dio 0 24 июня, 2007 Опубликовано 24 июня, 2007 · Жалоба vooon спасибо за идею, но хотел бы заострить внимание на суть самого вопроса: способен ли Proteus воспроизвести реально динамическую индикацию? Если да, то как ? Ну а если нет, тогда кто может ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба vooon спасибо за идею, но хотел бы заострить внимание на суть самого вопроса: способен ли Proteus воспроизвести реально динамическую индикацию? Если да, то как ? Ну а если нет, тогда кто может ? Года два назад пытался ради интереса смоделировать динамическую индикацию в Proteus'е, долго мучился, так ничего и не получилось. На макетке же все работало на ура. Как Вам и посоветовал уважаемый defunct, не тратьте зря время на протеус (ИМХО это игрушка), а спаяйте реальное железо. Вот, можно здесь почитать по протеусу. Что касается Proteus, то время уже потрачено. Не продолжайте его тратить зря... Хотя не совсем зря... Какой-то опыт все-равно будет. Кроме того это нужно для следующих проэктов, где макет будет сложно себе позволить. :07: Ну так не годится (ИМХО). Нужно собрать нормальную макетку, либо купить готовую и отлаживать на ней софт, железо. Все равно же в конечном счете придется проверять наработки на готовом железе. И наверняка при переносе проекта с протеуса на реальное железо возникнут не легко устраняемые баги. Если честно, не понял, в каком смысле? 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 микроконтроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба В первом приближении написал. Отлажу завтра, а то у меня чё-то с железом. Понять не могу. По ходу не те транзисторы запаяли. main.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vooon 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба способен ли Proteus воспроизвести реально динамическую индикацию? Если да, то как ? Ну а если нет, тогда кто может ? один раз мне удалось - увеличил шаг времени, и стало показывать все сегменты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndryG 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба Нормально Протеус с динамической индикацией работает ... увеличить нужно время реакции у индикаторов и усё работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dio 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба Нормально Протеус с динамической индикацией работает ... увеличить нужно время реакции у индикаторов и усё работает. прекрасно, но к сожалению этой настройки нет в 7SEG-COM-CAT компоненте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба В принципе то что я выложил вчера без проверки - работает, но ошибки в инициализации таймеров. Короче в голове. Если сравните сегодняшнюю, то увидите их. :) Несколько переписал для удобства. Теперь можно выводить в двух режимах часы:мин и мин:сек. У меня это, естественно, не часы, а, собственно таймер, но принцип понятен. Если надо схему, чтобы понять что к чему, - стучи - выложу. Прога рабочая. Я её проверил. Очень опытный паяльщик оказался. :) Сходу нашёл ошибку в верхнем ключе, и исправил. :) В результате вместо КП505 были запаяны КТ3107. Резисторы поменяны. Ну и в завершение ЕН-ка запаяна раком. После восстановления схемы - всё заработало. :) Да кстати ещё один вариант вот здесь лежит http://nix-06.nm.ru/ main.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bodja74 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба vooon спасибо за идею, но хотел бы заострить внимание на суть самого вопроса: способен ли Proteus воспроизвести реально динамическую индикацию? Если да, то как ? Ну а если нет, тогда кто может ? Кто или что может? :) Я и протеус тоже это может :):):) Вообже динамика у протеуса работает немного так сказать кривовато. Суть в том что перед засвечиванием следующего сегмента необходимо 1 запереть порты ( DDR) 2 сформировать новую засветку 3 переключить следующий сегмент 4 открыть порты 5 сделать небольшую паузу и томже духе следующий сегмент. В реале работает и без открывания\запирания портов ,так как время нитожно мало ,а протеус реагирует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Diman_ 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба Динамика в протеусе отлично (в целях отладки) работает. Надо только использовать дисплеи а не светодиодные модели. В настройках дисплея ставится время minimum trigger time. А светодиоды вообще симуляцию вешают, вместо них лучше пользоваться LOGICSTATE ( в место одиночного светодиода), и вообще как почти во всех симуляторах проще и быстрей работает с примитивами. Можете посмотреть на модель моих часов для версии протеуса6,95 http://startcd.narod.ru/clock/proteus16n.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 25 июня, 2007 Опубликовано 25 июня, 2007 · Жалоба На мой взгляд это со всей очевидностью показывает малоэффективность таких сред. Фактически данную задачу, даже с попутной отладкой железа я выполнил за 3 часа вместе с написание проги с нуля. Я уже не говорю сколько времени займёт нормальное изучение того же протеуса. Создание проекта и модели конкретного устр-ва. Плюс разработка уникальных компонентов. Возникает вопрос - зачем? Простейшие устр-ва делаются на раз. А более сложные фактически не поддаются моделированию. По-моему мнению эффективность того же JTAGа во много раз выше! Самое дорогое - это Ваше время. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться