Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
08.07.2011, 18:21
|
|
Временная регистрация
Регистрация: 09.09.2007
Сообщений: 82
Сказал спасибо: 40
Сказали Спасибо 32 раз(а) в 19 сообщении(ях)
|
Re: 7-ми сегментный индикатор, atmega и динамическая индикация
А что железо? Так же работает?
|
|
|
Сказали "Спасибо" alex_r61
|
|
|
08.07.2011, 18:25
|
|
Частый гость
Регистрация: 26.06.2011
Адрес: SPB
Сообщений: 25
Сказал спасибо: 11
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: 7-ми сегментный индикатор, atmega и динамическая индикация
В том то и проблема, что железо так же себя ведет. ![Обижен](images/smilies/icon_beee.gif) Я уже второй день сижу голову ломаю. Поэтому и стал спрашивать: думаю, на знаю наверно каких то нюансов МК, или еще чего. А то так то пытался сам баг найти.
Нет, я конечно понимаю, что для устройства, которое я планирую сделать, просто куплю контроллер в отдельном корпусе и не буду париться, но хочется же понять, почему такой косяк возник!
|
|
|
|
08.07.2011, 19:17
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: 7-ми сегментный индикатор, atmega и динамическая индикация
Сообщение от ollycat
|
Текст скетча я прокомментировал чуть ли не каждую строку, там все тривиально в общем то...
|
Тривиально, но не работает. Выложите код сюда. Пусть даже на корявом Си. Покумекаем.
|
|
|
|
08.07.2011, 19:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.05.2008
Адрес: регион 63
Сообщений: 1,831
Сказал спасибо: 742
Сказали Спасибо 683 раз(а) в 386 сообщении(ях)
|
Re: 7-ми сегментный индикатор, atmega и динамическая индикация
Задержка между переключением анодов незаметна совсем, может из за этого ?
__________________
Да здравствует Разум,да сгинет Маразм!
|
|
|
|
08.07.2011, 19:27
|
|
Частый гость
Регистрация: 26.06.2011
Адрес: SPB
Сообщений: 25
Сказал спасибо: 11
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: 7-ми сегментный индикатор, atmega и динамическая индикация
Так выложил же. Или не чет не то сделал и не видно прикрепленного архива? Ну вот еще раз попробую прицепить.
Пардон если что, первый раз сюда пишу, до этого только читал.
|
|
|
|
08.07.2011, 19:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.05.2008
Адрес: регион 63
Сообщений: 1,831
Сказал спасибо: 742
Сказали Спасибо 683 раз(а) в 386 сообщении(ях)
|
Re: 7-ми сегментный индикатор, atmega и динамическая индикация
Сообщение от ollycat
|
Так выложил же. Или не чет не то сделал и не видно прикрепленного архива?
|
Народу лень в архивах копасться они хотят вот так
Код:
|
//vim: syntax=c:tabstop=2:softtabstop=2:shiftwidth=2
#define BUTTON 12 // пин для подключения кнопки
#define REGS 4 // количество регистров экрана
char anods[REGS] = {8,9,10,11}; // пины анодов
char pins[] = {0,1,2,3,4,5,6}; // пины семисегментного индикатора
volatile char d[REGS] = {17,17,17,17}; // сюда пишем число для отображения
volatile char reg = 0; // тут сохраняем номер разряда, с которым будет работать обработчик прерывания
volatile char prev_reg = REGS - 1; // тут номер предыдущего обработанного разряда
bool button_state = false; // текущее состояние кнопки
char dig[] = {
0b01000000, // 0
0b01111001, // 1
0b00100100, // 2
0b00110000, // 3
0b00011001, // 4
0b00010010, // 5
0b00000010, // 6
0b01111000, // 7
0b00000000, // 8
0b00010000, // 9
0b00001000, // A
0b00000011, // b
0b01000110, // C
0b00100001, // d
0b00000110, // E
0b00001110, // F
0b01111111, // чисто - индекс 16
0b00111111, // - - индекс 17
0b00011100, // градус - индекс 18
};
ISR(TIMER2_OVF_vect) // вектор прерывания по переполнению
{
digitalWrite(anods[prev_reg], LOW); // отрубаем аноды матрицы
char i = 0; // счетчик битов
for(char mask=0b00000001; i‹8; mask‹‹=1) // цикл маски битов
{
digitalWrite(pins[i++], (dig[d[reg]] & mask) ? HIGH: LOW); // берем поочередно биты и включаем нужные
}
digitalWrite(anods[reg], HIGH); // как выставили все биты катодов, можно включить и анод текущего разряда
prev_reg = reg; // сохраняем номер зажженного разряда
reg++; // увеличиваем разряд, что бы в следующий раз его включать
if(reg == REGS) // если это последний разряд...
reg = 0; // ... начинаем с начального разряда
}
void setup()
{
for(char i=0; i‹sizeof(pins); i++) // выставим пины в out и погасим сегменты
{
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], LOW);
}
pinMode(12, INPUT); // пин для кнопки поставим в in
for(char i=0; i‹sizeof(anods); i++) // отключим аноды
{
pinMode(anods[i], OUTPUT);
digitalWrite(anods[i], LOW);
}
//настраиваем Timer2: делитель /256, WGM mode 0 - по переполнению
TCCR2A = 0;
TCCR2B = 1‹‹CS22 | 1‹‹CS21;
//Timer2 включаем прерывание по переполнению
TIMSK2 = 1‹‹TOIE2;
//обнуляем таймер
TCNT2 = 0;
}
void loop()
{
delay(100); // чуток подождем :) дребезг кнопки для простоты не обрабатываем
if(digitalRead(BUTTON) == HIGH && !button_state) // если нажата кнопка и флаг не выставлен (ранее не была нажата) прибавляем в младший разряд единицу
{
button_state = true; // флаг выставляем, что кнопка нажата
d[0]++; // собственно увеличиваем разряд на единицу
for(char i=0; i‹REGS; i++) // далее проверяем переполнение разрядов
{
if(d[i] › 9)
{
d[i] = 0;
d[i+1]++;
}
}
}
else if(digitalRead(BUTTON) == LOW && button_state) // если кнопку отпустили, но ранее она была нажата (флаг выставлен) то...
button_state = false; // ...убираем флаг
} |
__________________
Да здравствует Разум,да сгинет Маразм!
|
|
|
|
08.07.2011, 19:33
|
|
Частый гость
Регистрация: 26.06.2011
Адрес: SPB
Сообщений: 25
Сказал спасибо: 11
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: 7-ми сегментный индикатор, atmega и динамическая индикация
Я думал об этом. Пробовал сделат задержки между вклюиением и отключением анодов. Та же картина.
|
|
|
|
08.07.2011, 19:35
|
|
Частый гость
Регистрация: 26.06.2011
Адрес: SPB
Сообщений: 25
Сказал спасибо: 11
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: 7-ми сегментный индикатор, atmega и динамическая индикация
Пардон, я по своей юниксовой привычке думал что не удобно с веб морды ковыряться в коде, а легче взять файл.
|
|
|
|
08.07.2011, 21:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: 7-ми сегментный индикатор, atmega и динамическая индикация
Сообщение от ollycat
|
На 2 горит лишний сегмент "C", на 4 - сегмент "E". В битовых масках в программе нормально все стоит, эти биты не должны гореть, сейчас еще раз проверил.
|
Все-таки проблема в масках, или включен какой-то аппаратный модуль, который отбирает определенные ножки себе - и программа не может изменить уровень на этих ножках. Попробуйте залить во все разряды коды FFh и 00h - если будут провалы, ковыряйте все аппаратные модули, которые имеют доступ к порту
|
|
|
|
08.07.2011, 22:16
|
|
Частый гость
Регистрация: 26.06.2011
Адрес: SPB
Сообщений: 25
Сказал спасибо: 11
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: 7-ми сегментный индикатор, atmega и динамическая индикация
Понятно. Конкретнее, я так понимаю, ни кто не скажет, видимо не сталкивался ни кто. Ладно, спасибо всем отозвавшимся за помощь, пойду ковырять дальше.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Еще динамическая индикация
|
Kabron |
Микроконтроллеры, АЦП, память и т.д |
22 |
29.09.2010 16:12 |
Динамическая индикация
|
mironov |
Микроконтроллеры, АЦП, память и т.д |
4 |
02.07.2010 17:37 |
Динамическая индикация ПОМОГИТЕ
|
7Fantomas7 |
Микроконтроллеры, АЦП, память и т.д |
2 |
27.03.2008 23:53 |
Динамическая индикация
|
dosikus |
Микроконтроллеры, АЦП, память и т.д |
3 |
16.02.2008 19:09 |
Сегментный ЖК индикатор MT10T71. К каким пинам AVR присоед.
|
retcom |
Микроконтроллеры, АЦП, память и т.д |
10 |
07.11.2007 19:42 |
Часовой пояс GMT +4, время: 19:22.
|
|