Речь пойдет о том, как создать связку файлом *.lib - *.h для использования в основной Си программе как готовую библиотеку кода для CodeVisionAVR 1.25.3 (думаю и с другими версиями работать будет).
•    Создаем пустой файл с определенным именем и расширением *.lib - например structs.lib
•    Открываем его обычным блокнотом или специализированным с подсветкой синтаксиса (очень удобный вариант).
Светодиодная мигалка
К примеру, задача: на выбраном порту, скажем PORTC, нужно устанавливать и сбрасывать первый разряд PC0 используя две Си команды, определенными из библиотеки structs.h, о которой речь пойдет ниже.
Код файла structs.lib выглядит так:
#asm
.equ __io_direction=__io_port-1 // указываем из основной программы порт, который
// будет использован
// #asm
//         .equ __io_port=0x15; PORTC
// #endasm
#endasm

// функция для установки разряда Pn0  в лог. 1
void io_enable(void){
#asm // директива указывает на ассемблерную вставку
sbi __io_port,0 // выглядит как sbi 0x15,0
#endasm // конец ассемблерной вставки
}

// функция для установки разряда Pn0  в лог. 0
void io_disable(void){
#asm
cbi __io_port,0
#endasm
}

Теперь создаем заголовочный файл с расширением *.h - structs.h
Его надо указывать из основной Си программы как - #include <structs.h>
Код заголовочного файла structs.h выглядит так:

// что именно не разобрался, но так надо
#ifndef _structs_INCLUDED_
#define _structs_INCLUDED_
#pragma used+
// функции, которые будут указаны в программе
void io_enable(void);
void io_disable(void);
#pragma used-
#pragma library structs.lib // ссылка на библиотеку *.lib
#endif

Основная программа:

// CodeVision AVR 1.25.3
#include <mega8.h>
#asm
.equ __io_port=0x15;PORTC // Какой порт используется
#endasm
#include         // указываем заголовочный
//файл, который написан выше
#include <delay.h>
void main(void){
DDRC=0x01;
while(1){
io_enable();  // устанавливаем разряд PC0
delay_ms(100);
io_disable(); // Сбрасываем разряд PC0
delay_ms(100);
}
}

Библиотека *.lib может быть с любым количеством кода, который программист пишем для решения определенных задач. Можно, к примеру, создать библиотеку для работы с внешней памятью ОЗУ (SRAM) или, к примеру, для функционального пред-устройства на МК, который будет подключен к основному устройству и по командам будет осуществляться работа:

init();
set();
reset();
write();
read();
disable();
enable();

Спасибо за внимание, желаю успехов!

Автор: Skiff

 

Добавить комментарий


Защитный код
Обновить