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

Поклонники продукции Microchip Technology Inc тусуются тут.
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

Я так и не понял как объяснить компилятору какая функция есть обработкой прерываний.
Chettuser

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

Сообщение Chettuser »

В MCC18 я вот так делал:

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

void MyHighInt (void);
void MyLowInt (void);
#pragma interrupt MyHighInt
#pragma code high_vector=0x08
void high_vector (void)
{_asm goto MyHighInt _endasm}

#pragma interruptlow MyLowInt
#pragma code low_vector=0x18
void low_vector (void)
{_asm goto MyLowInt _endasm}

#pragma code
void MyHighInt(void)
{
   INTCONbits.TMR0IF = 0;
if (PORTBbits.RB4 ==1)
{
   PORTBbits.RB4 = 0;
   Delay10KTCYx (5);
}
//   WriteTimer0( 0 );
}

void MyLowInt(void)
{
   
}

AndyKorg
Встал на лапы
Сообщения: 93
Зарегистрирован: Пт янв 07, 2011 08:52:08
Откуда: Санкт-Петербург

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

Сообщение AndyKorg »

misterkuk писал(а):Я так и не понял как объяснить компилятору какая функция есть обработкой прерываний.

Если вопрос про AVR-Libc то там прерывания объявляются так:

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

ISR(ИМЯ_ПРЕРЫВАНИЯ){
   какой-то код
}

что писать вместо ИМЯ_ПРЕРЫВАНИЯ можно посмотреть в avr/interrupt.h
Например срабатывание таймера 0 по совпадению с регистром сравнения для ATmega328p:

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

ISR(TIMER0_COMPA_vect){
   Какой-то код
}
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

Работаю с пик. Компилятор HI-TECH Software. во всех функциях обработки прер. что я видел есть ччастичка int. если она есть то значит прерывание уходит в эту функцию. Или как?
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

прерывание уходит на адрес 4, ключевое слово interrupt - компилятор размещает функцию именно по этому адресу - и включает код, сохраняющий - восстанавливающий контекст прерывания.
interrupt void my_name(void)
{
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

То что нада. именно это и хотел услышать:) спс.
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

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

Сообщение БАТАРЕЙКУС »

доброе время суток коты.
я программирую PIC-и на асеммблере, сейчас пытаюсь програмировать на Си в HI-TECH, вопрос вот в чём, имеется результат преоброзований АЦП он в пике лежит в 2-х байтах да ктомуже в 2-х банках. а как мне его переправить в переменную типа << int >>.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
FlySnake
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Пт ноя 20, 2009 20:38:12
Откуда: Калининград (Koenigsberg)
Контактная информация:

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

Сообщение FlySnake »

БАТАРЕЙКУС писал(а):доброе время суток коты.
я программирую PIC-и на асеммблере, сейчас пытаюсь програмировать на Си в HI-TECH, вопрос вот в чём, имеется результат преоброзований АЦП он в пике лежит в 2-х байтах да ктомуже в 2-х банках. а как мне его переправить в переменную типа << int >>.

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

unsigned int adc_res;
....
adc_res=(ADRESH<<8)+ADRESL;

Всё остальное компилятор делает сам.
Это в случае если результат АЦП "Right justified". Если хочется Left justified догадайся сам ;)
Вообще в комплекте с компилятором (в папке samples) идёт коллекция примеров с подробными коментариями практически по всем основным темам.
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

Ребят, разобрался с прерываниями. Терь тупик. Немогу сделать 1 секундное прерывание. кварц часовой, предделитель 128.
256*128=32768. Тоесть всё чётко ии ббез заморочек. Но в протеусе порт у меня моргает Гдето рас в 2-3 сикунды. Это тошо протеус глючится или чтото не так делаю?

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

#include <pic.h>
__CONFIG (LP & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS);
unsigned long    seconds;
void  interrupt timer0_isr (void)
{
T0IF=0;

      if (PORTB==0)
      PORTB=255;
      else
      PORTB=0;

}

void pauza (void){ // начало переменная
unsigned int x; // локальная
x = 20000; // в tmp поместить некое максимальное число
while (x-->0);
}// конец функции

void podgot (void)
{
TRISA = 0b11110000; // направление работы ножек порта А
TRISB = 0b00000000; // направление работы ножек порта В
CMCON = 0x07; // отключение компараторов
PORTA = 0; // очищаем порт А
PORTB = 0; // очищаем порт Б
RBPU = 1;  // подтягивающие R (0-вкл, 1-выкл)
OPTION = 0b10010110;
T0CS = 0; // внутренний тактовый сигнал
T0IE = 1; //разрешить прерывания от TMR0
GIE = 1; //разрешить глобальные прерывания

}
void main (void)
{
podgot ();
TMR0=0;
while (1)
{

}
}
FlySnake
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Пт ноя 20, 2009 20:38:12
Откуда: Калининград (Koenigsberg)
Контактная информация:

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

Сообщение FlySnake »

Таймер инкрементируется не по тактовой частоте кварца, а каждый машинный цикл, т.е. оная частота делённая на 4. Поэтому предделитель нужен 32.

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

if (PORTB==0)
      PORTB=255;
      else
      PORTB=0;

Проще PORTB=~PORTB;
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

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

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

Сообщение urry »

Да кто же Вам запретит ... А где вопрос ?
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

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

Сообщение БАТАРЕЙКУС »

ооо спасиибо FlySnake. оказывается всё очень просто. спасибо за помощь.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

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

Сообщение Roman Venom »

недельку пробую PIC C18. С кнопочками/мигалочками всё получилось сразу. Потом решил подрубить ЖКИ. Использовал для этого официальные библиотеки. Всё работает, кроме ф-ции для вывода строки:

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

putrsXLCD ('Hello World');

И она нифига не работает у меня... Делал и по примеру и не по примеру... на ЖКИ она ничего не выводит. Объясните, пожалуйста, как её правильно использовать, а то выводить по символу ещё дольше чем на асме :))
П.С. Интересует именно эта библиотека, хочу понять в чём дело.
Вложения
putrsXLCD.png
(49.99 КБ) 411 скачиваний
Успех - императив!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

А так ?
const rom char *cBuf="HELLO";

putrsXLD(cBuf);

лично я этими не пользуюсь, все равно для русификации надо менять.
FlySnake
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Пт ноя 20, 2009 20:38:12
Откуда: Калининград (Koenigsberg)
Контактная информация:

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

Сообщение FlySnake »

Двойные кавычки для строковой константы нужны, а у вас одинарные как для отдельного char-а. Чесно говоря не знаю как C18 это проглатывает, но по-хорошему это фишка Си.
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

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

Сообщение Roman Venom »

urry
const rom char *cBuf="HELLO";

putrsXLСD(cBuf);

Вот испробовал. Результат ложно-положительный :)). Выводит только первый символ строки.

лично я этими не пользуюсь, все равно для русификации надо менять.

Дописать нужные символы не проблема.


Вот собсно вся программа...

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

#include <p18f4550.h>
#include <delays.h>
#include <xlcd.h>
//#include <openxlcd.c>
#pragma config LVP = OFF
#pragma config PLLDIV = 1
 #pragma config FOSC = XT_XT
#pragma config FCMEN = OFF
#pragma config PWRT = ON
#pragma config WDT = OFF
#pragma config MCLRE = OFF

////////
#define led_yellow PORTAbits.RA0
#define knopka PORTAbits.RA1
////////
unsigned char counter;
const rom char *cBuf="HELLOW";

////////
void setting_ports (void)
{
 ADCON1 = 0xFF;
 TRISA = 0b00000010;
 TRISB = 0x00;
 PORTB=0x00;
}
////////
void proverka (void)
{
if (knopka == 0)

Delay10KTCYx (25), led_yellow = 1;

else led_yellow=0, PORTB=0xff;
}
////////
void main (void)
{

setting_ports ();
OpenXLCD (FOUR_BIT&LINES_5X7);
while(BusyXLCD());
WriteCmdXLCD (SHIFT_DISP_LEFT);
while(BusyXLCD());
SetDDRamAddr (0x40);//адрес 0х40
while(BusyXLCD());
WriteDataXLCD (0x70);//вывести "Р"
while(BusyXLCD());

putcXLCD(*cBuf);//выводит первый символ строки и всё...
putrsXLCD(cBuf);//вообще ничего



   ////////
   while (1)
   {   
   proverka ();
   }
}




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

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

Сообщение urry »

что-то мне подсказывает, что дело не в компиляторе, какие-то времянки не выдержаны, паузу сделайте, что же там выводить..
void lcd_puts(const rom char *s)
{
char chByte;
do{
chByte=*s++;
WriteDataXLCD(chByte);
}while(chByte);
}
Вложения
lcd.zip
(1.44 КБ) 267 скачиваний
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

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

Сообщение Roman Venom »

urry
Не работает, хоть ты тресни. Скачал другую библиотеку - всё сразу и без проблем. На выходных залезу в ту библиотеку, попытаюсь разобраться. Спасибо, что откликнулись! Это не последний мой вопрос по С :tea:
Успех - императив!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

мне как-то трудно озадачиться проблемой - та хрень, что я выложил, работает и в проте, и в железе, зачем как бы искать приключений....
работает - не трогай ! вот мой девиз... :)
Ответить

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