среда, 9 ноября 2011 г.

PIC и Linux

Моя мечта приступить к началу, но все времени нету, добраться до магазина радиодеталей, чтобы купить запчасти для программатора.
Увы, но если на ноутбуке нету 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.c
 Micah Carrick - email@micahcarrick.com
 04.25.2005
 Toggles an LED on Pin 1 of PORTB on a PIC16F627. Written
 as a sample for the article on using SDCC and GPSIM in
 Linux. http://www.micahcarrick.com/v2/content/view/14/4/
 Compile: sdcc --debug -mpic14 -p16f627 toggle_led.c
 Simulate: gpsim -pp16f627 -s toggle_led.cod toggle_led.asm
 This 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; //Изначально это 0
 delay(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 int
main.c:49: warning 180: using ~ on bit/bool/unsigned char variables can give unexpected results due to promotion to int
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 "UDL_main_0" failed, relocating to a shared memory location
warning: relocation of section "UD_main_0" failed, relocating to a shared memory location
warning: relocation of section "UD_main_1" failed, relocating to a shared memory location
warning: relocation of section "ID_idata_0" failed, relocating to a shared memory location







Комментариев нет:

Отправить комментарий