Моя мечта приступить к началу, но все времени нету, добраться до магазина радиодеталей, чтобы купить запчасти для программатора.
Увы, но если на ноутбуке нету COM то это плохо :(.
А с USB есть проблемы. Потому, решил начать с программирования. Сам я программирую на C++, точнее я бы сказал, что учусь программировать. Но увы микроконтроллеры (далее МК) программируют на ассемблере, C и BASIC. Потому пошарился в инете и нашел интересную ссылку о программировании на C МК Microchip. Я решил попробовать с простого, коли у меня завалялось два МК, то для начала я хочу сделать так, чтобы эта программа пахала для моего PIC16F873.
При легком изменении программы, а точнее я поменял в исходном тексте 16f627 на 16f873 в строках:
Увы, но если на ноутбуке нету COM то это плохо :(.
А с USB есть проблемы. Потому, решил начать с программирования. Сам я программирую на C++, точнее я бы сказал, что учусь программировать. Но увы микроконтроллеры (далее МК) программируют на ассемблере, C и BASIC. Потому пошарился в инете и нашел интересную ссылку о программировании на C МК Microchip. Я решил попробовать с простого, коли у меня завалялось два МК, то для начала я хочу сделать так, чтобы эта программа пахала для моего PIC16F873.
При легком изменении программы, а точнее я поменял в исходном тексте 16f627 на 16f873 в строках:
Также для компиляции программы я использовал команду:/* Define processor and include header file. */ #define __16f627 #include"pic/pic16f627.h"
sdcc --debug -mpic14 -p16f873 main.c
В итоге компилятор заматюгался:
main.c:25: error 20: Undefined identifier '_ER_OSC_CLKOUT'
main.c:26: error 20: Undefined identifier '_MCLRE_ON'
main.c:25: error 2: Initializer element is not constant
main.c:25: error 2: Initializer element is not constant
Открываем заголовочный файл, для данного МК в моей системе (Kubuntu 11.10) оный находится по адресу: /usr/share/sdcc/include/pic/
Первое, что привлекло мой взгляд:
This header file defines configurations, registers, and other useful bits of
// information for the PIC16F873 microcontroller.
Этот заголовочный файл определяет конфигурацию, регистры, и другие полезные функции.
Нас интересует конфигурация.
Первое строка, которую мы получили при компиляции гласит о нестыковке тактового генератора, видать тип ER мой МК не поддерживает ищем замену, среди 4 возможных вариантов тактирования МК (это мы увидели в заголовочном файле):
#define _LP_OSC 0x3FFC
#define _XT_OSC 0x3FFD
#define _HS_OSC 0x3FFE
#define _RC_OSC 0x3FFF
Поясню, LP – низкочастотный кварцевый резонатор (малое энергопотребление)
XT – кварцевый/керамический резонатор
HS – высокочастотный кварцевый/керамический резонатор
RC – внешний резистор/конденсатор
Я в своей схеме планирую использовать кварцевый резонатор. Потому _ER_OSC_CLKOUT поменяю на _HS_OSC.
Теперь перейдем к cбросу по включению питания POR:
_MCLRE_ON
Во-первых в заголовочном файле такого просто не оказалось, во вторых, если я правильно понял, этот тип сброса для данного МК всегда включен. В документации не нашел способ включить или выключить тип сброса, но везде написано, что он есть. По этому просто удаляем эту строку.
Пытаемся скомпилировать:
sdcc --debug -mpic14 -p16f873 main.c
message: using default linker script "/usr/share/gputils/lkr/16f873.lkr"
warning: relocation of section "UDL_idata_0" failed, relocating to a shared memory location
warning: relocation of section "ID_idata_0" failed, relocating to a shared memory location
получили предупреждение, что перемещение секции таких то оказалось неудачным. Получен hex файл, я подумал неинтересно просто изменить МК, поменяем программу.
Во первых создадим функцию delay. Ну разумеется прежде я поискал есть ли оная в заголовочных файлах, зато если посмотреть массу примеров эту функцию часто можно встретить, это задержка. Слава богу не месячных у девушки :).
Потом определим, что будет делать наша программа, пусть по нажатию кнопки подцепленной на RB0 будет инвертироваться состояние RB1.
Притом надо учесть дребезг контакта, максимальное время дребезга которое я встречал это 100 мс или 0,1 с. :(
В итоге вот, не судите строго в первый раз такое пишу ибо студент и я только учусь :):
/*toggle_led.cMicah Carrick - email@micahcarrick.com04.25.2005Toggles an LED on Pin 1 of PORTB on a PIC16F627. Writtenas a sample for the article on using SDCC and GPSIM inLinux. http://www.micahcarrick.com/v2/content/view/14/4/Compile: sdcc --debug -mpic14 -p16f627 toggle_led.cSimulate: gpsim -pp16f627 -s toggle_led.cod toggle_led.asmThis program was modified Russian student.Compile: sdcc --debug -mpic14 -p18f873 main.c*//* Define processor and include header file. */#define __16f873#include"pic/pic16f873.h"/* Setup chip configuration */typedef unsigned int config;config at 0x2007 __CONFIG = _CP_OFF &_WDT_OFF &_BODEN_OFF &_PWRTE_OFF &_HS_OSC &_LVP_OFF;#define b1 0x02 /* pin 1 on PORTB */#define B_OUTPUTS 0xFD /* value used to setup TRISB */void delay(int count);unsigned int temp;unsigned int i;void main(void) {/* PORTB.1 is an output pin */TRISB = B_OUTPUTS;while(1) { /* Loop forever */delay(1000);RB3 = ~RB3;temp=RB0; //Изначально это 0delay(1000);
/*после первого нажатия на кнопку, temp как и RB0 станет равным единице условие не сработает, в итоге условие срабатывает лишь по изменению сигнала с 0 на 1 */
if((RB0) && (!temp))RB1=~RB1;}}void delay(int count){i=0;while (i<count)i++;}
Из особенностей синтаксиса, которые я заметил, этот С на дух не переваривает статические переменные объявленные внутри функций :(. А это очень удобная штука, но увы в этом С все глобально.
На выходе я получил hex файл, но и предупреждения от компилятора и линковщика следующего вида:
main.c:44: warning 180: using ~ on bit/bool/unsigned char variables can give unexpected results due to promotion to intmain.c:49: warning 180: using ~ on bit/bool/unsigned char variables can give unexpected results due to promotion to intmessage: using default linker script "/usr/share/gputils/lkr/16f873.lkr"warning: relocation of section "UDL_idata_0" failed, relocating to a shared memory locationwarning: relocation of section "UDL_main_0" failed, relocating to a shared memory locationwarning: relocation of section "UD_main_0" failed, relocating to a shared memory locationwarning: relocation of section "UD_main_1" failed, relocating to a shared memory locationwarning: relocation of section "ID_idata_0" failed, relocating to a shared memory location
Комментариев нет:
Отправить комментарий