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

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Есть проект на PIC16F1825. Программа почти написана, но загвоздка в средствах компиляции.
Используются IDE - MPLABX (тот, что переделанный МикроЧипом Эклипс) и компилятор HI-TECH PICC 9.71.
Истек срок пробной версии и компилятор стал генерить ужасные неоптимизированные бинарники.
Искал альтернативу, но так и не нашел. (С PICами дела особо не имел)

Внимание вопрос: Есть ли нормальный бесплатный компилятор Си для PICов?
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

XC8
За 60 дней успеете?
MPLAB® XC Free Edition:
Supports all the devices and commands of the Standard and PRO Editions
No time or memory restrictions
Limited code optimizations
Unrestricted use—ideal for a low-cost academic or commercial solution
Allows for all the code optimization and commands of the PRO Edition for 60 days – you decide when to turn it on.
An option to activate the use of the PRO Edition features and optimizations is included. After 60 days, the compiler will revert back to the levels of the Free Edition
http://www.microchip.com/pagehandler/en ... s/mplabxc/
Не успеете - пурген для сабжа можно найти.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Думаю, что успею. Пока сделал по другому. Поставил на VMware WinXP и поставил все это добро туда. Появились лишние 45 дней.

Интересно, почему в коллекции GCC нет компилятора под ПИКи?

ЗЫ: Надеюсь, больше с ПИКами не столкнусь.
I am DX168B and this is my favourite forum on internet!
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

Chettuser писал(а):PORTB=1; - пишет в RB0 единицу.
А RB0 у Вас на вход оформлен.

Всегда писал и имел в виду что PORTB=1; равносильно PORTB=0b11111111; Все биты в регистре PORTB устанавливаются в 1.
Даже если TRISB = 0b11111111; и в теле прописать PORTB=1; то ничего не происходит и состояние ног не меняется, мало того они в протеусе висят в 3м состоянии.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

DX168B писал(а):Интересно, почему в коллекции GCC нет компилятора под ПИКи?

Есть SDCC http://sdcc.sourceforge.net/
Chettuser

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

Сообщение Chettuser »

misterkuk писал(а):Даже если TRISB = 0b11111111; и в теле прописать PORTB=1;

Ну дык тем более и не будет ничего меняться :)) TRISB же настроен как 0b00000001 (или как 0b11111111 в последнем случае) - т.е. первый разряд порта (это RB0) будет как ВХОД (или в последнем случае все разряды на вход), а Вы пытаетесь туда затолкать "1" вот этим:
эта запись равносильна

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

PORTB=0b00000001

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

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

Сообщение misterkuk »

Понятное дело, что в порт, настроенный на вход, ничего вывести не получится. :tea:
Я ж за что... но у меня и в порт настроен на выход командой PORTB=1; тоже не записывается. Хотя раньше я часто так делал и всё работало.
Chettuser

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

Сообщение Chettuser »

Порт на выход настраивается не командой PORTB, а командой TRISB = 0 :))
А PORTB = 1 - это всего лишь установление уровня лог. "1" на ножке RB0 порта, настроенного как выход.

По TRISx, символично:
1 - это равносильно I (Input - вход)
0 - это равносильно O (Output - выход)
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

Собрал тахометр. сигнал потаю на INT. Всё показывает, но при частоте входящей меньше 31Гц на выходе каша и вообще не работает. 31Гц и выше- всё пучком. Посмотрите, будьте добры, что не так? и как можно повысить стабильность, при смене значений заметно мерцание цифр. и цыфры при постоянной частоте немного скачут .
Спойлер

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

#include <pic.h>
#include <delay.h>
__CONFIG (0x3F10);

#ifndef   XTAL_FREQ
#define   XTAL_FREQ   4MHZ      /* Crystal frequency in MHz */
#endif
#define   led1   RA0
#define   led2   RA4
#define   led3   RA3
#define   led4   RA1
#define   led5   RA2
int   tmr1temp;
int   tmr1temp2;
int   tmppodc;
int   tmppr;
long  tmp;
int  num1;
int  num10;
int  num100;
int  num1000;
int  num10000;
int  hello;
void podgot (void)
{
CMCON = 0x07; // отключение компараторов.
TRISA = 0b00000000; // направление работы ножек порта А.
TRISB = 0b00000001; // направление работы ножек порта В.
RBPU = 1;
PORTA = 0; // очищаем порт А
PORTB = 0; // очищаем порт Б.
led1=1;
led2=1;
led3=1;
led4=1; 
led5=1;
// OPTION BIT
T0CS=0; // внутренний сигнал clockout для tmr0
PSA=0; //Предделилель включён перед TMR0
PS2=1;
PS1=1;
PS0=1;
T0IE=0; // Прерывание от TMR0 запрещено
RBPU = 1;  // подтягивающие R (0-вкл, 1-выкл).
INTEDG = 0; //Прерывания INT по пер. фронту.
T0SE = 1; // per фронт преращения сигнала.
//T1CON BIT
T1CKPS1 = 0;
T1CKPS0 = 0; //предделитель 1:1
T1OSCEN = 0; // внутренний тактовый генератор выкл.
T1SYNC = 1; // не синхронизировать внешний сигнал
TMR1CS = 0; // Внутреннй источник тактового сигнала.
TMR1ON = 1; // таймер включен.
INTE=1;
///////////////////////////////////////////////////
TMR2ON = 1; // таймер включен.
T2CKPS1=1;
T2CKPS0=1;

/////////
RBIE=0; // разрешение прерывания  от RB4:RB7
TMR1IE = 1; // прерывание от 1 таймера on.
tmp=0;
tmppodc=0;
hello=0;
GIE = 1; //разрешить глобальные прерывания .
PEIE = 1;// Разрешить прерывание от перефирийных модулей.
}
////////////////////////////
unsigned int arr_seg2[4]=
{
0b10111010, // H
0b11010110, // E
0b10010100, // L
0b11111100, // O
};
//////////////////////////////////////////
unsigned int arr_seg1[12]=
{
//0bHGFEDCBA
0b11111100, // 0й элемент, символ «0»
0b00101000, // 1й элемент, символ «1»
0b11100110, // 2й элемент, символ «2»
0b01101110, // 3й элемент, символ «3»
0b00111010, // 4й элемент, символ «4»
0b01011110, // 5й элемент, символ «5»
0b11011110, // 6й элемент, символ «6»
0b01101000, // 7й элемент, символ «7»
0b11111110, // 8й элемент, символ «8»
0b01111110, // 9й элемент, символ «9»
};
///////////////////////////////////////////////////

interrupt prerivanie()
{
if (INTF==1)
    {
      hello=1;
      INTF=0;
      tmppr = TMR1H<<8;
      tmppr +=TMR1L;
      TMR1H=0;
      TMR1L=0;
      tmr1temp2=tmr1temp;
      tmr1temp=0;
    }
if (TMR1IF==1)
    {
     TMR1IF=0;   
     tmr1temp=tmr1temp+1;
    } 
if(TMR2IF==1)
   {
    TMR2IF=0;
    tmppodc++;
   }
}
////////////////////////////////////////////////////

void main (void)
{
podgot ();
//////////////////////////////////////////
do
{
DelayUs(20);
PORTB=arr_seg2[3];
led1=0;
DelayUs(20);
led1=1;
PORTB=arr_seg2[2];
led2=0;
DelayUs(30);
led2=1;
PORTB=arr_seg2[2];
led3=0;
DelayUs(20);
led3=1;
PORTB=arr_seg2[1];
led4=0;
DelayUs(20);
led4=1;
PORTB=arr_seg2[0];
led5=0;
DelayUs(20);
led5=1;
}
while (hello==0); // проверяем условие
/////////////////////////////////////////////
while (1)
{

PORTB=arr_seg1[num1];
led1=0;
DelayUs(20);
led1=1;

PORTB=arr_seg1[num10];
led2=0;
DelayUs(30);
led2=1;
PORTB=arr_seg1[num100];
led3=0;
DelayUs(20);
led3=1;
if(num10000>=1 )
{
PORTB=arr_seg1[num1000];
led4=0;
DelayUs(20);
led4=1;
}
else
{
if(num1000>=1 )
{
PORTB=arr_seg1[num1000];
led4=0;
DelayUs(20);
led4=1;
}
}


if(num10000!=0)
{
PORTB=arr_seg1[num10000];
led5=0;
DelayUs(20);
led5=1;
}
if(tmppodc>=60)
  {
tmppodc=0;
if(tmr1temp2>=1)
{
tmp=65535*tmr1temp2; //количество кругов таймера1
}
tmp=tmp+tmppr;  // пребовляем то что осталось в таймере до обнуления
tmp=240000000/tmp;  // делим число (20000000*60) на t
tmp=tmp/4;
      num10000=tmp/10000;   
      tmp %=10000;               
      num1000=tmp/1000;      // количество тысяч
      tmp %=1000;            // остаток от деления на 1000
      num100=tmp/100;      // количество сотен
      tmp %=100;            // остаток от деления на 100
      num10=tmp/10;         // кол-во десятков
      num1=tmp%10;         // остаток - единицы
     
  }

}
}

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

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

Сообщение dosikus »

misterkuk, вы действительно хотите знать чужое мнение ?
Переписывайте все , это не код ...

Воистину -" если в исходниках присутствует podgot() , не заслуживает даже внимания..."
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

dosikus писал(а):misterkuk, вы действительно хотите знать чужое мнение ?
Переписывайте все , это не код ...
"

Я учусь по самоучителям в интернете. Так я представляю код, как по мне я делаю логично всё. Как обойтись без функции подготовки- не представляю. и всё таки, взгляните , почему при частоте меньше 31Гц расчёт не работает?
П.С. знаю что код примитивный у меня, но я развиваюсь, учусь и надеюсь вы поможете.:)
Аватара пользователя
korsaj
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Чт июн 23, 2011 07:55:51

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

Сообщение korsaj »

Скорее всего происходит неконтролируемое переполнение таймера..
Chettuser

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

Сообщение Chettuser »

misterkuk писал(а): на выходе каша и вообще не работает. 31Гц и выше- всё пучком.

А каша какая? Иногда, ковыряясь в каше, можно много интересного выловить.
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

Chettuser писал(а):
misterkuk писал(а): на выходе каша и вообще не работает. 31Гц и выше- всё пучком.

А каша какая? Иногда, ковыряясь в каше, можно много интересного выловить.

Не отображаются цифры, пять регистров горят как попало, хаотично. В TMR1L и TMR1H начинают прыгать значения и появляется "минус" ( -32 к примеру). и это ниже 31 Гц. Ставлю 31 Гц- всё нормально. Прикрепил архив с исходником и проекте в протеусе версии 7.10.
Вложения
Новая папка.rar
(98.46 КБ) 171 скачивание
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

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

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

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

Поставить другую версию, в которой есть поддержка этого чипа.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

oleg110592 писал(а):Есть SDCC http://sdcc.sourceforge.net/

Спасибо, поизучаю :tea: .
I am DX168B and this is my favourite forum on internet!
Chettuser

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

Сообщение Chettuser »

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

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

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

В хидерах смотреть.
А файлик есть не в PICC18, а в MCC18. Вы перепутали немного. У хайтека таких мануалов няма :(
Chettuser

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

Сообщение Chettuser »

Бывает... После трудового дня :oops:
Ответить

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