|
|
  |
Счетчик импульсов с выводом на 7-ми сегментный индикатор, Помогите, пожалуйста, создать схему |
|
|
|
Dec 16 2011, 20:46
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
И снова здравствуйте, уважаемые программисты! в неравном бою с CodeVisionAVR побеждает машина! Бился над ним 3 дня, вцелом, достиг некоторых успехов (это мое личное мнение), но голова уже трещит.. Помогите запустить этот счетчик, чтоб его.. В приложенном файле текст программы, которую удалось сложить из кусков разных программ и которая благополучно не работает (((((((((. Как его перетасовать, чтоб входные импульсы в ножки РА1 считасись МК и выводились на 3 розрядный 7 сегментный индикатор???  Вот последняя более-менее подходящая наработка
M4.rar ( 899 байт )
Кол-во скачиваний: 88 тут происходит индикация, но вторая и третья цифры при выводе одинаковы ((( помогите это исправить
Сообщение отредактировал shadow86 - Dec 16 2011, 22:09
|
|
|
|
|
Dec 17 2011, 20:34
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
вот исправил недочет, на который Вы мне указали, но все равно выводит не корректно (((((. Подскажите, пожалуйста, где бок?
Сообщение отредактировал shadow86 - Dec 18 2011, 07:25
|
|
|
|
|
Dec 18 2011, 07:28
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Спасибо всем за участие! Разобрался! Теперь счетчик выводит корректно. Добавить еще немного штрихов и можно запускать живую модель. ))) Извиняюсь за глупые вопросы и благодарен за помощь ))
|
|
|
|
|
Dec 18 2011, 18:45
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Уважаемые программисты, подскажите, пожалуйста, где мне (и что) добавить, чтоб программа считала импульсы в течение 46с и выдавала на индикатор последнее посчитанное значение, тоесть спустя 46с показало первый раз, а потом через 46с обновило показание и так далее. вот текст моей программы:
M4.rar ( 787 байт )
Кол-во скачиваний: 84
|
|
|
|
|
Dec 18 2011, 19:21
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(shadow86 @ Dec 18 2011, 22:45)  Уважаемые программисты, подскажите, пожалуйста, где мне (и что) добавить, чтоб программа считала импульсы в течение 46с и выдавала на индикатор последнее посчитанное значение, Для этого вам надо отсчитать 46 секунд. Единственное место у вас, где есть какая то известная периодичность - это динамическое сканирование индикатора (прерывание от таймера), вот в нем и отсчитывайте. Как насчитаете - копируйте накопленное значение счетчика в переменную, из которой и будете выводить на индикаторы, а счетчик сбрасывайте
|
|
|
|
|
Dec 19 2011, 11:03
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 24-01-06
Из: Ярославль
Пользователь №: 13 558

|
Цитата(shadow86 @ Dec 7 2011, 00:11)  чтоб во время счетного периода выводилось последнее посчитанное число импульсов, а не 1, 2, 3, .. и т.д. буферизуй индикацию регистрами-защелками (ИР24 или им подобными)по окончанию счета, и не надо микроконтроллера будет
--------------------
Разработка электронных устройств. Радиомонтаж. Ремонт оборудования в Ярославле i-link@bk.ru
|
|
|
|
|
Dec 23 2011, 13:31
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Попробывал соеденить один из выходов-катодов с еще одной ножкой-входом, чтоб считать изменения уровня на этой ножке и от него отталкиваясь, получить 46с задержки, но что-то опять не получается (( . . . PORTA.3 = 0; DDRA.3 = 0; PORTA.4 = 0; DDRA.4 = 0; ACSR = 0x80; #asm("sei"); while(1){ while (PINA.3 == 1) {counterProg++;} // регистрирую изменение уровня на входе РА3 (соединенного с одним из зажигаемых катодов индикатора) while (PINA.4 == 1){} //считаю импульсы {imp ++;} while (PINA.4 == 0){} if (imp >= 1000) { imp -= 1000; } if (counterProg == 10) { //обнуляю количество импульсов imp = 0; counterProg = 0;} IND_Conv(imp); //вывожу количество имп. за счетный период на индикатор }
|
|
|
|
|
Dec 23 2011, 14:05
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
вот вам легко говорить... у меня 0-й работает на динамическую индикацию. когда пытаюсь запустить 1-й, то фигня какая-то получается.. либо индикация отказывает, либо счет останавливается.. не могу победить пока что использование 2 счетчиков-таймеров одновременно (((
|
|
|
|
|
Dec 23 2011, 14:37
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
а как это должно выглядеть? у меня вынесена отдельная функция на динамику: void IND_Update(void) { static unsigned char count = 0;
PORT_K &= ~((1<<KAT1)|(1<<KAT2)|(1<<KAT3)); PORT_IND = data[count]; { if (count == 0) { PORT_K |= (0<<KAT1); PORT_K |= (1<<KAT2); PORT_K |= (1<<KAT3); } if (count == 1){ PORT_K |= (0<<KAT2); PORT_K |= (1<<KAT1); PORT_K |= (1<<KAT3); } if (count == 2) { PORT_K |= (0<<KAT3); PORT_K |= (1<<KAT1); PORT_K |= (1<<KAT2); } count++; if (count == 3) {count = 0;} } } допустим, я могу повышать еще некоторую переменную на ряду с count, а как потом мне ее значение вынести в тело основной программы?
|
|
|
|
|
Dec 24 2011, 08:40
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
M4.rar ( 953 байт )
Кол-во скачиваний: 71Вот моя программа Она считает импульсы на РА3 и выводит их количество на 3-х знаковый 7-ми сегментный индикатор.
|
|
|
|
|
Dec 27 2011, 09:28
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 12-11-09
Из: украина, г. харьков
Пользователь №: 53 585

|
Вот попробывал добавить функцию на счет некоторой переменной.. ПОМОГИТЕ ПОЖАЛУЙСТА!!! У меня уже фантазия иссякла
#include <tiny26.h>
unsigned char number[] = { 0x3f, //0 0x06, //1 0x5b, //2 0x4f, //3 0x66, //4 0x6d, //5 0x7d, //6 0x07, //7 0x7f, //8 0x6f //9 };
#define PORT_IND PORTB #define DDR_IND DDRB #define PORT_K PORTA #define DDR_K DDRA #define KAT1 0 #define KAT2 1 #define KAT3 2
volatile unsigned char data[3]; static unsigned int time; void IND_Init(void) { //порт, к которому подкл. сегменты PORT_IND = 0xff; DDR_IND = 0xff; //порт, к которому подкл. катод PORT_K &= ~((1<<KAT1)|(1<<KAT2)|(1<<KAT3)); DDR_K |= ((1<<KAT1)|(1<<KAT2)|(1<<KAT3));
data[0] = 0; data[1] = 0; data[2] = 0; }
void IND_Conv(unsigned int value) { unsigned char tmp0, tmp1, tmp2; tmp0=tmp1=0; while (value >= 100) { value -= 100; tmp0++; } while (value >= 10) { value -= 10; tmp1++; } tmp2 = value; data[0]=number[tmp0]; //вывод сотен data[1]=number[tmp1]; //вывод десятков data[2]=number[tmp2]; //вывод единиц }
void IND_Update(void) { static unsigned char count = 0; PORT_K &= ~((1<<KAT1)|(1<<KAT2)|(1<<KAT3)); PORT_IND = data[count]; { if (count == 0) { PORT_K |= (0<<KAT1); PORT_K |= (1<<KAT2); PORT_K |= (1<<KAT3); } if (count == 1){ PORT_K |= (0<<KAT2); PORT_K |= (1<<KAT1); PORT_K |= (1<<KAT3); } if (count == 2) { PORT_K |= (0<<KAT3); PORT_K |= (1<<KAT1); PORT_K |= (1<<KAT2); } count++; if (count == 3) {count = 0;} } }
int Wait (void) { time++; return time; } unsigned int imp = 0; void main( void ) { IND_Init(); //инициализация таймера Т0 //частота прерываний 50Гц при частоте кварца 4МГц TIMSK = (1<<TOIE0); TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00); TCNT0 = 0xb2; PORTA.3 = 1; DDRA.3 = 0; TCCR1A = (1<<CS13)|(0<<CS12)|(0<<CS11)|(1<<CS10); TCNT1 = 0x00; #asm("sei"); while(1){ while (PINA.3 == 1){} {imp ++;} while (PINA.3 == 0){} if (imp >= 1000) { imp -= 1000; }
IND_Conv(imp); if (Wait()>=10){ time=0; imp=0;} } }
//прерывания таймера Т0 - вывод на индикатор interrupt [TIM0_OVF] void Timer0Ovf(void) { TCNT0 = 0xb2; IND_Update(); Wait(); }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|