Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 24.03.2015, 07:18  
ARTEM277
Временная регистрация
 
Регистрация: 24.03.2015
Адрес: Россия. г.Новосибирск
Сообщений: 69
Сказал спасибо: 12
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ARTEM277 на пути к лучшему
По умолчанию Проблема с динамической индикацией

Здравствуйте форумчане !
Нужна помощь начинающему в СИ.За основу был взят код из интернета.
Задача довольно простая .Нужно вывести число 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;

}
}
Реклама:
ARTEM277 вне форума  
Непрочитано 24.03.2015, 08:48  
GMP
Прохожий
 
Регистрация: 07.02.2006
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
GMP на пути к лучшему
По умолчанию Re: Проблема с динамической индикацией

А какая частота обновления у вас? Попробуйте ее уменьшить.
GMP вне форума  
Непрочитано 24.03.2015, 09:15  
pictele
Прописка
 
Аватар для pictele
 
Регистрация: 07.12.2007
Адрес: Омск
Сообщений: 251
Сказал спасибо: 44
Сказали Спасибо 86 раз(а) в 45 сообщении(ях)
pictele на пути к лучшему
По умолчанию Re: Проблема с динамической индикацией

Включите гашение по всем портам.
pictele вне форума  
Непрочитано 24.03.2015, 09:27  
Wiza_
Почётный гражданин KAZUS.RU
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию 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.
Wiza_ вне форума  
Непрочитано 24.03.2015, 09:33  
Wiza_
Почётный гражданин KAZUS.RU
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: Проблема с динамической индикацией

Сообщение от ARTEM277 Посмотреть сообщение
PORTB = (8 ‹‹ segcounter) ; Двигаем 1 начиная с PB3
Поменяйте на: PORTB = 120 - (8 ‹‹ segcounter) ; Двигаем 0 начиная с PB3

Сообщение от ARTEM277 Посмотреть сообщение
PORTD = 0xFF; // Гасим все разряды
Этим вы, скорее, все разряды зажигаете. Но тут не принципиально

Последний раз редактировалось Wiza_; 24.03.2015 в 09:37.
Wiza_ вне форума  
Непрочитано 25.03.2015, 08:04  
ARTEM277
Временная регистрация
 
Регистрация: 24.03.2015
Адрес: Россия. г.Новосибирск
Сообщений: 69
Сказал спасибо: 12
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ARTEM277 на пути к лучшему
По умолчанию Re: Проблема с динамической индикацией

Сообщение от Wiza_ Посмотреть сообщение
Вы наверно хотели сказать: volatile unsigned char segcounter = 0;
Иначе не совсем понятно куда будет вывод PORTB = (8 ‹‹ 8 )

Не уверен, но возможно 2 надо поенять на 3

А вообще, судя по заполненности массива цифр - вам нужен бегущий ноль вместо бегущей еденицы. Отсюда и каша


Благодарю всех за ответы .
Wiza Скорее всего вы правы по поводу бегущего ноля. После того как шел с работы крутил в голове и тоже пришёл к выводу что надо ноль двигать.Пока ,что некогда попробовать .... как проэксперементирую опишусь мгновенно...
Wiza а как вы из кода поняли ,что ноль нужен ?
ARTEM277 вне форума  
Непрочитано 25.03.2015, 08:15  
Wiza_
Почётный гражданин KAZUS.RU
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: Проблема с динамической индикацией

Сообщение от ARTEM277 Посмотреть сообщение
Wiza а как вы из кода поняли ,что ноль нужен
Не из кода. Из симптомов. Хотя если бы привели схему как конкретно из трёх возможных способов вы подключаете дисплей к меге - ответ можно было бы дать точнее. Между мегой и дисплеем микросхемы/транзисторы есть ? Если есть - то где и какие ?
Wiza_ вне форума  
Непрочитано 25.03.2015, 09:41  
baiderin
Почётный гражданин KAZUS.RU
 
Аватар для baiderin
 
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
baiderin на пути к лучшему
По умолчанию Re: Проблема с динамической индикацией

И как включены: инвертором или повторителем.
baiderin вне форума  
Непрочитано 26.03.2015, 12:38  
ARTEM277
Временная регистрация
 
Регистрация: 24.03.2015
Адрес: Россия. г.Новосибирск
Сообщений: 69
Сказал спасибо: 12
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ARTEM277 на пути к лучшему
По умолчанию Re: Проблема с динамической индикацией

Сообщение от Wiza_ Посмотреть сообщение
Не из кода. Из симптомов. Хотя если бы привели схему как конкретно из трёх возможных способов вы подключаете дисплей к меге - ответ можно было бы дать точнее. Между мегой и дисплеем микросхемы/транзисторы есть ? Если есть - то где и какие ?
Конечно есть транзисторы p-n-p.И получается ,что они инверторы.Поэтому надо гонять ноль по порту а не еденицу.Сейчас пока другой работой нагружен.Обязательно поправлю и отпишусь.
Но почему же протеус отображает всё верно ? Вот в чем вопрос...
ARTEM277 вне форума  
Непрочитано 26.03.2015, 12:39  
ARTEM277
Временная регистрация
 
Регистрация: 24.03.2015
Адрес: Россия. г.Новосибирск
Сообщений: 69
Сказал спасибо: 12
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ARTEM277 на пути к лучшему
По умолчанию Re: Проблема с динамической индикацией

Сообщение от baiderin Посмотреть сообщение
И как включены: инвертором или повторителем.
Получается ,что инвертором...
ARTEM277 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с FT232BM (FT232BL) anbsoft Микроконтроллеры, АЦП, память и т.д 27 07.08.2010 09:33
Проблема с DC/DC locostudy Источники питания и свет 2 03.11.2008 12:10
p30f6010A проблема с переключением состояния портов Ilya Микроконтроллеры, АЦП, память и т.д 8 22.09.2008 09:14
FT232BM проблема с прошивкой EEPROM zms2003 Микроконтроллеры, АЦП, память и т.д 3 27.06.2008 07:18
Проблема с ЛСД Zemlyanov Делимся опытом 4 12.01.2007 20:53


Часовой пояс GMT +4, время: 13:22.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot