Jump to content

    
Sign in to follow this  
Waso

Исходники программ и библиотек

Recommended Posts

Посмотрел. Это будет правильным решением :(

Ну, именно от Вас я ожидал подобной фразы...

Аргументируйте, если не трудно.

Пусть будет мне наукой.

 

Я, конечно, не претендую на звание "образец стиля" в написании программ, если Вы это имели ввиду под чисто ремесленными навыками, это оттачивается с годами.

Нельзя ли конкретней? А то Вы только интригуете подобными фразами. Мне снизу не видно! :laughing:

Edited by injen-d

Share this post


Link to post
Share on other sites

для работы с инкрементным энкодером encoder.rar

для преобразования двоичных чисел в двоично десятичные и вывода на lcd bcd.rar

знакогенератор для LCD от Nokia3310 DriverNokia3310Tx.rar

библиотека для работы с LCD от Nokia3310 с видео буфером. нужно от 1 КБ ОЗУ. DriverNokia3310vb.rar

Share this post


Link to post
Share on other sites

Модуль доступа к 16-и битным регистрам AVR (для avr-gcc).

=======================================================================
=====
#define avr_read_word_atomic(addr)                                            \
(__extension__({                                                              \
uint16_t __addr16 = (uint16_t)(addr);                                     \
uint16_t __result;                                                        \
__asm__ __volatile__                                                      \
(                                                                         \
	"in __tmp_reg__,__SREG__"           "\n\t"                            \
	"cli"                               "\n\t"                            \
	"ldd %A0,%a1+0"                     "\n\t"  /*lo*/                    \
	"out __SREG__, __tmp_reg__"         "\n\t"                            \
	"ldd %B0,%a1+1"                             /*hi*/                    \
	: "=r" (__result)                   /* output operands */             \
	: "e" (__addr16)                    /* input operands */              \
	: "memory"                          /* list of clobbered registers */ \
);                                                                        \
__result;                                                                 \
}))

// ============================================================================
#define avr_write_word_atomic(addr,value)                                     \
(__extension__({                                                              \
uint16_t __addr16 = ((uint16_t)(addr));                                   \
uint16_t __value  = (uint16_t)(value);                                    \
__asm__ __volatile__                                                      \
(                                                                         \
	"in __tmp_reg__,__SREG__"           "\n\t"                            \
	"cli"                               "\n\t"                            \
	"std %a1+1,%B0"                     "\n\t"   /*hi*/                   \
	"out __SREG__, __tmp_reg__"         "\n\t"                            \
	"std %a1+0,%A0"                              /*lo*/                   \
	:                                   /* output operands */             \
	: "r" (__value),                    /* input operands */              \
	  "e" (__addr16)                                                      \
	: "memory"                          /* list of clobbered registers */ \
);                                                                        \
}))

avr_reg16.zip

Share this post


Link to post
Share on other sites
для работы с инкрементным энкодером encoder.rar

для преобразования двоичных чисел в двоично десятичные и вывода на lcd bcd.rar

знакогенератор для LCD от Nokia3310 DriverNokia3310Tx.rar

библиотека для работы с LCD от Nokia3310 с видео буфером. нужно от 1 КБ ОЗУ. DriverNokia3310vb.rar

 

Добавлю-ка я вариант с учетверением количества импульсов валкодера. indent-ы в исходном тексте съела форма ответа на сообщение...

 

static uint_least8_t old_val;

void spool_encinterrupt(void)
{
uint_least8_t new_val = hardware_get_encoder_bits();	/* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */

// dimensions are:
// old_bits new_bits
const static int_least8_t v [4][4] =
{
	{
		+0,		/* 00 -> 00 stopped */
		-1,		/* 00 -> 01 rotate left */
		+1,		/* 00 -> 10 rotate right */
		+0,		/* 00 -> 11 invalid combination */		
	},
	{
		+1,		/* 01 -> 00 rotate right */
		+0,		/* 01 -> 01 stopped */
		+0,		/* 01 -> 10 invalid combination */
		-1,		/* 01 -> 11 rotate left */
	},
	{
		-1,		/* 10 -> 00 rotate left */
		+0,		/* 10 -> 01 invalid combination */
		+0,		/* 10 -> 10 stopped */
		+1,		/* 10 -> 11 rotate right */
	},
	{
		+0,		/* 11 -> 00 invalid combination */
		+1,		/* 11 -> 01 rotate right */
		-1,		/* 11 -> 10 rotate left */
		+0,		/* 11 -> 11 stopped */
	},
};


rotate += v [old_val][new_val];

old_val = new_val;
}

ISR(INT0_vect)
{
spool_encinterrupt();
}

ISR(INT1_vect)
{
spool_encinterrupt();
}

void encoder_clear(void)
{
rotate2 = 0;
disableIRQ();
rotate = 0;
tickcount = TICKCOUNT_MAX;
enableIRQ();
}
/* получение количества шагов и времени с последнего вызова. */
int 
encoder_snapshot(
uint_least8_t * ticks, 
uint_least8_t derate)
{
div_t h;
int hrotate;

disableIRQ();
if (tickcount != 0)
{
	* ticks = tickcount;
	tickcount = 0;
	hrotate = rotate;
	rotate = 0;
}
else
{
	* ticks = 1;
	hrotate = 0;
	//hrotate = rotate;
	//rotate = 0;
}
enableIRQ();

/* Ументшение разрешения валкодера в зависимости от установок в меню */
h = div(hrotate + rotate2, derate);

rotate2 = h.rem;

return h.quot;
}


/* получение "редуцированного" количества прерываний от валкодера.
* То что осталось после деления на scale, остается в накопителе 
*/

int getRotateLoRes(void)
{
uint_least8_t ticks;
return encoder_snapshot(& ticks, ROTATE_LORES_DIV * hiresdiv);
}

Edited by Genadi Zawidowski

Share this post


Link to post
Share on other sites

Простой программный UART-передатчик. STX - Simple TX Удобно в Proteus нацепить на reset-вывод.

Код работает под IAR и CodeVisionAVR. (добавите WinAVR - буду рад добавить в исходник)

В архиве (функция и проекты IAR, CV, Proteus)

 

STX Rev.71

Share this post


Link to post
Share on other sites

Простой драйвер символьного lcd на основе контроллеров ks0066. Проверка флага занятости. Поддержка 4-ех и 8-ми разрядной шины. В архиве 2 варианта - для IARa и для WINAVR.

lcd_winstar.rar

Edited by sansnotfor

Share this post


Link to post
Share on other sites

1. Библиотека V-USB (старое название AVR-USB) - программная реализация протокола USB на AVR. Есть примеры рабочих устройств USB и компутерных программ, работающих с этими устройствами. Библиотека бесплатная. Комментарии в библиотеке и примерах переведены на русский язык.

2. Макетные платы, на которых удобно применять библиотеку V-USB: AVR-USB-MEGA16, AVR-USB-TINY45.

3. Макетные платы с аппаратным интерфейсом USB: AVR-USB162, AT91SAM7X.

Share this post


Link to post
Share on other sites

Драйвер матричной клавиатуры 3х4. Подходит для любого компилятора, нужно только подключить соответствующих заголовочный файл мк. Позволяет подключать клавиатуру как к разным портам, так и к одному. Единственное условие - столбцы матрицы должны быть подключены к младшим разрядам порта, строки - к старшим.

Keyboard_driver.rar

Share this post


Link to post
Share on other sites

Небольшая поправочка к моему сообщению №138 в этой ветке форума,

вот так будет вернее:

============================================================================
#define avr_read_word_atomic(addr)                                            \
(__extension__({                                                              \
uint16_t __addr16 = (uint16_t)(addr);                                     \
uint16_t __result;                                                        \
__asm__ __volatile__                                                      \
(                                                                         \
	"in __tmp_reg__,__SREG__"           "\n\t"                            \
	"cli"                               "\n\t"                            \
	"ldd %A0,%a1+0"                     "\n\t"  /*lo*/                    \
	"out __SREG__, __tmp_reg__"         "\n\t"                            \
	"ldd %B0,%a1+1"                             /*hi*/                    \
	: "=r" (__result)                   /* output operands */             \
	: "b" (__addr16)                    /* input operands */              \
	: "memory"                          /* list of clobbered registers */ \
);                                                                        \
__result;                                                                 \
}))

// ============================================================================
#define avr_write_word_atomic(addr,value)                                     \
(__extension__({                                                              \
uint16_t __addr16 = ((uint16_t)(addr));                                   \
uint16_t __value  = (uint16_t)(value);                                    \
__asm__ __volatile__                                                      \
(                                                                         \
	"in __tmp_reg__,__SREG__"           "\n\t"                            \
	"cli"                               "\n\t"                            \
	"std %a1+1,%B0"                     "\n\t"   /*hi*/                   \
	"out __SREG__, __tmp_reg__"         "\n\t"                            \
	"std %a1+0,%A0"                              /*lo*/                   \
	:                                   /* output operands */             \
	: "r" (__value),                    /* input operands */              \
	  "b" (__addr16)                                                      \
	: "memory"                          /* list of clobbered registers */ \
);                                                                        \
}))

заменил

"e" (__addr16)

на

"b" (__addr16)

 

а то вдруг компилятор попытался сгенерить STD X+1,N (мой косяк)

а можно лишь

STD Y+1,N

STD Z+1,N

Share this post


Link to post
Share on other sites

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;ah:al/bl 86байт 46 тактов

;ah=]ah:al/bl[ остаток

;al=[ah:al/bl] частное

div16_8:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

lsl al ;1

rol ah ;1

sbc ah,bl ;1

brsh koko7 ;2/1

add ah,bl ;1

koko7: rol al ;1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

rol ah ;1

sbc ah,bl ;1

brsh koko6 ;2/1

add ah,bl ;1

koko6: rol al ;1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

rol ah ;1

sbc ah,bl ;1

brsh koko5 ;2/1

add ah,bl ;1

koko5: rol al ;1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

rol ah ;1

sbc ah,bl ;1

brsh koko4 ;2/1

add ah,bl ;1

koko4: rol al ;1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

rol ah ;1

sbc ah,bl ;1

brsh koko3 ;2/1

add ah,bl ;1

koko3: rol al ;1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

rol ah ;1

sbc ah,bl ;1

brsh koko2 ;2/1

add ah,bl ;1

koko2: rol al ;1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

rol ah ;1

sbc ah,bl ;1

brsh koko1 ;2/1

add ah,bl ;1

koko1: rol al ;1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

rol ah ;1

sbc ah,bl ;1

brsh koko0 ;2/1

add ah,bl ;1

koko0: rol al ;1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

com al ;1

ret ;4 6+7*5+5=46

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

 

 

;;;;;;;;;;;;СRC-CCITT_16 0x1021;;;;;;;;;

;CRC-XMODEM (0x1021) Initial value:0x0 ;

; 50 байт ;

; 18 тактов на байт

;Z-sumbol al=dlin ;

;bh:bl=crc-16 ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

crc_home: clr bh ;1

clr bl ;1

crc_plus: push al ;2

push ah ;2

push r1 ;2

push r0 ;2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

crc_loop1: ld ah,Z+ ;2

eor bh,ah ;1

ldi ah,16 ;1

mul ah,bh ;2

eor bh,r1 ;1

mul ah,bh ;2

eor bl,r0 ;1

add r0,r0 ;1

adc r1,r1 ;1

eor r0,bh ;1

eor r1,bl ;1

movw bh:bl,r1:r0;1

dec al ;1

brne crc_loop1 ;2/1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18

pop r0 ;2

pop r1 ;2

pop ah ;2

pop al ;2

ret ;4

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Share this post


Link to post
Share on other sites

Небольшая утилита для Windows с исходниками

Позволяет осуществлять удобное кодирование таблички для 7ми сегментного (семисегментного) индикатора

Откомпилированный фал в папке realise

В программе можно визуально указать какой сегмент к какому выводу контроллера подсоединен

собственно PB и PD указанно для удобства можно читать что там и PA и PE короче PX и PY

в результирующем фале digs.inc будет табличка из .dw биты которого будут соответствовать PXn и PYn

 

то есть по адресу=адрестаблички+цифра*2 мы получим два байта которые можно сразу outить в PX и PY

ну моджет быть замаскировав неиспользуемые биты

 

это уже вторая версия, предыдущая была рассчитана только на один порт и генерировала готовый код с использованием

оперативной памяти

7SEG2.RAR

Share this post


Link to post
Share on other sites

Энергосчетчик 220 В. Позволяет контролировать напряжение, ток и частоту сети. Гальваническая развязка от сети, интерфейс RS-485.

Исходники + схема

 

Share this post


Link to post
Share on other sites

Watchdog таймер для GSM-модема, работающего под управлением внутренней прошивки (например, GE863-GPS, работающего под управлением внутренней Python-программы). Таймер ждет периодических подтверждающих импульсов от GPIO модема, в противном случае перезагружает модем.

Исходник + схема

 

Комбинированный сенсор для робота. Три акселерометра + три гироскопа + АЦП + контроллер + RS232.

Исходник + схема

Share this post


Link to post
Share on other sites

GPS GSM трекер. Трекер отправляет хозяину SMS со своими координатами, определенными при помощи GPS приемника. SMS отправляются периодически, в соответствии с заранее определенным интервалом.

Схема + программа

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this