Страница 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" вот этим:
эта запись равносильна
Понятное дело, что в порт, настроенный на вход, ничего вывести не получится.

Re: Програмирование pic на СИ.
Добавлено: Вс май 26, 2013 10:59:18
misterkuk
Понятное дело, что в порт, настроенный на вход, ничего вывести не получится.

Я ж за что... но у меня и в порт настроен на выход командой 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
Спасибо, поизучаю

.
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
Бывает... После трудового дня
