Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.59/54: Рейтинг темы: голосов - 54, средняя оценка - 4.59
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
1

Вывод точки 7-сег индикации(Решено)+ проблема с датчиком

13.11.2012, 15:16. Просмотров 9868. Ответов 27
Метки нет (Все метки)

Решенная проблема
Всем привет. Пишу программу для блока питания: вольтметр на 40В ,амперметр 3А. Семи сегментная индикация на регистрах 74hc164. Не могу понять как вывести ТОЧКУ для амперметра в первом разряде, для вольтметра во втором.
Подскажите, заранее спасибо.

Новая проблема с ШИМ
Решил добавить датчик температуры DS18B20 для контроля температуры стабилизатора LM2576T, и вентилятор, скорость которого должна упростятся ШИМом в соответствии с температурой. Но при работе с ШИМом всё начинает сильно тормозить, т.е. например частота переключение разрядов индикации становиться очень низкая. Уверен проблема пустяковая, но опыта у меня маловато. Помогите правильно сконфигурированный ШИМ, заранее спасибо!



[140.81 Кб]
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2012, 15:16
Ответы с готовыми решениями:

Проблема с датчиком HC-SR04
Подсоединил 2 пина: GND к земле и VCC к +5В. Как я понял датчик управляется высоким уровнем в...

Проблема с датчиком холла ДХК-05
Здравствуйте. Есть у меня с десяток таких вот совецких датчиков ДХК-05. Представляет он из себя...

Стиральная машина Bosch WAS20443OE/14, Проблема с 3D датчиком
Кто-нибудь пытался отремонтировать 3D датчик? Машина с ним периодически не включается. ...

ASUS P5LD2 SE - проблема с датчиком температуры CPU
Машина вырубаеться каждые 15-25 секунд после нажатия кнопки Power. В БИОСЕ показывает темп ЦП 105...

сма Electrolux EWM-09, проблема индикации E-91
силовой рабочий 100% запустил от другой индикации . проблема в индикации при нажатии на...

27
Otikzzz
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
13.11.2012, 15:48 2
В функциях volt_prymt и amper_prymt введите в параметрах флаг, что нужно зажечь точку и если он выставлен, выключайте 0-й бит buf[data], а в нужном кейсе (в прерывания таймера) передавайте флаг в функцию.
А ещё у вас конфликт уровней на скрине.
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
13.11.2012, 16:02 3
Цитата Сообщение от Otykzzz
А ещё у вас конфликт уровней на скрине.
Да я знаю, резистор не поставил)
Цитата Сообщение от Otykzzz
В функциях volt_prymt и amper_prymt введите в параметрах флаг, что нужно зажечь точку и если он выставлен, выключайте 0-й бит buf[data], а в нужном кейсе (в прерывания таймера) передавайте флаг в функцию.
а можно кусок кода для наглядности, я пока не очень силён
0
worobo
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 81
13.11.2012, 16:20 4
В нужным разряде зажечь сегмент DP.
(символ) &=~(1<<7);
0
13.11.2012, 16:20
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
13.11.2012, 17:09 5
Вот здесь подобное обсуждалось, может натолкнет на решение.
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
13.11.2012, 18:43 6
И вроде разобрался как надо сделать, сделал , а не работает
выводи в первый разряд 0 и всё!
Код
char buf[] = {                                                     //массив с цифрами
0b00000011, //0
0b10011111, //1
0b00100101, //2
0b00001101, //3
0b10011001, //4
0b01001001, //5
0b01000001, //6
0b00011111, //7
0b00000001, //8
0b00001001, //9
0b11111110, //.
};

void amper_prymt(unsykned char data){                              //Функция вывода тока
int i;
for(i=0; i<8; i++){                                               //Цикл для вывода 8 бит данных из массива
PORTD.0 = buf[data] & 1<<i ;                                    //Выводим в линию DATA текущий бит
PORTD.1=0;                                                      //Опускаем линию CLK в лог.0
PORTD.1=1;                                                      //Поднимаем линию CLK в лог.1
}
}

void volt_prymt (unsykned char data){                              //Функция вывода напряжение
int i;
for( i=0; i<8; i++){                                              //Цикл для вывода 8 бит данных из массива
PORTD.6 = buf[data] &  1<<i;                                    //Выводим в линию DATA текущий бит
PORTD.7=0;                                                      //Опускаем линию CLK в лог.0
PORTD.7=1;                                                      //Поднимаем линию CLK в лог.1
}
}
interrupt [TIM2_OVF] void timer2_ovf_isr(void)                     //Прерывание по переполнению таймера счётчика 2
{
switch (cur_dig)                                                   //Выводим ток и напряжение
{
case 0: {PORTD.3=0; PORTD.4=0; PORTD.2=0;                          //Первый разряд
amper_prymt( (amper_out % 10000 / 1000) & 0<<7);        //!!!!!!!!!!!!Я это понимаю так!!!!!!!!!!!!!!!!!
volt_prymt ( volt_out % 100000 / 10000);
PORTD.2=1; delay_ms(5); briok;};

case 1: {PORTD.2=0; PORTD.4=0; PORTD.3=0;                          //Второй разряд
amper_prymt( amper_out % 1000 / 100);
volt_prymt ( volt_out % 10000 / 1000);
PORTD.3=1;delay_ms(5); briok;};

case 2: {PORTD.2=0; PORTD.3=0; PORTD.4=0;                          //Третий разряд
amper_prymt( amper_out % 100 / 10);
volt_prymt ( volt_out % 1000 / 100);
PORTD.4=1; delay_ms(5);  briok;};
}
if (( cur_dig++) > 3)  cur_dig = 0;
}
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
13.11.2012, 19:07 7
Код
case 0: {PORTD.3=0; PORTD.4=0; PORTD.2=0;                          //Первый разряд
amper_prymt( (amper_out % 10000 / 1000) & 0<<7);        //!!!!!!!!!!!!Я это понимаю так!!!!!!!!!!!!!!!!!
volt_prymt ( volt_out % 100000 / 10000);
PORTD.2=1; delay_ms(5); briok;};
Не туда добавляете бит точки. Вы просто в data дописываете бит 7. А data - это индекс массива цифр. И все у вас летит наперекосяк.
Добавлять нужно в
Код
void amper_prymt(unsykned char data){                              //Функция вывода тока
unsykned char  temp;
if (curr_dig == 0)                    // это если в первом знакоместе
{
temp = buf[data] & ~(1<<7);      // берем символ из массива и добавляем бит точки
}
else
{
temp = buf[data];                      // иначе - не трогаем ничего, берем символ из массива
}
for(unsykned char i=0; i<8; i++){                                               //Цикл для вывода 8 бит данных из массива

PORTD.0 = temp & 1<<i ;                                    //Выводим в линию DATA текущий бит
PORTD.1=0;                                                      //Опускаем линию CLK в лог.0
PORTD.1=1;                                                      //Поднимаем линию CLK в лог.1
}
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
13.11.2012, 19:34 8
ну да, точно)
Финский большое спасибо, выручили
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
13.11.2012, 19:41 9
ORV, а вы тот ORV, который arv.rodyoliga.com и symple-divices.ru или однофамилец? :)
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
13.11.2012, 19:54 10
Цитата Сообщение от Финский
offtop
ORV, а вы тот ORV, который arv.rodyoliga.com и symple-divices.ru или однофамилец? :)
Нет, это совпадение)
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
13.11.2012, 20:58 11
ORV, а почему бы не соединить регистры последовательно ?
Сэкономим один корпус и кучу выводов .
Да и вешать общие выводы индикаторов на пин AVR это как то по садистки выглядит.
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
13.11.2012, 21:06 12
Цитата Сообщение от dosykus_2
Сэкономим один корпус и кучу выводов .
А при правильной организации индикации - еще и несколько байт флеша. Можно на один регистр выводить данные, а на другой - знакоместа. Получим до 8 знакомест.
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
13.11.2012, 21:16 13
программа больших доработок требует, я ещё только учусь, не всё сразу

Цитата Сообщение от dosykus_2
Да и вешать общие выводы индикаторов на пин AVR это как то по садистки выглядит.
В живом проекте они будут транзисторами управляться, проект в протеусе далёк от оригинала
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
13.11.2012, 21:20 14
Цитата Сообщение от ORV
В живом проекте они будут транзисторами управляться, проект в протеусе далёк от оригинала
И придётся снова инвертировать биты портов
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
13.11.2012, 21:22 15
Цитата Сообщение от YTYOUT
Цитата Сообщение от ORV
В живом проекте они будут транзисторами управляться, проект в протеусе далёк от оригинала
И придётся снова инвертировать биты портов
да тут не подумавши сделал, в общем-то это не проблема
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
23.11.2012, 18:40 16
Возникла новая проблема, дополнена в первом сообщении.
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
23.11.2012, 18:51 17
Но при работе с ШИМом всё начинает сильно тормозить, т.е. например частота переключение разрядов индикации становиться очень низкая. Уверен проблема пустяковая,
А вы уверены, что в протеусе симуляция идет в реальном времени? Внизу окна есть счетчик ANIMATING. Сравните течение времени там, и течение времени, например на наручных часах. Будете неприятно удивлены. В схеме много аналоговых элементов, плюс виртуальный осцилл. Тяжко протеусу :)
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
23.11.2012, 19:02 18
Цитата Сообщение от Финский
А вы уверены, что в протеусе симуляция идет в реальном времени? Внизу окна есть счетчик ANIMATING. Сравните течение времени там, и течение времени, например на наручных часах. Будете неприятно удивлены. В схеме много аналоговых элементов, плюс виртуальный осцилл. Тяжко протеусу :)
Ну я знал что он симулирует медленней чем реальный МК, а туда я внимание не обращал, т.е. всё должно быть нормально,
и у меня ещё вопрос по поводу драйвера, всё ли я правильно понимаю, а то когда сделаю плату и там касяки вылезут обидно будет)
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
23.11.2012, 19:07 19
А мощный вентилятор? Один logic-level N-channel полевик не справится?
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
24.11.2012, 15:26 20
Скидал драйвер на макетки всё работает чётко
0
24.11.2012, 15:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2012, 15:26

CM Bosch WAS24741OE/18 FD 8810 200011, проблема индикации F67
Здравствуйте! Возникла такая проблемка со CM Bosch WAS24741OE/18. Привезли стиралочку с проблемой...

[Решено] Проблема с компиляцией в QtCreator
Сабж: http://s19.***********/i192/1108/64/f6ff28f2cc39.bmp

[решено] Проблема с драйвером IR4426
Добрый день. Случился у меня затык с, в общем-то, простой схемой. Микроконтроллер через драйвер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.