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

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

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

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

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

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

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

НС595 - помогите оптимизировать код

Непрочитано 20.02.2013, 21:34  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию 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 
Реклама:
Boba_spb вне форума  
Непрочитано 20.02.2013, 21:36  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: НС595 - помогите оптимизировать код

если есть хорошый сайт про асемблер обучение дайте плиз
miwutka вне форума  
Непрочитано 20.02.2013, 22:05  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: НС595 - помогите оптимизировать код

Я учился по этим книжкам http://www.williambader.com/museum/vax/pdphistory.html

Начинал с PDP-11/45 вот с такого http://progopedia.ru/version/assembler-pdp-11/

Ну а дальше как у филологов - один язык выучил ( процессор), а другой выучить уже совсем просто
Boba_spb вне форума  
Непрочитано 21.02.2013, 01:18  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" SasaVitebsk
miwutka (21.02.2013)
Непрочитано 21.02.2013, 01:28  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: НС595 - помогите оптимизировать код

спасибо за код. Через IF и FOR пробовал также - тормозило. Последний код не пробовал для сегментов. Надо попробовать. Сделал тоже самое через WHILE как посоветовал Boba_spb - стало всё супер. Еще пересчитал нужную индикацию и уменьшил скорость прерываний - вообще красотень. Код уменьшил с 77% до 52%. Там у меня куча еще всяких функций(экспериментирую). Вот хочу ко всему это DS18B20 подключить(еще АЦП работает 5 измерений в секунду примерно). Если без регистров то работает всё отлично - меряет температуру нормально.А делал индикацию через регитсры - температуру не меряло а показывало какуюто фигню... Может вы на регистрах делали? В чем нюанс? Про паузы знаю в 750 мс, 325 и т.д. Если возникает прерывание в этих паузах то неужели сбиваеться информация принимаемая по 1-wire? Использую стандартную библиотеку кодевижна.
miwutka вне форума  
Непрочитано 21.02.2013, 01:38  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию 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
SasaVitebsk вне форума  
Непрочитано 21.02.2013, 01:44  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: НС595 - помогите оптимизировать код

Сообщение от miwutka Посмотреть сообщение
В чем нюанс?
Возможно у вас сидит 1820 на том же порту, где сидит и ваш вывод. И вы при выводе сбиваете диаграмму.

Да и if у меня нет
SasaVitebsk вне форума  
Непрочитано 21.02.2013, 01:52  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: НС595 - помогите оптимизировать код

Дела давно минувших дней, конечно ... ))
Вложения:
Тип файла: rar Изображение 004.rar (3.62 Мб, 38 просмотров)
SasaVitebsk вне форума  
Непрочитано 21.02.2013, 01:52  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: НС595 - помогите оптимизировать код

посадил на отдельную ногу. Ну сейчас код оптимизирован. Попробую чуть позже еще раз его корректно заставить работать
miwutka вне форума  
Непрочитано 21.02.2013, 01:58  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: НС595 - помогите оптимизировать код

Сообщение от SasaVitebsk Посмотреть сообщение
Дела давно минувших дней, конечно ... ))
красиво, красиво Особенно бегущий леопард
да, хотел бы я попробовать сделать бегущюю строку.... есть две матрицы. Ника не доберусь до них... принцып понимаю как. Выводить вроде надо построчно. Одни регистры на строки, другие на столбцы. Завел строку, отобразил столбец 1, вторую строку, столбец 1 и т.д., но как организовать сдвиг и подгрузку из массива пока недопер))) Есть несколько исходников, смотрел, чуток туго понимал как работает. Промышленные контроллеры программирую, а вот мк еще маловато опыта...
miwutka вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите оптимизировать прогу для ШИМа... miwutka Микроконтроллеры, АЦП, память и т.д 10 27.06.2012 14:19
С код помогите решить проблему 7Fantomas7 Микроконтроллеры, АЦП, память и т.д 33 25.01.2011 16:29
Помогите расшифровать код dizzy Цифровые сигнальные процессоры 7 27.05.2009 20:55
преобразователь код-код zazan111 TTL и CMOS логика 18 05.01.2009 06:11
Помогите переводить код с pic16f84 в 18f242! nhudan Микроконтроллеры, АЦП, память и т.д 12 14.08.2007 13:36


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.