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

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

Подскажите, где я не прав? Нужно сделать тахометр. Вроде как и ничего сложного, но не могу получить четкого значения выдержки по времени через таймер.
PIC16F874A

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

#include "htc.h"
#include "pic.h"
__CONFIG (LP & WDTDIS & PWRTEN & LVPDIS & PROTECT);
#define _XTAL_FREQ 16000000
#define D0 RB0
#define bs(var, bitno) ((var) |= 1UL << (bitno))
#define bc(var, bitno) ((var) &= ~(1UL << (bitno)))

unsigned int n, count, freq, d1;
bit cnt_rd=0;

void interrupt encod (void){
   if (INTF){
      INTF=0;
      count++;
      }   
   if (T0IF) {
      T0IF=0;
      TMR0=100;      //предустановка таймера для 10мс
      n=count;
      count=0;
      cnt_rd=1;
      }

}
void init (void){
   OPTION=0b01000111;
   PORTA=0;
   PORTB=0;
   PORTC=0;
   PORTD=0;
   PORTE=0;
   TRISA=0b00101111;
   TRISB=255;
   TRISC=0;
   TRISD=0;
   TRISE=0b00000100;
   ADCON1=6;
   INTCON=0b10110000;
   TMR0=7;
}

void main(void){
   init ();
   while (1){
   if (cnt_rd) {
   freq=83.34*n/10;
   cnt_rd=0;
   d1=freq;
      }   
   }
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Во первых, не понятно, что означает фраза
не могу получить четкого значения выдержки по времени через таймер
Разъясните подробнее.
Во вторых. У Вас в выражении freq=83.34*n/10; используются числа с точкой, а переменные имеют целый тип.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Аlex писал(а):Во вторых. У Вас в выражении freq=83.34*n/10; используются числа с точкой, а переменные имеют целый тип.

А ты ничего не путаешь??? :))
Неявное преобразование типов... и что???
А вот с превышением разрядной сетки... это да, лажа... при n = 65535 там будет явный бред...
По хорошему freq должно быть unsigned long...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

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

Сообщение drakon »

Всем привет! посоветуйте пожалуйста простой компилятор Cи для pic (типа как CVAVR для AVR). завалялось несколько pic12f, надо их в дело пустить.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

HHIMERA писал(а):А ты ничего не путаешь??? :))
Да нет, ничего.
Может в данном случае всё явно приведётся и посчитается нормально, но с таким подходом к программам, в другом случае, можно ненароком и "в лужу сесть" :) Напишет когда-нибудь своё выражение таким образом : freq=n/10*83.34; , подумав, что всё нормально, и пипец :)) Хотя в обоих случаях, при типе переменной n = float, результат будет одинаковым.


to drakon. Что значит "простой" ?
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

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

Сообщение drakon »

не IAR.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Аlex писал(а):Да нет, ничего.

Неужели??? :))
Может в данном случае всё явно приведётся и посчитается нормально

Во первых... не "может", а приведётся, правила приведения знать надобно...
Напишет когда-нибудь своё выражение таким образом : freq=n/10*83.34; , подумав, что всё нормально, и пипец :)) Хотя в обоих случаях, при типе переменной n = float, результат будет одинаковым.

Во вторых... одинаковым, но неправильным... превышение сетки...
В третьих... n может использоваться ещё где-то... жирновато будет для float...
В четвёртых... приведение типа можно сделать прямо в строке...
И в пятых... в случае ХайТеч... будет разный размер кода...
:tea:
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

Аlex писал(а):Во первых, не понятно, что означает фраза
не могу получить четкого значения выдержки по времени через таймер
Разъясните подробнее.

В строке "TMR0=100; //предустановка таймера для 10мс" ставлю брекпоинт, и протеус каждые раз разные значения показывает, т.е. в цикле ровно 10мс не получается, соответственно значение переменной count меняется на 1. Как получить стабильное значение в 10мс? Если убрать прерывание по входу, то все нормально. Или на данном контроллере невозможно так точно сделать?

Аlex писал(а):Во вторых. У Вас в выражении freq=83.34*n/10; используются числа с точкой, а переменные имеют целый тип.

Ну с этим гораздо проще, не заморачивайтесь. Вообще идеально было бы получить отсчет по таймеру в 1 секунду, и тогда freq=n/12, но там у меня вообще засада, погрешность слишком большая получается.
LuckyLex
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс окт 25, 2009 14:21:55

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

Сообщение LuckyLex »

Повторил код из учебника. использую 12ф629, среда CCS
некорректно работает код дребезга контактов, на нажатие нормально срабатывает, но после отжатия светодиод не перестаёт гореть, не пойму , что нет так. С подтяжкой всё, ок, думал может внутренние резисторы не вкл. Добавил на 12к, при нажатии кнопки падает напряжение до 1.8, после отжатия поднимается обратно до 4.9в
Подскажите пожалуйста)
Спойлерvoid main()
{

unsigned char sGPIO; // shadow copy of GPIO
unsigned char db_cnt; // debounce counter


// Initialisation
setup_counters(RTCC_INTERNAL,RTCC_DIV_1); // enable weak pull-ups
output_a(0); // start with LED off
sGPIO = 0; // update shadow

// Main loop
while (TRUE) {
// wait until button pressed (GP3 low), debounce by counting:
for (db_cnt = 0; db_cnt <= 10; db_cnt++) {
delay_ms(10); // sample every 1 ms
if (input(PIN_A4) == 1) // if button up (GP3 high)
db_cnt = 0; // restart count
} // until button down for 10 successive reads

// toggle LED on GP1
sGPIO ^= 0b000100; // flip shadow GP1
output_a(sGPIO); // write to GPIO

// wait until button released (GP3 high), debounce by counting:
for (db_cnt = 0; db_cnt <= 10; db_cnt++) {
delay_ms(10); // sample every 1 ms
if (input(PIN_A4) == 0) // if button down (GP3 low)
db_cnt = 0; // restart count
} // until button up for 10 successive reads

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

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

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

Добавил на 12к, при нажатии кнопки падает напряжение до 1.8, после отжатия поднимается обратно до 4.9в
Подскажите пожалуйста)
А программа тут причём ? И тем более язык Си :)
LuckyLex
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс окт 25, 2009 14:21:55

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

Сообщение LuckyLex »

Аlex писал(а):
Добавил на 12к, при нажатии кнопки падает напряжение до 1.8, после отжатия поднимается обратно до 4.9в
Подскажите пожалуйста)
А программа тут причём ? И тем более язык Си :)

Всмысле? наоборот показываю, что хардварно всё нормально, если вдруг возникнут вопросы о железе

upd сейчас всё нормально заработало, хз что было не так, наврено где-то отходило что-то)
Аватара пользователя
money21
Встал на лапы
Сообщения: 92
Зарегистрирован: Сб апр 03, 2010 19:30:17
Откуда: СПб

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

Сообщение money21 »

Господа! Использовал два примера из набора mikroC.
Один из них - про индикацию на двух 7-сегментных дисплеях, второй - про преобразование десятичного числа в маску для индикатора.
Но у меня число в маску не превращается и так и уходит на порт. В чём ошибка?
Спасибо!
Спойлер

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

int v, por1, por2, j, x, num;

int mask(int num) {
  switch (num) {
    case 0 : return 0x3F;
    case 1 : return 0x06;
    case 2 : return 0x5B;
    case 3 : return 0x4F;
    case 4 : return 0x66;
    case 5 : return 0x6D;
    case 6 : return 0x7D;
    case 7 : return 0x07;
    case 8 : return 0x7F;
    case 9 : return 0x6F;
  } //case end
}//~


void interrupt() {
  if (v==0) {
    PORTB = por2;      //  send mask for digit 3 to portb
    PORTA = 1;         //  turn on 1st 7 seg., turn off 2nd
    v = 1;
  } else {
    PORTB = por1;      //  send mask for digit 8 to portb
    PORTA = 2;         //  turn on 2nd 7 seg., turn off 1st
    v = 0;
    }
  TMR0 = 0;            //  clear TMRO
  INTCON = 0x20;       //  clear TMR0IF and set TMR0IE
  x = 1;
}//~

void main() {

  trisC = 0;
  OPTION_REG  = 0x80;   // pull up resistors
  PORTA       =   0;    // clear porta (make sure both displays are off)
  TRISA       =   0;    // designate porta pins as output
  PORTB       =   0;    // clear portb (make sure LEDs are off)
  TRISB       =   0;    // designate portb pins as input
  TMR0        =   0;    // clear TMRO
  j = mask(x);
  por1        =  j;
  por2        =  j;
  portC = 2;
  INTCON      = 0xA0;   // enable T0IE
  //wait for interrupt
}//~!
inSERter
Родился
Сообщения: 7
Зарегистрирован: Чт сен 24, 2009 09:12:32

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

Сообщение inSERter »

drakon писал(а):Всем привет! посоветуйте пожалуйста простой компилятор Cи для pic (типа как CVAVR для AVR). завалялось несколько pic12f, надо их в дело пустить.


Присоединяюсь к вопросу. Да этого ассемблил, теперь пора и Си знать. Требования к компилятору следующие (в порядке приоритета):

1. Работа с PIC 10/12/16/18
2. Максимальное соблюдение стандартов
3. Безглючность
4. Наличие библиотек работы с LCD, цифровыми датчиками и подобной периферией.
5. Возможность с минимальным головняком портировать код на другие платформы, AVR, например, который тоже планирую изучать (данное требование пока неприоритетно, так, на будущее).

Есть ли на данный момент что-либо, отвечающее моим хотелкам? Не хочется наступать на грабли в самом начале. Пока определился с тройкой лидеров: Hi-Tech, CCS PCWHD, ну и microC вроде. Родной микрочиповский, как я понял, не работает с младшими камнями 10/12/16.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Пункт 4 противоречит остальным .
По остальным подходит XC8 , CCS только при условии не юзанья встроенных функций и фич .
Да и изучать надо просто Си а не Си для каких то конкретных МК .
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

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

Сообщение Alex_EXE »

Не знаю на сколько уместен такой вопрос - но всё же:
Не могли бы, пожалуйста, подсказать, направить - где бы можно раздобыть последнею или предпоследнею версию Hi-Tech компилятора, желательно PRO версию, для PIC микроконтроллеров 12/16 серии. А то последнее время что-то много они достаточно вкусных камушков навыпускали, а мой инструментарий для работы с ними устарел. Да и может оптимизацию улучшили и на старые камушки удастся больше впихнуть всяких плюшек. Сейчас использую 9.7 версию.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

MPLAB XC, тот-же хайтек. На сайте всегда найдёте самую последнюю версию. Лекарство существует, ищите в сети.
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

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

Сообщение Alex_EXE »

Спасибо за наводку, что-то не обратил внимания.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7358
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Вопрос к съевшим собаку на MPLAB C 18.
Я тут избалован ИАРовским компилятором под MSP430 и у меня не получается такая конструкция:

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

ADCON0 = (1<<VCFG0) | (0b0000<<CHS0) | (1<<ADON);

Понятно, что эти названия битов надо применять как

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

ADCON0bits.VCFG0 = 1;
ADCON0bits.CHS = 0;
ADCON0bits.ADON = 1;
Но это три команды... как написать внятно это одной командой? Какие соглашения приняты в этом компиляторе?

И еще: допустим, биты порта определены как #define DISP_RW 1. Можно ли в выражении LATEbits.RE1 = 1 единицу в "RE1" заменить определением DISP_RW ?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

В МСС18 так не получится, т.к. слова VCFG0, CHS0 и ADON не задефайнены, а обращение к этим битам идёт через структуры.
Тут два варианта. Либо пользоваться битовыми полями, как Вы привели выше, либо дефайнить слова и подставлять их в своё выражение.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7358
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Это очень печально.
Ответить

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