Форум по микроконтроллерам: Библиотеки перемещаемого кода - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Библиотеки перемещаемого кода Тут буду выкладывать свои наработочки

#1 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 07 Сентябрь 2011 - 19:47

Динамическая индикация

Прикрепленный файл  7_seg.rar (2,93К)
Количество загрузок:: 312
В проект должны быть добавлены оба файла.

Подключение библиотеки
#include "7_seg.inc"

Далее, все настройки производятся в файле "7_seg.inc"

#include     <p16F628a.inc> ; Подключение inc-файла текущего МК
В этой строке выбирается inc-файл используемого чипа.

#define IND_SIZE        x       ; Кол-во индикаторов
Эта строчка отвечает за кол-во используемых индикаторов, где x - это число индикаторов. Их может быть от 1 до 8 штук.

#define IND_INVERT              ; Инверсия общего вывода индикатора. Закоментировано - нет инверсии.
#define SEG_INVERT              ; Инверсия выводов сегментов. Закоментировано - нет инверсии.
Эти 2 строчки отвечают за активные уровни для общих и сегментных выводов индикатора.
Например. Если Вы хотите сделать для общих выводов активный уровень - лог.1, то закоментируйте первую строку. Если он будет лог 0, то снимите знак коментария.
Так-же и для сегментных выводов (2-я строчка).
Этими строками можно с лёгкостью поменять тип индикатора, например с ОА на ОК, или наоборот. Так-же можно быстро проинвертировать выводы если используются ключи (транзисторы) как на общих выводах, так и на сегментных.

Далее.
;==================================================================================================
; Назначение выводов
;==================================================================================================
.....
.....
В этом участке кода настраиваются каждый вывод индикатора под конкретный пин МК.
ind_1 - ind_8 это пины для общих выводов индикаторов.
ind_A - ind_P это пины для сегментных выводов индикаторов, от A до P.
TRIS'ы так-же должны соответствовать используемым пинам.

Использование процедур библиотеки

Seg_7_Init
Инициализирует пины.
Настраивает необходимые для индикатора выводы МК на выход и устанавливает на них соотв. уровни.
Вызывается, как не сложно догадаться, в начале программы.

Seg_7_Off
Гашение индикаторов.
Выставляет на пинах, соответствующих общим выводам индикаторов, необходимые для гашения уровни.
Вызывается перед вызовом процедуры Seg_7_Next.
Так-же, процедуру можно использовать для изменения яркости индикатора, привязав её к таймеру гашения. Пример реализации яркости в архиве.

Seg_7_Next
Зажигает очередной индикатор и выводит на его сегменты соответствующее значение.
Вызывается в переодично-повторяющемся месте программы, например оброботчике прерывания таймера.
Процедура не гасит предыдущий индикатор ! По этому, перед её вызовом, необходимо вызвать Seg_7_Off. Если этого не сделать, библиотека просто зажгёт все индикаторы и на них будет "абракадабра".

Seg_7_ out_val
Выводит на индикатор значения из массива out_val. Например после 2-10 преобразования.

Seg_7_Set_P ind_num
Включает точку на индикаторе с порядковым номером = ind_num

Seg_7_Reset_P ind_num
Выключает точку на индикаторе с порядковым номером = ind_num

Seg_7_Reset_P ind_num
Инвертирует текущее значение точки на индикаторе с порядковым номером = ind_num

Del_Null arr_ptr, null_size
Убирает null_size незначащих нулей в массиве с адресом arr_ptr, начиная с 0-ого элемента.

Использование переменных библиотеки

seg_7_arr
Массив текущих значений индикаторов. В него записывается то, что нужно вывести на индикаторы.
Например, для вывода 1234, в seg_7_arr записываем 1, в seg_7_arr+.1 - 2, и т.д..
movlw   .1           ; На первый индикатор
movwf   seg_7_arr    ; Цифру 1
movlw   .2           ; На второй индикатор
movwf   seg_7_arr+.1 ; Цифру 2
movlw   .3           ; На третий индикатор
movwf   seg_7_arr+.2 ; Цифру 3
movlw   .4           ; На четвёртый индикатор
movwf   seg_7_arr+.3 ; Цифру 4


Для создания собственных символов необходимо, в файле "7_seg.asm", в таблицу добавить свои значения.
Таблица:
_TABLE   
;==============================================================================
; Таблица значений сегментов
;==============================================================================
                addwf       PCL,F       ;
                retlw       b'00111111' ; ..FEDCBA = 0
                retlw       b'00000110' ; .....CB. = 1
                retlw       b'01011011' ; .G.ED.BA = 2
                retlw       b'01001111' ; .G..DCBA = 3
                retlw       b'01100110' ; .GF..CB. = 4
                retlw       b'01101101' ; .GF.DC.A = 5 or S
                retlw       b'01111101' ; .GFEDC.A = 6
                retlw       b'00000111' ; .....CBA = 7
                retlw       b'01111111' ; .GFEDCBA = 8
                retlw       b'01101111' ; .GF.DCBA = 9
                retlw       b'00000000' ; ........ = 10 пробел
                retlw       b'01000000' ; .G...... = 11 символ "минус"

Как видно, по мимо цифр 0-9, добавлено ещё 2 символа - пробел и минус. Коды их соответсвуют порядковому номеру в таблице (10,11).
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#2 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 07 Сентябрь 2011 - 19:57

Двоично-десятичное преобразование

Прикрепленный файл  bin_2_10.rar (1,35К)
Количество загрузок:: 257
В проект должны быть добавлены оба файла.

Подключение библиотеки
#include "bin_2_10.inc"

Далее, все настройки производятся в файле "bin_2_10.inc"

#include     <p16F628a.inc> ; Подключение inc-файла текущего МК
В этой строке выбирается inc-файл используемого чипа.

#define     BIN_2_IN_SIZE    x    ; Размер входных 10-данных в байтах
В этой строке указывается размер входной переменной. Где x - это размер в байтах

#define     BIN_2_OUT_SIZE   x    ; Размер выходных 2-10-данных в байтах
В этой строке указывается размер выходных данных в байтах. Т.е. полученный 2-10 результат преобразования. Где x - это размер в байтах

Библиотека имеет одну единственнкю процедуру
Bin_2_10  In_Var_Adres, Out_Var_Adres

Где :
In_Var_Adres - это адрес входной переменной.
Out_Var_Adres - это адрес массива, в который нужно укладывать результат преобразования.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#3 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 07 Сентябрь 2011 - 20:03

Пример использования двух, вышеупомянутых, библиотек.
Прикрепленный файл  7_seg.rar (79,29К)
Количество загрузок:: 280
В примере инкрементируется 2-х байтная переменная, преобразуется в 2-10 значение, гасятся незначащие нули и выводится на 7-сегментный индикатор.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#4 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 11 Сентябрь 2011 - 20:51

Delay_(Us/Ms)

Задержка в микросекундах/миллисекундах.

Прикрепленный файл  delay.rar (930байт)
Количество загрузок:: 262
В проект должны быть добавлены оба файла.

В файле delay.inc, в строке
#define   X_FREQ    .4       ; Частота кварца в Мгц
необходимо указать частоту чипа в МГц.

Процедуры библиотеки

Delay_Us val
Задержка в микросекундах. Зацикливает программу на val мкс.
Delay_Us  .100   ; Задержка 100 микросекунд


Delay_Ms val
Задержка в миллисекундах. Зацикливает программу на val мс.
Delay_Ms  .1000  ; Задержка 1 секунда


Пример использования
Прикрепленный файл  Delay_s.rar (15,26К)
Количество загрузок:: 258


Хочу напомнить, что подобные задержки не будут точными при наличии прерываний.
Без наличия прерываний, точность задержек = 1 такту.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#5 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 11 Сентябрь 2011 - 21:27

1-Wire

Прикрепленный файл  1_wire.rar (2,28К)
Количество загрузок:: 327
В проект должны быть добавлены все четыре файла. Использует вышеупомянутую библиотеку для задержек.

Процедуры библиотеки

Wire_1_Reset
Сбрасывает устройство и возвращает факт его наличия на линии, в 0-ом бите аккумулятора (WREG).
Пример:
call      Wire_1_Reset
andlw     0x01
btfsc     STATUS, Z
goto      no_devise
.....
; Устройство есть на линии
; Дальнейшайя работа с устройством
.....
no_devise


Wire_1_Write Code
Посылает в устройство команду Code.
Пример:
Wire_1_Write   0x44      ; Посылаем команду преобразования температуры
.....
Wire_1_Write   0xCC      ; Обращаемся ко всем девайсам. Команда пропуска ROM
Wire_1_Write   0xBE      ; Посылаем команду чтения температуры
.....


Wire_1_Read
Чтение байта из устройства. Возвращает считанный байт в аккумуляторе (WREG).
Пример:
Wire_1_Read              ; Читаем из устройства младший байт температуры
banksel   temp           ;
movwf     temp + .1      ;
Wire_1_Read              ; Читаем из устройства старший байт температуры
banksel   temp           ;                 
movwf     temp           ;



Пример использования библиотеки.
Прикрепленный файл  obj.rar (82,32К)
Количество загрузок:: 404
Пример считывает температуру из DS18B20 и выводит её на индикатор.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей