| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
НС595 - помогите оптимизировать код
20.02.2013, 21:34
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
Сообщение от SasaVitebsk
|
|
Собственно, возразить нечего. Для примера на ATMega640 - 11.059 я делаю кластер бегущей строки разрешением 72 * 16 светодиодов с 16 градациями яркости. Это 1152 светодиода. Регенерация 60 Гц. При этом вывожу текст и графику. В смысле мультики. Всё это на чистом Си.
|
Вот отрисовка кадра 320 на 80 RGB менее 10 ms ( эт 100 Гц)
Можете потягаться всеми компиляторами СИ со всеми оптимизаторами вместе взятыми.
|
PHP код:
|
.equ CNTPIX = (320*80)
// ADR_BMP
DrawEkran:
push r16
push r24
push r25
push zl
push zh
in r16,RAMPZ
push r16
ldi r24,low ( CNTPIX / 2 )
ldi r25,high ( CNTPIX / 2 )
lds zl,ADR_BMP
lds zh,ADR_BMP+1
lds r16,ADR_BMP+2
out RAMPZ,r16
DrColor:
elpm r16,z+
sbrs r16,7
jmp DrCount
out PORTA,r16
sbi P_CLK,B_CLK
cbi P_CLK,B_CLK
sbiw r25:r24,1
brne DrColor
jmp DrExit
DrCount:
sbi P_CLK,B_CLK
cbi P_CLK,B_CLK
sbiw r25:r24,1
breq DrExit
dec r16
brne DrCount
jmp DrColor
DrExit:
sbi P_OE,B_OE
nop
sbi P_LE,B_LE
cbi P_LE,B_LE
cbi P_OE,B_OE
pop r16
out RAMPZ,r16
pop zl
pop zh
pop r25
pop r24
pop r16
ret
|
|
|
|
|
20.02.2013, 21:36
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
если есть хорошый сайт про асемблер обучение дайте плиз
|
|
|
|
21.02.2013, 01:18
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
2 miwutka.
В вашем тексте я вижу только 2 switch полностью ... от третьего только кусок....
Я переписал. Вот как это выглядит всего лишь ...
|
Код:
|
uint8_t const __flash segm[10] = {0xfc, 0x60, 0xda, 0xf2,.....};
uint8_t i, tmp;
if((Number_disp & 0xfd)==1) Number_disp ^= 2; // меняем 3 и 1
DATA=1;
for(i=0; i‹Number_disp; i++) {CLK=1; CLK=0;}
DATA=0; CLK=1; CLK=0;
DATA=1;
for(i=i+1; i‹24; i++) {CLK=1; CLK=0;}
tmp = segm[Num_segm];
for(i=0; i‹8; i++)
{
DATA = tmp & 1;
tmp ››= 1;
CLK=1; CLK=0;
} |
|
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
21.02.2013, 01:28
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
спасибо за код. Через IF и FOR пробовал также - тормозило. Последний код не пробовал для сегментов. Надо попробовать. Сделал тоже самое через WHILE как посоветовал Boba_spb - стало всё супер. Еще пересчитал нужную индикацию и уменьшил скорость прерываний - вообще красотень. Код уменьшил с 77% до 52%. Там у меня куча еще всяких функций(экспериментирую). Вот хочу ко всему это DS18B20 подключить(еще АЦП работает 5 измерений в секунду примерно). Если без регистров то работает всё отлично - меряет температуру нормально.А делал индикацию через регитсры - температуру не меряло а показывало какуюто фигню... Может вы на регистрах делали? В чем нюанс? Про паузы знаю в 750 мс, 325 и т.д. Если возникает прерывание в этих паузах то неужели сбиваеться информация принимаемая по 1-wire? Использую стандартную библиотеку кодевижна.
|
|
|
|
21.02.2013, 01:38
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
Сообщение от Boba_spb
|
Что такое 1000 диодов ?
Вот 320 Х 80 Х 3 - полноцвет на то же Атмега128.
|
320*80*3 = 76800. Причём похоже статики.
76800/8 = 9600.
У atmega128 имеется 4к своей памяти. Таким образом вам пришлось ставить внешнюю память.
Вот объясните мне тупому. На чём вы сэкономили?!!!!!!! Я просто в шоке. 1$ мк + регистр + панелька + память! Плюс гемороились с asm. Ну нафига???
У меня вариант полноцвета обеспечивает lpc2106 за теже деньги, только со своей памятью (64к) 4096 цветов 144*16. Графика, динамика.
Собственно это всё лирика.
Я прекрасно пишу на asm. Буквально позавчера переписывал. Надо было прерывание написать максимально быстро. Я написал 3 варианта на Си и потом, всё же, переписал на ASM. Это очевидно, что на ASM вы напишите компактней. Особенно если касается короткого куска. Никто не возражает. Ясно, что Си будет менее эффективен. Ясно, что проект с применением ОС проиграет проекту без оной. Но развиваемость и прозрачность несопоставима, а вылизывание ушло далеко в прошлое.
Например, у меня общие исходники для AVR и LPC контроллеров по бегущей строке. У меня в хидере выбирается, да собственно я сейчас приведу ...
|
Код:
|
#define VERCIJA_PO 108 // Версия програмного обеспечения XX.XX
#define HARDWARE 22 // Версия аппаратного обеспечения XX.XX
// HARDWARE - Аппаратное обеспечение
// 2.0 - Модули AEG, 2 x SPI, 1 подтверждение, скважность 8, управление яркостью
// 2.1 - 2-ая версия LPC2106. Память at45db021
// 2.2 - Память at45db021. Два кластера на мастере
// 1.0 - Модули AE, скважность 16, без управления яркостью
// Вариант моно для улицы 144*16 Heap = D280
// Вариант бицвет 144*16 Heap = C500
#define TIP_INIT TIP_MASTER // Тип кластера
//#define TIP_INIT TIP_SLAVE // Тип кластера
#define CLASTER_X 0 // Номер кластера по X (0,1,2,...)
#define CLASTER_Y 0 // Номер кластера по Y (0,1,2,...)
//#define TIP_EKR BICOLOR_EKR // Монохромный / Цветной
#define TIP_EKR MONO_EKR // Монохромный / Цветной
#define LENGTH_X 144 // Размер по X
#define LENGTH_Y 16 // Размер по Y
#define LINE_SKV 8 // Скважность перебора
#define DEPTH_COL 4 // Глубина цвета (Х бит на цвет) (Фиксировано)
#define DATA_WIRE 2 // Число проводов для связи мастер-слэйв
#include "variant.h"
#define EEPROM_CHIP AT45DB021D // Тип применённых микросхем внешних EEPROM
#define CNT_EXT_EEPROM 1 // Число применённых микросхем внешних EEPROM
//#define OSC 11059200L // Частота кварца
#define OSC 14745600L // Частота кварца
#define CCLK (OSC*4) // Частота ядра контроллера
#define PCLK (CCLK) // Частота переферии
#define FCLK (CCLK) // Частота переферии (Для совместимости)
//#define TCLK 90 // Частота переферии контроллера в нс (ориентировочно)
#define TCLK 17 // Частота переферии контроллера в нс (ориентировочно)
#define FREGENER 60 // Частота регенерации панно
#define TIP_SHOW SHOW_SERIAL // Тип вывода информации на дисплей
#define REG_BRIGHT // Регулировка яркости строки
//#define FAST_GPIO // Поддержка кристаллов ревизии 01
//#define USE_RC5 // Использование пульта RC5 для настройки времени
#include "CalcDefTablo.h" // Расчитанные общие константы
/************************************************** *******/************************************************** **********************
* Размеры буферов. *
************************************************** **********************/
#define LENGTH_IN_BUF 525 // Длина буфера приёма RS485
#define LENGTH_OUT_BUF 32 // Длина буфера передачи RS485
#define LENGTH_I2C_BUF 256 // Длина буфера передачи I2C
#define WARNING_BUF 200 // Длина мин. зазора в буфере приёма RS485
#define SIZEOFBUF (LENGTH_IN_BUF+LENGTH_OUT_BUF+LENGTH_I2C_BUF+WARNI NG_BUF) // Длина мин. зазора в буфере приёма RS485
//#define AT24C(a) (a) // Тип применённых микросхем внешних EEPROM
#define TIME_WRITE_EE 20 // Время в мс для записи в буфер мс
/************************************************** *******/************************************************** **********************
* Размерность цвета. *
************************************************** **********************/
#if CPUFAM == _ARM7_
typedef uint32_t color_t; // Для ARM7 ядра 4 байта
#define __rom
#else
typedef uint8_t color_t; // Для AVR ядра 1 байт
#define __rom __flash
#endif |
|
|
|
|
21.02.2013, 01:44
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
Сообщение от miwutka
|
|
В чем нюанс?
|
Возможно у вас сидит 1820 на том же порту, где сидит и ваш вывод. И вы при выводе сбиваете диаграмму.
Да и if у меня нет
|
|
|
|
21.02.2013, 01:52
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
Дела давно минувших дней, конечно ... ))
|
|
|
|
21.02.2013, 01:52
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
посадил на отдельную ногу. Ну сейчас код оптимизирован. Попробую чуть позже еще раз его корректно заставить работать
|
|
|
|
21.02.2013, 01:58
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: НС595 - помогите оптимизировать код
Сообщение от SasaVitebsk
|
|
Дела давно минувших дней, конечно ... ))
|
красиво, красиво  Особенно бегущий леопард 
да, хотел бы я попробовать сделать бегущюю строку.... есть две матрицы. Ника не доберусь до них... принцып понимаю как. Выводить вроде надо построчно. Одни регистры на строки, другие на столбцы. Завел строку, отобразил столбец 1, вторую строку, столбец 1 и т.д., но как организовать сдвиг и подгрузку из массива пока недопер))) Есть несколько исходников, смотрел, чуток туго понимал как работает. Промышленные контроллеры программирую, а вот мк еще маловато опыта...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:15.
|
|