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

Поклонники продукции Microchip Technology Inc тусуются тут.
Yoda
Родился
Сообщения: 3
Зарегистрирован: Пт июн 13, 2014 18:14:47

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

Сообщение Yoda »

Аlex писал(а):Потому что вектор не один. Без перехода никак.
Ещё более запутался. Мы ведь как-раз находимся в подпрограмме InterruptVectorHigh. Это вектор высокого приоритета.

--------------

Это, наверное, потому, что тупо процедура обработки прерывания не влезет между 0x08 и 0x18 ?
Последний раз редактировалось Аlex Пн июн 16, 2014 12:59:32, всего редактировалось 2 раза.
Причина: ---
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

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

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

Сообщение Kvasshtain »

Доброго времени суток уважаемый Alex. Юстас на связи :music: :write: :)) .
Да нет, Вы не поняли. Функция принимает не таблицу CRC, а указатель на массив байтов для которых нужно посчитать CRC (они то не константы). В этой функции таблица используется как параметр (точнее сказать элементы массива используются как параметры). Их то как раз и надо делать константами. Но хоть ты тресни, при таком раскладе что то происходит с указателем на них, и таблица читается как нули. Я боюсь, что наш дорогой Hitech думает, что получающийся указатель ссылается на область RAM, а должен на ROM. Хотя я возможно и ошибаюсь. Я думаю, что надо что то сделать именно вот в этой строчке кода (где используется эта злополучная таблица)

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

CRC = CRCTABLE[*(ByteOffset + Count) ^ (CRC & 0xff)];
Тут надо как то сказать компилятору, что эта таблица лежит в ROM-е (flahs-е). Но как это сделать не пойму. Пробовали мы и через указатели. Не помогает.
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Ага, понял... В передаваемом массиве значения для смещения в таблице. Тогда проблем не должно быть.
Попробовал Ваш код у себя, всё нормально.
Код:
Спойлер

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

#include    "htc.h"


/***********************************************************************************************************************/
struct  {
    unsigned char   RxCRC;
    unsigned char   arr[50];
}ModBus;

/***********************************************************************************************************************/
/*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
      };
/***********************************************************************************************************************/
/***********************************************************************************************************************/
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;
}
/***********************************************************************************************************************/

/***********************************************************************************************************************/
void main(){
unsigned char i;

for(i=0;i<sizeof(ModBus.arr);i++)  ModBus.arr[i]=i;

CalcCRC(ModBus.arr, sizeof(ModBus.arr));

while(1);
}
Скриншоты (обратите внимание на выделенное красным) :
СпойлерИзображение
СпойлерИзображение
И с константной таблицей, и без, работает одинаково :dont_know:
HI-TECH PICC18 9.50
Вложения
crc_const.png
(64.23 КБ) 729 скачиваний
crc_no_const.jpg.png
(60.18 КБ) 785 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Kvasshtain
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Ср фев 09, 2011 13:29:01
Откуда: г.Саратов

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

Сообщение Kvasshtain »

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

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

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

Всё отлично :
test_table.png
(55.46 КБ) 381 скачивание
Реклама
Аватара пользователя
Kvasshtain
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Ср фев 09, 2011 13:29:01
Откуда: г.Саратов

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

Сообщение Kvasshtain »

Юстес Алексу, Юстес Алексу :music: :write: . АААААА!!! У меня мозг взрывается. В отладчике все ОК. Но стоит прошить и опять та же хрень. Ставишь const, шлет в UART нули, убираешь все нормально. Может я какой конфигурационный бит неправильно воткнул. Или у меня мозги не той стороной воткнуты. :facepalm: :dont_know:
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Chettuser

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

Сообщение Chettuser »

Народ, я Си знаю плохо. Объясните что такое указатели?
И чем отличаются записи:

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

unsigned int tmp;

// запись
unsigned char *p=(unsigned char*)&tmp;
EEPROM_WRITE(0,*p++);
EEPROM_WRITE(1,*p++);

// чтение
unsigned char *p=(unsigned char*)&tmp;
*p++ = EEPROM_READ(0);
*p++ = EEPROM_READ(1);
от простой записи:

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

EEPROM_WRITE(0,tmp);
EEPROM_WRITE(1,tmp);
зачем здесь *p++ ? И как с этим работать?
Сколкьо ни читал - так нигде толком и не написано что это такое и нет толковых примеров.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Если совсем кратко...

При определении переменных...
type var - var это переменная типа type
type * var - var это переменная для хранения адреса переменной типа type

При обращении к переменным...
var - просто значение переменной var
*var - значение переменной по адресу var
&var - адрес переменной var

(*var)++ - инкремент значения
*var++ - инкремент адреса
"Я не даю готовых решений, я заставляю думать!"(С)
Chettuser

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

Сообщение Chettuser »

Применительно к практике - не доходит что то... :oops:
Пример выше.
Аватара пользователя
Pavel_1978
Опытный кот
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

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

Сообщение Pavel_1978 »

До меня дошло после прочтения этого то что там про AVR значения не имеет. Так как это СИшные фишки и они одинаковы для всего.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Chettuser писал(а):Применительно к практике - не доходит что то... :oops:
Давал ссылку неоднократно ,
Прочтение сего http://lib.ru/CTOTOR/starterkit.txt совместно с K&R крайне обязательно ...
Chettuser

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

Сообщение Chettuser »

Про указатели прояснилось, но применительно к коду:

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

unsigned char *p=(unsigned char*)&tmp;
ничего не ясно - для чего жестко извращаться с указателями если в выхлопе все равно значение переменной?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Chettuser писал(а):в выхлопе все равно значение переменной?
Небольшая оговорочка - значение неизвестной переменной !
Указатель нужен для того, чтобы обратиться к заранее неизвестной переменной по её адресу. Всё просто до некуда :)"
HHIMERA писал(а):*var++ - инкремент адреса
Немного дополню - инкремент адреса с предварительным взятием значения."
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Аlex писал(а):Немного дополню - инкремент адреса с предварительным взятием значения."
Кэп ? :))) Хотя нет - куда, чего взятия ? :))))))))
Последний раз редактировалось dosikus Вс июн 22, 2014 11:27:00, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

dosikus писал(а):Кэп ? :)))
Не понял :roll:
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Чего не понял ?
То что ты счас напрочь запутаешь Chettuser? :)))
Твое дополнение очевидно для записей.

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

EEPROM_WRITE(1,*p++);
Взятие с постинкрементом адреса.
Очевидно, потому и Кэп...
На то что ссылаешься - нет , там тупо инкремент адреса .
Последний раз редактировалось dosikus Вс июн 22, 2014 12:54:05, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

dosikus писал(а):Твое дополнение очевидно для записей

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

EEPROM_WRITE(1,*p++);
Ну естественно, я дополнял только для его примера. Чтобы ему было понятнее что происходит.
dosikus писал(а):То что ты Chettuser счас напрочь запутаешь ?
Чем ? Фразой "предварительное взятие значения" ? Не думаю, что ему непонятна эта фраза :)
dosikus писал(а):На то что ссылаешься - нет , там тупо инкремент адреса .
На сколько мне известно, инкремент адреса - , а не А "*" - взятие значения по указателю.
Или я ошибаюсь ? :)
Chettuser

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

Сообщение Chettuser »

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

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

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

Использовать или нет указатели - дело сугубо личное. Если считаете, что без них обойдётесь, тогда лучше не использовать.
В Вашем примере оба варианты разные. Функция (ну или макрос, не важно) EEPROM_WRITE принимает значение одного байта, а переменная tmp имеет тип - int. Теперь подумайте, для чего там нужен указатель :)
Ответить

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