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

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

Сообщение DX168B »

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

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

Сообщение 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/
Не успеете - пурген для сабжа можно найти.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

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

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

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

Сообщение misterkuk »

Chettuser писал(а):PORTB=1; - пишет в RB0 единицу.
А RB0 у Вас на вход оформлен.
Всегда писал и имел в виду что PORTB=1; равносильно PORTB=0b11111111; Все биты в регистре PORTB устанавливаются в 1.
Даже если TRISB = 0b11111111; и в теле прописать PORTB=1; то ничего не происходит и состояние ног не меняется, мало того они в протеусе висят в 3м состоянии.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

DX168B писал(а): Интересно, почему в коллекции GCC нет компилятора под ПИКи?
Есть SDCC http://sdcc.sourceforge.net/
Реклама
Chettuser

Сообщение Chettuser »

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

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

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

Сообщение misterkuk »

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

Сообщение Chettuser »

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

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

Сообщение 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;         // остаток - единицы
      
  } 

}
}

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

Сообщение dosikus »

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

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

Сообщение misterkuk »

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

Сообщение korsaj »

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

Сообщение Chettuser »

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

Сообщение misterkuk »

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

Сообщение misterkuk »

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

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

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

Сообщение DX168B »

oleg110592 писал(а):Есть SDCC http://sdcc.sourceforge.net/
Спасибо, поизучаю :tea: .
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Chettuser

Сообщение Chettuser »

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

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

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

Сообщение Chettuser »

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

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