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

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

uldemir писал(а): Можно ли в выражении LATEbits.RE1 = 1 единицу в "RE1" заменить определением DISP_RW ?


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

#define DISP_RW LATEbits.RE1 
...
DISP_RW = 1;
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Нет, я хочу всего и много. Чтобы этот DISP_RW можно было использовать и в контексте LATE = (1<<DISP_RW); и LATEbits.DISP_RW = 1;

Пока что я сделал два дефайна, но хочется чего-то изящного.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

uldemir писал(а):Нет, я хочу всего и много. Чтобы этот DISP_RW можно было использовать и в контексте LATE = (1<<DISP_RW); и LATEbits.DISP_RW = 1;


А можете объяснить рациональность сей блажи ?
Я так понимаю изобреДается драйвер HD44780 .
Мне хватает определений в хэдере , только это для XC8 .
Глюков Hi tech и MC18 мне уже хватило ...

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

#define RS LA5
 #define EN LA4
 #define LCD_DAT LATA
 #define LCD_DAT_IN PORTA


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

#define strob_EN EN=1;__delay_us(5);EN=0;

void lcd_send(unsigned char com,unsigned char  dat)
{
 
  if(com)RS=1;
  else  RS=0;
 
  LCD_DAT= (LCD_DAT & 0xF0)|((dat>>4)& 0x0F);
  strob_EN
  LCD_DAT=(LCD_DAT & 0xF0)|(dat & 0x0F);
  strob_EN
  __delay_ms(1);
}
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Драйвер для 44780 не изобретается, а просто приведен как пример для тех, кто ни что иное не способен воспринять. я рад что вы заметили знакомый кусок кода.

Мне хочется понять идеологию. до этого писал на ассемблере и не было разницы как писать

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

movlw   (1 << GIE) | (1<<T0IE)
movwf   intcon
или

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

bsf   intcon, T0IE
bsf   intcon, GIE
и мне не требовалось никаких дополнительных объявлений.
Аналогичную систему я обнаружил, когда начал писать на C для MSP430 кристалла. Можно написать

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

P1DIR = P0 | P1 | P2 | P3 | P5 ;
и можно так:

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

P1DIR_bits.P0 = 1;
Поэтому микрочиповская система меня немного ввела в ступор и хочется понять, какие соглашения тут приняты.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

uldemir писал(а):Поэтому микрочиповская система меня немного ввела в ступор и хочется понять, какие соглашения тут приняты.


Для начала просмотрите хэдер с описанием регистров для вашего компилятора .
Вот первый попавшийся- PIC18F44K20.h
Спойлер

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

extern volatile near unsigned char       PORTB;
extern volatile near union {
  struct {
    unsigned RB0:1;
    unsigned RB1:1;
    unsigned RB2:1;
    unsigned RB3:1;
    unsigned RB4:1;
    unsigned RB5:1;
    unsigned RB6:1;
    unsigned RB7:1;
  };
  struct {
    unsigned INT0:1;
    unsigned INT1:1;
    unsigned INT2:1;
    unsigned CCP2:1;
    unsigned KBI0:1;
    unsigned KBI1:1;
    unsigned KBI2:1;
    unsigned KBI3:1;
  };
  struct {
    unsigned AN12:1;
    unsigned AN10:1;
    unsigned AN8:1;
    unsigned AN9:1;
    unsigned AN11:1;
    unsigned PGM:1;
    unsigned PGC:1;
    unsigned PGD:1;
  };
  struct {
    unsigned FLT0:1;
    unsigned C12IN3M:1;
    unsigned :1;
    unsigned C12IN2M:1;
  };
  struct {
    unsigned :1;
    unsigned C12IN3N:1;
    unsigned :1;
    unsigned C12IN2N:1;
  };
} PORTBbits;


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

extern volatile near unsigned char       LATB;
extern volatile near struct {
  unsigned LATB0:1;
  unsigned LATB1:1;
  unsigned LATB2:1;
  unsigned LATB3:1;
  unsigned LATB4:1;
  unsigned LATB5:1;
  unsigned LATB6:1;
  unsigned LATB7:1;
} LATBbits;


То есть только битовые поля . Если посмотрите хэдер того же камня от XC8 - есть и битовые поля и маски .
Хотите того же в MC18 - генерите свой хэдер ...
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Ну хедеры-то я смотрел, потому и удивился, может что-то не доглядел. Однако понятно. Попробую скачать XC8. Только не нужна ли ему среда MPLAB X? И будет ли работать Free версия (не вник, что там про 60 дней написано) всегда.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

в старом мплабе работает аж свистит, пурген существует.
Chettuser

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

Сообщение Chettuser »

После 60-ти дней отключается оптимизация - код распухает и ещё несколько неудобств...
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Chettuser писал(а): код распухает и ещё несколько неудобств...


Во первых не надо ля-ля , не так он и "распухает".
Во вторых уже давно есть лекарство и только ленивый им не воспользовался.
В третьих некоторые кичась о оптимизации в то же время юзают sprintf ,printf и прочее . :))) ..
Chettuser

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

Сообщение Chettuser »

Пожалуй снизойду до ответа "злому коту" :))) :
1. Распухает и еще как. До 40% (это из реальной жизни, не моей, на всякий случай предупрежу Вашу иронию).
2. Про лекарство человек не спрашивал, он спрашивал про "60 дней..."
3. Да, я люблю оптимизацию, но sprintf, printf и их огрызки уже давно не использую.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Chettuser писал(а):Пожалуй снизойду до ответа "злому коту" :))) :
1. Распухает и еще как. До 40% (это из реальной жизни, не моей, на всякий случай предупрежу Вашу иронию).

Нормальный код не распухает .
И зачем утруждать себя писаниной если даже не пользуешь продукт ??????

Free

Изображение

Pro

Изображение

При бОльшем объеме кода будут те же 2-3% максимум 5-6% .
Я о том что для DIY-фентифлюшек, коими здесь 90% балуются - совсем и не критично ...
Chettuser

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

Сообщение Chettuser »

Угу, 5-7% Flash под DIY, жирновато как то. Можно камень попроще поюзать и проще с потрохами.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Ну я то уж точно "лекарства" юзать не буду. Это супротив моей идеологии. А то что код "пухнет" так это пофиг. Можно взять кристалл повместительней или подумать лучше об организации проекта. Этот C18 я тоже пользую бесплатный без оптимизации. Да и Ц не самоцель, а просто удобный макроассемблер.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

идеология идеологией, но tester рассказывал о глюках eval версий, которые не связаны с оптимизацией. Он так плотно занимался компиляторами, что не верить ему у меня нет оснований.
Я пару раз натыкался на глюки и вылеченных версий - микрочиповцы настолько часто апгрейдят компиляторы, что толком тестировать их нет времени, похоже. :)
Было забавно, когда глюк вылез на демонстрации работы девайса клиенту. :)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

urry, Приветствую, пропажа !!!! :)))

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

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

Сообщение urry »

у меня на gentoo даже иксов нет - :) один астериск стоит :) я 3 года работал с в конторе, где приходилось аддоны и апликейты под него писать. И по работе требовалось, чтобы там иксы не мешали.
Chettuser

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

Сообщение Chettuser »

urry, а как охарактеризуете "иксы" в общем? Еще большая лажа чем родные старые? :) (хотел услышать типа "ребята старались...").
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

здесь не опеннет ру, к теме "программирование пик на си" вопрос никакого отношения не имеет. Если в двух словах - дело не только в иксах - как только что-то доводят до ума. так сразу его ломают и на его место ставят что-то принципиально новое и не совсем работающее. Эта ситуация возмутила самого Линуса - было гневное письмо с его стороны. :)
Все, дальше не будем по этой теме.
LijkbezorgeR
Родился
Сообщения: 1
Зарегистрирован: Пн ноя 11, 2013 19:42:20

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

Сообщение LijkbezorgeR »

Здравствуйте уважаемые знатоки! Может не по теме (прошу извините меня)!
Совсем недавно познакомился с программированием PIC на MicroCPro и вопрос следующий :
Мне нужно что бы мой PIC16f877 считал входящие импульсы (беру для этого TMR1) и еще вести счет секунд (беру для этого TMR0 )
результаты должны быть показаны на дисплее! Если писать отдельно для каждой задачи программу ( делал это в силу того , что новенький) то они работают отлично , а если соединить их в одну то счета секунд нету , вернее на дисплее остается 0.
Помогите, будьте добры!
Вот коды:
Эта считает секунды и выводит их :
Спойлер

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

sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
int ms,sec;
char st[5];

void interrupt (void);
void IT (void);
void IMST (void);
void UTC (void);

void main() {
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"sec=");
Lcd_Out(2,1,"1234567890");
IMST();
while(1)
{
if (ms == 0)
{
inttostr(sec,st);
Lcd_Out(1,5,st);
}
UTC ();
}
}

void interrupt (void)
{
if (T0IF)
{
TMR0 = 0x08;
T0IF_bit = 0;
ms++;
}
}

void IT(void)
{
Option_reg = 0xc1;
T0IE_bit = 1;
GIE_bit = 1;
}

void IMST (void)
{
IT();
}

void UTC (void)
{
if (ms == 1000)
{
sec++;
ms = 0;
}
}


Эта считает импульсы и выводит их :
Спойлер

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

sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;

void main (void)
{
unsigned long cp,x1,x2;
unsigned char st[8];
unsigned char i,j,lcd[7];

TRISC = 0xFF;
TRISA = 0xFF;

Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Pulse");
Lcd_Out(2,1,"Counter");
Delay_ms(100);

TMR1H = 0x00;
TMR1L = 0x00;
T1CON = 0b00110011;

while(1)
         {
        Lcd_Cmd(_LCD_CLEAR);
        Lcd_Cmd(_LCD_CURSOR_OFF);
        x1 = TMR1L ;
        x2 = TMR1H;
        cp = x1 + (x2*256);
        intToStr(cp,st);
        Lcd_Out(1,1,st);
        }
}


Ну а вот они вместе :
Спойлер

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

sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;

int ms,sec;

void inter (void);
void IT   (void);
void IMST (void);
void UTC  (void);

void main (void)
{
int cp,x1,x2,i,j;
char st[4],ss[5],lcd[5];
TRISC = 0xFF;
TRISA = 0xFF;
TRISB = 0;
PORTB = 0x00;

Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"1234567890");
Delay_ms(500);

IMST();

TMR1H = 0x00;
TMR1L = 0x00;
T1CON = 0b00110011;

while(1)
{
       if (ms == 0)
       {
       intToStr(sec,st);
        j=0;
       for (i=0; i<=11; i++)
       {if (st[i] != ' ')
       {lcd[j] = st[i];
       j++;
       }
       }
       Lcd_Out(2,6,st);
       }
      UTC();
      x1 = TMR1L;
      x2 = TMR1H;
      cp = x1 + (x2*256);
      intToStr(cp,ss);
      Lcd_Out(2,0,ss);
}
}


void inter (void)
{
if (T0IF)
   {
   TMR0=0x08;
   T0IF_bit =0 ;
   ms++;
   }
}

void IT (void)
{
Option_reg = 0xc1;
T0IE_bit = 1;
GIE_bit = 1;
}

void IMST (void)
{
IT();
}

void UTC (void)
{
if (ms == 1000)
{
sec++;
ms = 0;
}
}
Последний раз редактировалось Аlex Вт ноя 12, 2013 09:04:25, всего редактировалось 2 раза.
Причина: -
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

Может потому что прерывание не выполняется из-за неправильного написания void inter (void), вместо void interrupt (void)
Ответить

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