Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
20.02.2013, 14:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
у меня всё подключенно последовательно. Идет 60 светодиодов, после них 1 регистр на сегменты и 3 на общий анод(катод).
Последний раз редактировалось miwutka; 20.02.2013 в 15:11.
|
|
|
|
20.02.2013, 15:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
Код:
|
//вывод на сдвиговые регистры
void shiftout(char _data){
PORTB &= ~(1‹‹DATA); //установим ноль на пине данных
PORTB &= ~(1‹‹ST_CP); //снимем "защелку" 74HC595
//цикл по битам 74hc595, 0..15 два байта для двух 74HC595
for (char i=0; i‹=15; i++) {
if(i‹_data) PORTB |= (1‹‹DATA);
else PORTB &= ~(1‹‹DATA);
//обозначим clock
PORTB |= (1‹‹SH_CP);
PORTB &= ~(1‹‹SH_CP);
}
PORTB |= (1‹‹ST_CP); //установим "защелку" 74HC595
} |
вызываем нужное число раз (по колву последовательных регистров), передавая в _data состояние ног регистров от дальнего к ближнему
|
|
|
|
20.02.2013, 15:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
от черт, тут для двух регистров
ну суть понятна думаю
- снять защелку
- в цикле передать данные для всех регистров, подергивая клоком
- поставить защелку когда все нужные байты уйдут
|
|
|
|
20.02.2013, 15:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
Такое я вставлял в текст, но мк начал ужасно медленно всё это делать... Вставлял текстом а не процедурой... думаю мне лучше подходит по SPI... Надо всётаки с ним разбираться смотрю...
|
|
|
|
20.02.2013, 15:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
miwutka, это и есть односторонний SPI, и скорость работы этого кода в сотни раз превосходит ваши требования. Ищите проблему в другом месте вашей разработки.
От аппаратного spi это отличается по скорости работы незначительно (в вашем случае)
|
|
|
|
20.02.2013, 15:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
изза чего жэ тогда может так начинать тормозить МК? как думаете? Если я свои 4 кейса заменяю на 4 for'а(и это все в прерывании которое срабатывает каждые 200 мкс, частота 16 МГЦ ядра) то всё тормозит, а отображение на ЖК выводится спустя минуту ))
|
|
|
|
20.02.2013, 15:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
приведу логический пример. Еще раз. Но более полно.
1) "Снимаем = ставим в 0" защелку (пин ST_CP всех hc595). Они, сохраняя прежнее состояние выходов, готовы к загрузке новых данных.
2) Передаем байт. Например 0b00001000 -
2.1) ставим data в 0 (передаем первый ноль) - ставим-снимаем CLOCK. Дергание CLOCK дает знать HC595-й о том, что состояние пина data есть бит (в нашем случае первый из байта)
2.2) повторяем 2.1 еще два раза (уходят биты 000 справа-налево)
2.3) ставим data в 1 и дергаем CLOCK (уходит единичка
2.4) передаем как в 2.1 оставшиеся нули
Пункт 2 повторяется то число раз, сколько у нас последовательно hc595-х. Первый посланный байт попадает в дальнюю микросхему, последний - в ближнюю. Они побитно через q7 проталкивают данные "дальше" по конвейеру.
3) ставим защелку. Для всех hc595-х это сигнал - данные загружены, активируем их на ноги.
Байт читается (передается) справа-налево.
|
|
|
|
20.02.2013, 15:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
switch (Number_disp) - номер цыфры
switch (Num_segm) - включение сегментов
switch (Number) - это одна группа светодиодов 32 шт
switch (tah_LED) - это вторая 32 шт
я управляю динамикой + 64 светодиода... на индикаторах отображаю счетчики и 2 АЦП. АЦП 250 кГц настроил чтоб быстрее обрабатывал без особой точности на 10 бит.
Сейчас еще попробую ваш код воткнуть.....
|
|
|
|
20.02.2013, 15:46
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
Сообщение от miwutka
|
Подскажите...
|
Я неповерю, что значительно замедлится работа если применить стандартное решение типа нижеследующего (например вывод 30 символов на 24 светодиодный экран)
Код:
|
const __flash uint8_t symbol[30][3] = {...};
void outsym(uint8_t sym)
{
const __flash uint8_t *ptr = &symbol[sym];
uint8_t i, tmp;
tmp = *ptr++;
for(i=0; i‹8; i++)
{
DATA = tmp & 1;
tmp ››= 1;
CLK = 1;
CLK = 0;
}
tmp = *ptr++;
for(i=0; i‹8; i++)
{
DATA = tmp & 1;
tmp ››= 1;
CLK = 1;
CLK = 0;
}
tmp = *ptr++;
for(i=0; i‹8; i++)
{
DATA = tmp & 1;
tmp ››= 1;
CLK = 1;
CLK = 0;
}
} |
|
|
|
|
20.02.2013, 15:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
я тоже не поверил но я вот так и заменил свои 4 кейса как у вас. Только без указателей - я их не понимаю (((
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:44.
|
|