AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
24.03.2015, 07:18
|
|
Временная регистрация
Регистрация: 24.03.2015
Адрес: Россия. г.Новосибирск
Сообщений: 69
Сказал спасибо: 12
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Проблема с динамической индикацией
Здравствуйте форумчане !
Нужна помощь начинающему в СИ.За основу был взят код из интернета.
Задача довольно простая .Нужно вывести число 1234 на четырёхразрядный семисегментный индикатор.Контроллер используется ATmega 8535. Проблемка следующая ... Если выводить число 1111 то высвечивается все четко.Но стоит в переменную display1 записать 1234 то всё смешивается.Собрал в протеусе ,все работает нормально а в реальной плате никак.Бродя по интернету я понял ,что это классическое построение программы.Где же ошибка ?
#include ‹avr/io.h›
#include ‹avr/interrupt.h›
#include ‹util/delay.h›
//------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9--
char SEGMENT[ ] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
volatile unsigned char segcounter = 8;
volatile int display1 = 0;
// Обработчик прерывания по переполнению таймера2
ISR (TIMER2_OVF_vect)
{
PORTD = 0xFF; // Гасим все разряды
PORTB = (8 ‹‹ segcounter) ; Двигаем 1 начиная с PB3
switch (segcounter)
{
case 0:
PORTD = ~(SEGMENT[display1 % 10000 / 1000]); // раскладываем числа
break;
case 1:
PORTD = ~(SEGMENT[display1 % 1000 / 100]);
break;
case 2:
PORTD = ~(SEGMENT[display1 % 100 / 10]);
break;
case 3:
PORTD = ~(SEGMENT[display1 % 10]);
break;
}
if ((segcounter++) › 2) segcounter = 0 ;
}
// Главная функция
int main (void)
{
DDRB |= (1 ‹‹ PB6)|(1 ‹‹ PB5)|(1 ‹‹ PB4)|(1 ‹‹ PB3); //настраиваем на выход порт B бегущая еденица выбирает индикатор
PORTB = 0x00;
DDRD |= (1 ‹‹ PD6)|(1 ‹‹ PD5)|(1 ‹‹ PD4)|(1 ‹‹ PD3)|(1 ‹‹ PD2)|(1‹‹PD1)|(1 ‹‹ PD0); //настройка порта для вывода кода числа
PORTD = 0x00;
TIMSK |= (1 ‹‹ TOIE2); // Разрешение прерывания по таймеру2
TCCR2 |= (1 ‹‹ CS22)|(0 ‹‹ CS21)|(0 ‹‹ CS20); // Предделитель на 8
sei(); // Глобально разрешаем прерывания
while(1)
{
display1=1234;
}
}
|
|
|
|
24.03.2015, 08:48
|
|
Прохожий
Регистрация: 07.02.2006
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Проблема с динамической индикацией
А какая частота обновления у вас? Попробуйте ее уменьшить.
|
|
|
|
24.03.2015, 09:15
|
|
Прописка
Регистрация: 07.12.2007
Адрес: Омск
Сообщений: 251
Сказал спасибо: 44
Сказали Спасибо 86 раз(а) в 45 сообщении(ях)
|
Re: Проблема с динамической индикацией
Включите гашение по всем портам.
|
|
|
|
24.03.2015, 09:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Проблема с динамической индикацией
Сообщение от ARTEM277
|
volatile unsigned char segcounter = 8;
|
Сообщение от ARTEM277
|
PORTB = (8 ‹‹ segcounter) ; Двигаем 1 начиная с PB3
|
Вы наверно хотели сказать: volatile unsigned char segcounter = 0;
Иначе не совсем понятно куда будет вывод PORTB = (8 ‹‹ 8 )
Сообщение от ARTEM277
|
if ((segcounter++) › 2) segcounter = 0
|
Не уверен, но возможно 2 надо поенять на 3
А вообще, судя по заполненности массива цифр - вам нужен бегущий ноль вместо бегущей еденицы. Отсюда и каша
Последний раз редактировалось Wiza_; 24.03.2015 в 09:31.
|
|
|
|
24.03.2015, 09:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Проблема с динамической индикацией
Сообщение от ARTEM277
|
PORTB = (8 ‹‹ segcounter) ; Двигаем 1 начиная с PB3
|
Поменяйте на: PORTB = 120 - (8 ‹‹ segcounter) ; Двигаем 0 начиная с PB3
Сообщение от ARTEM277
|
PORTD = 0xFF; // Гасим все разряды
|
Этим вы, скорее, все разряды зажигаете. Но тут не принципиально
Последний раз редактировалось Wiza_; 24.03.2015 в 09:37.
|
|
|
|
25.03.2015, 08:04
|
|
Временная регистрация
Регистрация: 24.03.2015
Адрес: Россия. г.Новосибирск
Сообщений: 69
Сказал спасибо: 12
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблема с динамической индикацией
Сообщение от Wiza_
|
Вы наверно хотели сказать: volatile unsigned char segcounter = 0;
Иначе не совсем понятно куда будет вывод PORTB = (8 ‹‹ 8 )
Не уверен, но возможно 2 надо поенять на 3
А вообще, судя по заполненности массива цифр - вам нужен бегущий ноль вместо бегущей еденицы. Отсюда и каша
|
Благодарю всех за ответы .
Wiza Скорее всего вы правы по поводу бегущего ноля. После того как шел с работы крутил в голове и тоже пришёл к выводу что надо ноль двигать.Пока ,что некогда попробовать .... как проэксперементирую опишусь мгновенно...
Wiza а как вы из кода поняли ,что ноль нужен ?
|
|
|
|
25.03.2015, 08:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Проблема с динамической индикацией
Сообщение от ARTEM277
|
Wiza а как вы из кода поняли ,что ноль нужен
|
Не из кода. Из симптомов. Хотя если бы привели схему как конкретно из трёх возможных способов вы подключаете дисплей к меге - ответ можно было бы дать точнее. Между мегой и дисплеем микросхемы/транзисторы есть ? Если есть - то где и какие ?
|
|
|
|
25.03.2015, 09:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Проблема с динамической индикацией
И как включены: инвертором или повторителем.
|
|
|
|
26.03.2015, 12:38
|
|
Временная регистрация
Регистрация: 24.03.2015
Адрес: Россия. г.Новосибирск
Сообщений: 69
Сказал спасибо: 12
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблема с динамической индикацией
Сообщение от Wiza_
|
Не из кода. Из симптомов. Хотя если бы привели схему как конкретно из трёх возможных способов вы подключаете дисплей к меге - ответ можно было бы дать точнее. Между мегой и дисплеем микросхемы/транзисторы есть ? Если есть - то где и какие ?
|
Конечно есть транзисторы p-n-p.И получается ,что они инверторы.Поэтому надо гонять ноль по порту а не еденицу.Сейчас пока другой работой нагружен.Обязательно поправлю и отпишусь.
Но почему же протеус отображает всё верно ? Вот в чем вопрос...
|
|
|
|
26.03.2015, 12:39
|
|
Временная регистрация
Регистрация: 24.03.2015
Адрес: Россия. г.Новосибирск
Сообщений: 69
Сказал спасибо: 12
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Проблема с динамической индикацией
Сообщение от baiderin
|
И как включены: инвертором или повторителем.
|
Получается ,что инвертором...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:22.
|
|