Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
Kvasshtain
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Ср фев 09, 2011 13:29:01
Откуда: г.Саратов

Re: Програмирование pic на СИ.

Сообщение Kvasshtain »

Дело не в датащите на PIC. А в том, что в разных компиляторах это делается по разному. В STM-ке не зависимо от компилятора, подключаешь заголовочник скаченный с официального сайта и вперед. Тут же какой-то трындец. Даже сравнивая заголовочники для одного и того же контроллера в разных версиях одного и того же компилятора (уж не говорю о разных) поражавшийся этим дебилизмом. Вот пример: взял два компилятора от HI-TECH. Один версии 9.50, другой версии 9.66. Во-первых в версии 9.50 нет отдельного заголовочника для PIC18F2620, а есть только для PIC18F4620, в котором написано нижеследующее:

Код: Выделить всё

/* header file for the MICROCHIP PIC18 microcontroller
   PIC18F2525
   PIC18F2620
   PIC18F4525
   PIC18F4620
 */


, а у 9.66 PIC18F2620 выделен отдельно.
Затем для примера смотрим в сами заголовочники. Вот как заданы дефайны для битов регистра TRISC в версии 9.50

Код: Выделить всё

static volatile near unsigned char   TRISC      @ 0xF94;


и чуть ниже

Код: Выделить всё

/* Definitions for TRISC register */
static volatile near bit   TRISC0      @ ((unsigned)&TRISC*8)+0;
static volatile near bit   TRISC1      @ ((unsigned)&TRISC*8)+1;
static volatile near bit   TRISC2      @ ((unsigned)&TRISC*8)+2;
static volatile near bit   TRISC3      @ ((unsigned)&TRISC*8)+3;
static volatile near bit   TRISC4      @ ((unsigned)&TRISC*8)+4;
static volatile near bit   TRISC5      @ ((unsigned)&TRISC*8)+5;
static volatile near bit   TRISC6      @ ((unsigned)&TRISC*8)+6;
static volatile near bit   TRISC7      @ ((unsigned)&TRISC*8)+7;


А вот как у 9.66

Код: Выделить всё

// Register: TRISC
extern volatile unsigned char           TRISC               @ 0xF94;
extern volatile unsigned char           DDRC                @ 0xF94;
// bit and bitfield definitions
extern volatile bit TRISC0              @ ((unsigned)&TRISC*8)+0;
extern volatile bit TRISC1              @ ((unsigned)&TRISC*8)+1;
extern volatile bit TRISC2              @ ((unsigned)&TRISC*8)+2;
extern volatile bit TRISC3              @ ((unsigned)&TRISC*8)+3;
extern volatile bit TRISC4              @ ((unsigned)&TRISC*8)+4;
extern volatile bit TRISC5              @ ((unsigned)&TRISC*8)+5;
extern volatile bit TRISC6              @ ((unsigned)&TRISC*8)+6;
extern volatile bit TRISC7              @ ((unsigned)&TRISC*8)+7;
//extern volatile bit RC0                @ ((unsigned)&TRISC*8)+0;
//extern volatile bit RC1                @ ((unsigned)&TRISC*8)+1;
//extern volatile bit RC2                @ ((unsigned)&TRISC*8)+2;
//extern volatile bit RC3                @ ((unsigned)&TRISC*8)+3;
//extern volatile bit RC4                @ ((unsigned)&TRISC*8)+4;
//extern volatile bit RC5                @ ((unsigned)&TRISC*8)+5;
//extern volatile bit RC6                @ ((unsigned)&TRISC*8)+6;
//extern volatile bit RC7                @ ((unsigned)&TRISC*8)+7;
extern union {
    struct {
        volatile unsigned TRISC0              : 1;
        volatile unsigned TRISC1              : 1;
        volatile unsigned TRISC2              : 1;
        volatile unsigned TRISC3              : 1;
        volatile unsigned TRISC4              : 1;
        volatile unsigned TRISC5              : 1;
        volatile unsigned TRISC6              : 1;
        volatile unsigned TRISC7              : 1;
    };
    struct {
        volatile unsigned RC0                 : 1;
        volatile unsigned RC1                 : 1;
        volatile unsigned RC2                 : 1;
        volatile unsigned RC3                 : 1;
        volatile unsigned RC4                 : 1;
        volatile unsigned RC5                 : 1;
        volatile unsigned RC6                 : 1;
        volatile unsigned RC7                 : 1;
    };
} TRISCbits @ 0xF94;


это меня сначала сильно запутало. Т.к. в примерах чаще всего к отдельному пину обращаются как TRISCbits.RC1 например, а не TRISCbits. TRISC1. Не я конечно понимаю, что могу это все сам сделать, но на фиг тогда такой компилятор с такими библиотеками. Да, жалко мне тех людей которые пишут код под одним компилятором, а потом у них ни фига не работает на другом.

Да кстати, обратили внимание на:

Код: Выделить всё

extern volatile unsigned char           TRISC               @ 0xF94;
extern volatile unsigned char           DDRC                @ 0xF94;


Это наверное накарябали когда в 2008 Microchip хотела Atmel под себя подмить. Наверное заранее готовились :))) .
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Програмирование pic на СИ.

Сообщение dosikus »

Kvasshtain , в чем сакральный смысл, юзая старые компиляторы , обсирать их? :)))
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Kvasshtain писал(а):Скорее всего Вам помогло вот это:

Код: Выделить всё

__CONFIG(1, [b]HSPLL [/b]& FCMDIS & IESODIS);


По поводу откуда конфиг брать - вечером сброшу файлик, где их смотреть.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Chettuser писал(а):По поводу откуда конфиг брать - вечером сброшу файлик, где их смотреть.
Зачем что-то скидывать ? В заголовочном файле нужного чипа задефайнены все конфиги. Открываем и смотрим :)
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Ок, не буду. Просто есть такой файлик (у меня по адресу C:\Program Files (x86)\Microchip\MPLABC18\v3.45\doc) Называется hlpPIC18ConfigSet.chm. Уж очень мне он понравился - все и в одном месте! На PIC16 бы такой же!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Chettuser, у человека HI-TECH стоит, а Вы про MCC18 говорите :)

Называется hlpPIC18ConfigSet.chm
Кстати, очень хороший мануал :write:
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Програмирование pic на СИ.

Сообщение HHIMERA »

Kvasshtain писал(а): В STM-ке не зависимо от компилятора, подключаешь заголовочник скаченный с официального сайта и вперед. Тут же какой-то трындец.

Угу... сколько этот кусок кода из рабочего проекта под STM8L даст ошибок???

Код: Выделить всё

    TIM3->ETR  |=  (TIM_ETR_ETPS_0 | TIM_ETR_ETPS_1); // ETRP frequency divided by 8 
    TIM3->ETR  |= TIM_ETR_ECE;            // External clock enable

    TIM3->SMCR  |= (TIM_SMCR_TS_0);                     // TS=001
    TIM3->SMCR  |= (TIM_SMCR_SMS_0 | TIM_SMCR_SMS_2);   // SMS=101 Gated mode

Даже сравнивая заголовочники для одного и того же контроллера в разных версиях одного и того же компилятора (уж не говорю о разных) поражавшийся этим дебилизмом.

Ничего необычного... Надо различать Hi-Tech до Микрочипа и после... Да и список чипов в новых версиях компилятора увеличивался...
чаще всего к отдельному пину обращаются как TRISCbits.RC1 например, а не TRISCbits. TRISC1. Не я конечно понимаю, что могу это все сам сделать, но на фиг тогда такой компилятор с такими библиотеками.

Все эти обращения, ващета... чиста расширения компилятора... и никакого отношения к СИ не имеют... Вот такие конструкции и ухудшают переносимость кода...
Да, жалко мне тех людей которые пишут код под одним компилятором, а потом у них ни фига не работает на другом.

А зачем говорить за всех??? Пишите правильно... и никаких проблем...
Важна, по сути, идея... суть, принцип...
Да кстати, обратили внимание на:

Код: Выделить всё

extern volatile unsigned char TRISC @ 0xF94;
extern volatile unsigned char DDRC @ 0xF94;


Это наверное накарябали когда в 2008 Microchip хотела Atmel под себя подмить. Наверное заранее готовились :))) .

Никакого отношения, в данном случае, DDRC к Atmel не имеет... Это атавизм от PIC17...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
Ilyazh
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср май 21, 2014 13:18:07
Откуда: Санкт-Петербург
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Ilyazh »

Здравствуйте. Подскажите пожалуйста, почему используя код №1 при подключении осциллографа длительности импульса примерно равны установленным, а при использовании кода №2 отличаются в разы (18 и 9 против 46 и 24 мкс)

Код №1

Код: Выделить всё

#define IRLED LATD.B5
void main() {
   while(1) {
      IRLED = 1;
      Delay_us(9);
      IRLED = 0;
      Delay_us(17);
   }
}

Код №2

Код: Выделить всё

#define IRLED LATD.B5

void out_one(int delay);

void main() {
   while(1) out_one(26);
}

void out_one(int delay) {
   intcurrTime = 0;
   int ledState = 1;
   while(currTime < delay) {
      IRLED = ledState;
      if(ledState == 1) {
          Delay_us(9);
          currTime += 9;
      } else {
          Delay_us(17);
          currTime += 17;
      }
      ledState = ~ledState;
}
}
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

DelayUS считается исходя из объявленной частоты кварца. А у Вас какая?
Аватара пользователя
Kvasshtain
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Ср фев 09, 2011 13:29:01
Откуда: г.Саратов

Re: Програмирование pic на СИ.

Сообщение Kvasshtain »

Здравствуйте уважаемые Коты. Тут у меня опять не все слава богу :cry: . Я вродя разобрался с конфигурированием. Начали с товарищем воять устройство с протоколом modbus. Как известно там надо считать CRC. Заюзали табличный способ. Как полагается забили массив с атрибутом const, откомпилили, а он читается как нули. Убираешь атрибут const все хорошо. Ни кто не сталкивался с таким странным поведением компиляторов от Hi-tech? У меня возникло подозрение, что мы к этому массиву не правильно обращаемся. Ведь он при использовании атрибута const оказывается во flash-е. И я думаю, что надо это потом как то компилятору говорить. Блин, хоть ассемблерную вставляй. Главное что пиккитом проверяем флеш на наличие этого злополучного массива и он там на месте. В чем дело не пойму. :cry:
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Покажите как обращаетесь к массиву. Кусок кода выложите.
Аватара пользователя
Kvasshtain
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Ср фев 09, 2011 13:29:01
Откуда: г.Саратов

Re: Програмирование pic на СИ.

Сообщение Kvasshtain »

Здравствуйте уважаемый Alex. Благодарю за то что откликнулись.
Вот код:

Код: Выделить всё

const unsigned short  CRCTABLE[256] =
      {
         0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
         0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
         0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
         0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
         0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
         0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
         0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
         0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
         0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
         0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
         0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
         0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
         0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
         0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
         0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
         0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
      };

, а потом вот как я к нему обращаюсь.

Код: Выделить всё

//----------
//  CRC
//----------
void CalcCRC (unsigned char *ByteOffset, unsigned char ByteNumber)
{
    //*CRC = CRCTABLE[DataByte ^ (*CRC & 0xff)] ^ (*CRC >> 8);
    unsigned int CRC = ModBus.RxCRC;
    unsigned char Count = 0;
    for(Count = 0; Count < ByteNumber; Count++)
    {
        CRC = CRCTABLE[*(ByteOffset + Count) ^ (CRC & 0xff)];
      
      CRC ^= CRC >> 8;
      
    }
    ModBus.RxCRC = CRC;
}

Убираешь слово Const и все заводится. Но так же не правильно. Я использую тупо под массив драгоценную оперативку.
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Kvasshtain писал(а):Убираешь слово Const и все заводится
Его нужно наоборот добавлять :)

Код: Выделить всё

void CalcCRC (const unsigned char *ByteOffset, unsigned char ByteNumber){
  .......
}
Дело в том, что функция принимает указатель на область RAM (ОЗУ), а Вы в неё передаёте указатель на flash. Отсюда и неработоспособность.

PS: Кстати, размер одного элемента таблицы = 2 байта, а в функцию Вы принимаете unsigned char, т.б. 1 байт. Компилятор не материт Вас по этому поводу ? :)
Yoda
Родился
Сообщения: 3
Зарегистрирован: Пт июн 13, 2014 18:14:47

Re: Програмирование pic на СИ.

Сообщение Yoda »

Доброго времени суток. Прошу помощи!!

Контроллер PIC18F2520. Компилятор С18.
Кнопка подключена на RB0. Подтяжка 100кОм к земле.
Светодиод подключен на RC4.

Ситуация такая. Не срабатывает прерывание.
1) После первого нажатия на кнопку - бит INTCONbits.GIE слетает в ноль и больше в единицу не устанавливается. Пускай я его даже вручную пытаюсь установить в единицу в основном цикле.
2) Флаг INTCON.INT0IF не сбрасывается в ноль. Даже вручную. Мерял пин RB0 тестером - на нём ноль, если кнопка не нажата.

Просто отдельно проверял и кнопку и светодиоды. С этим проблем нету. Обидно, что даже в стм32 я запустил прерывания, а в пике не получается ((
Поиск по форуму не дал результата.

Кстати, заметил ещё, что иногда пишут interrupt isr. Но C18 ругается на это.

#include <p18f2520.h>
#include <delays.h>
#define Delay Delay10KTCYx
#define LED LATCbits.LATC4
#define BUT PORTBbits.RB0

void interrupt (void)

{

if (INTCONbits.INT0IF == 1)
{
LED = ~LED;
INTCONbits.INT0IF = 0;
}
}
//---------- MAIN ----------

void main ()
{
OSCCONbits.IRCF = 0b100; // osc 1 mHz
RCONbits.IPEN = 0; // приоритет прерываний выкл.

ADCON1bits.PCFG = 0b1111; // все пины цифровые
TRISCbits.TRISC4 = 0; // Пин светодиода выход.
TRISBbits.TRISB0 = 1; // Пин кнопки вход.
INTCONbits.GIE = 1; // Глобальное вкл прерываний.
INTCONbits.PEIE = 0; // Прерывания от переферии.
INTCONbits.INT0IE = 1; // INT0 = RB0

while (1)
{
Delay(1);
}

} // ---------- MAIN ----------
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение urry »

Код: Выделить всё

#include <p18f2520.h>
#include <delays.h>
#define Delay Delay10KTCYx
#define LED LATCbits.LATC4
#define BUT PORTBbits.RB0



#pragma config PWRT = ON, BOREN = OFF, BORV = 3
#pragma config WDT = OFF
#pragma config MCLRE = ON
#pragma config PBADEN = OFF
#pragma config LVP = OFF
#pragma config XINST = OFF // Extended Instruction Set
//=================

void InterruptHandlerHigh (void);

#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
   _asm
      goto InterruptHandlerHigh //jump to interrupt routine
      _endasm
}
// High priority interrupt routine
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
      if (INTCONbits.INT0IF)
   {
      LED = ~LED;
      INTCONbits.INT0IF = 0;
   }
}
//---------- MAIN ----------

void main ()
{
   OSCCONbits.IRCF = 0b100; // osc 1 mHz
   RCONbits.IPEN = 0; // приоритет прерываний выкл.
   
   ADCON1=7;// все цифровое // все пины цифровые
   TRISCbits.TRISC4 = 0; // Пин светодиода выход.
   TRISBbits.TRISB0 = 1; // Пин кнопки вход.
   INTCONbits.GIEH = 1; // Глобальное вкл прерываний.
   INTCONbits.GIEL = 1; // Глобальное вкл прерываний.
   
   INTCONbits.PEIE = 0; // Прерывания от переферии.
   INTCONbits.INT0IE = 1; // INT0 = RB0
   while (1)
   {
      Delay(1);
   }

} // ---------- MAIN ----------
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Yoda Перебирайтесь на XC8/16/32. Все равно скоро MPLAB традиционной ориентации закроют. На официальном сайте уже нету - в архиве только.
Аватара пользователя
Kvasshtain
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Ср фев 09, 2011 13:29:01
Откуда: г.Саратов

Re: Програмирование pic на СИ.

Сообщение Kvasshtain »

Спасибо Alex за ответ. Нет не материт. Нам как раз и надо обращаться к одной половинке двух байт. Указатели на то и существуют. А как этому чуду от Hi-tech сказать что у нас ROM, а не RAM? Может я мануал на компилятор невнимательно смотрел, но там ни чего не нашел.
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Kvasshtain писал(а):А как этому чуду от Hi-tech сказать что у нас ROM, а не RAM?
Я же, вроде бы как, уже написал :
void CalcCRC (const unsigned char *ByteOffset, unsigned char ByteNumber){
.......
}
Или так тоже не работает ?
Yoda
Родился
Сообщения: 3
Зарегистрирован: Пт июн 13, 2014 18:14:47

Re: Програмирование pic на СИ.

Сообщение Yoda »

void InterruptHandlerHigh (void);

#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
// High priority interrupt routine
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
if (INTCONbits.INT0IF)
{
LED = ~LED;
INTCONbits.INT0IF = 0;
}
}


Да уж, код закрученный. Взорвал мозг.

1) А почему нельзя обработчик сразу сделать в Interruptvectorhigh?
2) #pragma code ведь относится к #pragma code InterruptVectorHigh = 0x08? А почему тогда нету #pragma code после #pragma interrupt InterruptHandlerHigh?
3) Что вообще означает #pragma interrupt InterruptHandlerHigh? Ведь из interuptvectorhigh программа сразу прыгает в Interrupthandlerhigh.
Последний раз редактировалось Yoda Пн июн 16, 2014 12:48:12, всего редактировалось 2 раза.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Yoda писал(а):[почему нельзя обработчик сразу сделать в Interruptvectorhigh?
Потому что вектор не один. Без перехода никак.
Ответить

Вернуться в «PIC»