Страница 16 из 103

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

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

Внимание вопрос: Есть ли нормальный бесплатный компилятор Си для PICов?

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

Добавлено: Сб май 25, 2013 21:50:01
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/
Не успеете - пурген для сабжа можно найти.

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

Добавлено: Сб май 25, 2013 21:57:01
DX168B
Думаю, что успею. Пока сделал по другому. Поставил на VMware WinXP и поставил все это добро туда. Появились лишние 45 дней.

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

ЗЫ: Надеюсь, больше с ПИКами не столкнусь.

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

Добавлено: Сб май 25, 2013 22:11:11
misterkuk
Chettuser писал(а):PORTB=1; - пишет в RB0 единицу.
А RB0 у Вас на вход оформлен.
Всегда писал и имел в виду что PORTB=1; равносильно PORTB=0b11111111; Все биты в регистре PORTB устанавливаются в 1.
Даже если TRISB = 0b11111111; и в теле прописать PORTB=1; то ничего не происходит и состояние ног не меняется, мало того они в протеусе висят в 3м состоянии.

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

Добавлено: Сб май 25, 2013 22:23:19
oleg110592
DX168B писал(а): Интересно, почему в коллекции GCC нет компилятора под ПИКи?
Есть SDCC http://sdcc.sourceforge.net/

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

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

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

PORTB=0b00000001
Понятное дело, что в порт, настроенный на вход, ничего вывести не получится. :tea:

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

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

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

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

По TRISx, символично:
1 - это равносильно I (Input - вход)
0 - это равносильно O (Output - выход)

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

Добавлено: Пн май 27, 2013 22:12:41
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;         // остаток - единицы
      
  } 

}
}


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

Добавлено: Пн май 27, 2013 22:18:07
dosikus
misterkuk, вы действительно хотите знать чужое мнение ?
Переписывайте все , это не код ...

Воистину -" если в исходниках присутствует podgot() , не заслуживает даже внимания..."

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

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

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

Добавлено: Вт май 28, 2013 06:42:59
korsaj
Скорее всего происходит неконтролируемое переполнение таймера..

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

Добавлено: Вт май 28, 2013 17:17:49
Chettuser
misterkuk писал(а): на выходе каша и вообще не работает. 31Гц и выше- всё пучком.
А каша какая? Иногда, ковыряясь в каше, можно много интересного выловить.

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

Добавлено: Вт май 28, 2013 19:29:07
misterkuk
Chettuser писал(а):
misterkuk писал(а): на выходе каша и вообще не работает. 31Гц и выше- всё пучком.
А каша какая? Иногда, ковыряясь в каше, можно много интересного выловить.
Не отображаются цифры, пять регистров горят как попало, хаотично. В TMR1L и TMR1H начинают прыгать значения и появляется "минус" ( -32 к примеру). и это ниже 31 Гц. Ставлю 31 Гц- всё нормально. Прикрепил архив с исходником и проекте в протеусе версии 7.10.

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

Добавлено: Пн июн 17, 2013 22:14:41
misterkuk
HI-TECH Software 9.7
в папке include нет файла для pic12f629 и в других файлах он не прописан. Что делать?

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

Добавлено: Пн июн 17, 2013 22:20:41
Аlex
Поставить другую версию, в которой есть поддержка этого чипа.

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

Добавлено: Чт июл 04, 2013 21:51:15
DX168B
oleg110592 писал(а):Есть SDCC http://sdcc.sourceforge.net/
Спасибо, поизучаю :tea: .

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

Добавлено: Ср авг 14, 2013 19:12:18
Chettuser
Народ - а откуда брать конфиг для PIC10-PIC16?
Для PIC18 есть файлик помощи - описано там, а тут?

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

Добавлено: Ср авг 14, 2013 19:22:32
Аlex
В хидерах смотреть.
А файлик есть не в PICC18, а в MCC18. Вы перепутали немного. У хайтека таких мануалов няма :(

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

Добавлено: Ср авг 14, 2013 20:07:35
Chettuser
Бывает... После трудового дня :oops: