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

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

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

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

Я просто не вижу разницы между захватом и внешним прерыванием.
Ну не видите, значит делайте на захвате. Только я вижу что для Вас есть разница. Вы кучу вопросов задаёте по этому модулю....
а если нужно 2 или таких входов?
Вот тогда и будете "химичить" с захыватами и искать другие способы внешних прерываний, если INT'ов не хватит.
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

Аlex писал(а):Ну не видите, значит делайте на захвате. Только я вижу что для Вас есть разница. Вы кучу вопросов задаёте по этому модулю....

Просто сказали ранне что лучше ССР. Вот и пошли вопросы. Попробую сделать на ИНТ.
Аlex писал(а):Вот тогда и будете "химичить" с захыватами и искать другие способы внешних прерываний, если INT'ов не хватит.

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

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

Сообщение misterkuk »

Аlex писал(а):Ну не видите, значит делайте на захвате. Только я вижу что для Вас есть разница. Вы кучу вопросов задаёте по этому модулю....

Просто сказали ранне что лучше ССР. Вот и пошли вопросы. Попробую сделать на ИНТ.
Аlex писал(а):Вот тогда и будете "химичить" с захыватами и искать другие способы внешних прерываний, если INT'ов не хватит.

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

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

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

Просто сказали ранне что лучше ССР.
Возможно что и лучше, но не для Вас. Этот модуль один из сложных. В нём, к сожалению, тяжеловато разобраться начинающему. :(
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

Так тахометр и не получается. Может взглянете?
Кварц 20 мегагерц. 1 машинный циккл за 200 наносекунт это 10 в -9 степени или 0.0000002 секунды.
Алгоритм такой- Считаем время как сигнал упал в 0 до того как он снова упал в ноль, обнуляем таймер1 и считаем заново до следующего падения в 0. С тем что посчитали работаем.
Так как 1 цикл 200 наносекунд то то количество циклов что подсчитали умножаем на время 200 наносекунд.
знаем время периуда. Формуля 1\Т . Переводим то что помножили в секунды для этого нужно разделить на миллиард.
Делим на то что вышло 1. получаем частоту.

но в программе чтото не выходит. Незнаю как арифметикой работать и както ругается на большие числа типа миллиардов.
выдаёт кучу ошибок. У меня мозг уже плавится, помогите разобраться

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

#include <pic.h>
__CONFIG (XT & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS);
unsigned shar   tmr1temp;
unsigned long int  tmp;
unsigned int  tmppr;
int num10000;
int num1000;
int num100;
int num10;
int num1;
void pauza (void)
{ // начало переменная
unsigned int x; // локальная
x = 100; // в tmp поместить некое максимальное число
while (x-->0);
}// конец функции

void podgot (void)
{
TRISA = 0b00001111; // направление работы ножек порта А.
TRISB = 0b10000001; // направление работы ножек порта В.
CMCON = 0x07; // отключение компараторов.
PORTA = 0; // очищаем порт А
PORTB = 0; // очищаем порт Б.
GIE = 1; //разрешить глобальные прерывания .
PEIE = 1;
// OPTION BIT
RBPU = 1;  // подтягивающие R (0-вкл, 1-выкл).
INTEDG = 0; //Прерывания INT по пер. фронту.
T0CS = 1; // внешний тактовый сигнал
T0SE = 0; // задний фронт преращения сигнала.
//T1CON BIT
T1CKPS1 = 0;
T1CKPS0 = 0; //предделитель 1:1
T1OSCEN = 0; // внутренний тактовый генератор выкл.
T1SYNC = 1; // не синхронизировать внешний сигнал
TMR1CS = 0; // Внутреннй источник тактового сигнала.
TMR1ON = 1; // таймер включен.
INTE=1;
/////////
TMR1IE = 1; // прерывание от 1 таймера on.
tmp=0;
}
void main (void)
{
podgot ();
while (1)
{
tmp=tmr1temp*655536;
tmp=tmp+tmppr;
tmp=tmp*200;
tmp=tmp\1000000000;
tmp=1\tmp;
      num10000=tmp/10000;   
      tmp %=10000;               
      num1000=tmp/1000;      // количество тысяч
      tmp %=1000;            // остаток от деления на 1000
      num100=tmp/100;      // количество сотен
      tmp %=100;            // остаток от деления на 100
      num10=tmp/10;         // кол-во десятков
      num1=tmp%10;         // остаток - единицы
// === массив констант с описанием 7-сегментных символов
const unsigned char arr_seg1[12]={ // начало массива
// 0bABCDEFGH <– расположение сегментов по битам
   0b01111100, // 0й элемент, символ «0»
   0b01100000, // 1й элемент, символ «1»
   0b01011010, // 2й элемент, символ «2»
   0b01110010, // 3й элемент, символ «3»
   0b01100110, // 4й элемент, символ «4»
   0b00110110, // 5й элемент, символ «5»
   0b00111110, // 6й элемент, символ «6»
   0b01100000, // 7й элемент, символ «7»
   0b01111110, // 8й элемент, символ «8»
   0b01110110, // 9й элемент, символ «9»
   0b01000110, //10й элемент, символ градуса
   0b00000000  //11й элемент, пробел
} // конец массива

// === массив констант с описанием 7-сегментных символов
const int arr_seg2[12]={    // начало массива
// 0bABCDEFGH <– расположение сегментов по битам
   1, // 0й элемент, символ «0»
   0, // 1й элемент, символ «1»
   1, // 2й элемент, символ «2»
   1, // 3й элемент, символ «3»
   0, // 4й элемент, символ «4»
   1, // 5й элемент, символ «5»
   1, // 6й элемент, символ «6»
   1, // 7й элемент, символ «7»
   1, // 8й элемент, символ «8»
   1, // 9й элемент, символ «9»
   1, //10й элемент, символ градуса
   0, //11й элемент, пробел
}

RB7 = 0;
PORTB = arr_seg1 [num10000];
RA4 = arr_seg2 [num10000];
pauza ();
RB7 = 1;
RA0 = 0;
PORTB = arr_seg1 [num1000];
RA4 = arr_seg2 [num1000];
pauza ();
RA0 = 1;
RA1 = 0;
PORTB = arr_seg1[num100];
RA4 = arr_seg2[num100];
pauza ();
RA1 = 1;
RA2 = 0;
PORTB = arr_seg1[num10];
RA4 = arr_seg2[num10];
pauza ();
RA2 = 1;
RA3 = 0;
PORTB = arr_seg1[num1];
RA4 = arr_seg2[num1];
pauza ();
RA3 = 1;
}
}
void  interrupt prerivanie (void)
{
if (INTF==1)
    {
      INTF=0;
      tmppr = TMR1H<<8;
      tmppr +=TMR1L;
      TMR1H=0;
      TMR1L=0;
      tmr1temp=0;
    }
if (TMR1IF==1)
    {
     TMR1IF=0;   
     tmr1temp=tmr1temp+1;
    }     
}
.
Вот что выбивает

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

Executing: "C:\Program Files\HI-TECH Software\PICC\9.50\BIN\PICC.EXE" -C -E"proba.cce" "proba.c" -O"proba.obj" -Zg9 -O -ASMLIST -Q -MPLAB -16F628A
Advisory[1207]   : some of the command line options you are using are now obsolete
Advisory[1208]   : use --help option or refer to the user manual for option details
Warning[176] C:\Program Files\Microchip\project\proba\proba.c 139 : missing newline
Error[372] C:\Program Files\Microchip\project\proba\proba.c 3 : "," expected
Error[228] C:\Program Files\Microchip\project\proba\proba.c 52 : illegal character (0134)
Error[195] C:\Program Files\Microchip\project\proba\proba.c 52 : expression syntax
Error[228] C:\Program Files\Microchip\project\proba\proba.c 53 : illegal character (0134)
Error[195] C:\Program Files\Microchip\project\proba\proba.c 53 : expression syntax
Error[195] C:\Program Files\Microchip\project\proba\proba.c 63 : expression syntax
Error[312] C:\Program Files\Microchip\project\proba\proba.c 77 : ";" expected
Error[249] C:\Program Files\Microchip\project\proba\proba.c 80 : probable missing "}" in previous block
Error[372] C:\Program Files\Microchip\project\proba\proba.c 96 : "," expected
Error[983] C:\Program Files\Microchip\project\proba\proba.c 96 : storage class redeclared
Error[984] C:\Program Files\Microchip\project\proba\proba.c 96 : type redeclared
Error[239] C:\Program Files\Microchip\project\proba\proba.c 96 : identifier "RB7" redefined (from line 82)
Warning[374] C:\Program Files\Microchip\project\proba\proba.c 97 : missing basic type; int assumed
Error[983] C:\Program Files\Microchip\project\proba\proba.c 97 : storage class redeclared
Error[984] C:\Program Files\Microchip\project\proba\proba.c 97 : type redeclared
Error[239] C:\Program Files\Microchip\project\proba\proba.c 97 : identifier "PORTB" redefined (from line 23)
Error[192] C:\Program Files\Microchip\project\proba\proba.c 97 : undefined identifier "arr_seg1"
Error[981] C:\Program Files\Microchip\project\proba\proba.c 97 : pointer required
Error[981] C:\Program Files\Microchip\project\proba\proba.c 97 : pointer required
Error[188] C:\Program Files\Microchip\project\proba\proba.c 97 : constant expression required
Warning[374] C:\Program Files\Microchip\project\proba\proba.c 98 : missing basic type; int assumed
Error[983] C:\Program Files\Microchip\project\proba\proba.c 98 : storage class redeclared
Error[984] C:\Program Files\Microchip\project\proba\proba.c 98 : type redeclared
Advisory[1] C:\Program Files\Microchip\project\proba\proba.c 98 : too many errors (21)
Halting build on first failure as requested.
BUILD FAILED: Tue Aug 30 12:59:00 2011
Вложения
project.rar
(243.01 КБ) 203 скачивания
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

unsigned shar tmr1temp;
Это что за тип такой - shar ? :)))
Далее, строки не захотел считать. Смотрите в каких строчках ошибки и ищите их там :)
Видимо tmr1temp Вы хотели объявить как char. Тогда эта сторока

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

tmp=tmr1temp*655536;
не проканает. Он же сначала будет умножать, затем присваивать.
Разбирайтесь с приведением типов.
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

Аlex писал(а):
unsigned shar tmr1temp;
Это что за тип такой - shar ? :)))
Далее, строки не захотел считать. Смотрите в каких строчках ошибки и ищите их там :)
Видимо tmr1temp Вы хотели объявить как char. Тогда эта сторока

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

tmp=tmr1temp*655536;
не проканает. Он же сначала будет умножать, затем присваивать.
Разбирайтесь с приведением типов.
Да, точно char. Но это ничег оне дало.
а почему сначала умножение а потом присвоение. присвоениеж проводится в самомначале программы. А про чар взял здесь http://www.labkit.ru/html/C_for_PIC?id=251 .Всё равно кучаааа ошибок и не компелируется.
строчка tmp=tmp\1000000000; ругается на неё как illegal character (0134). пошол искать ошибки
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

присвоениеж проводится в самомначале программы.
В начале программы не присваивание, а объявление. Присвоить - это символ "=".
строчка tmp=tmp\1000000000; ругается на неё как illegal character (0134).
А что Вы этой строчкой хотите сделать ? Я вот например тоже не понимаю, так-же как и компилятор.
Посмотрите на неё внимательнее и поймёте в чём ошиблись.
Chettuser

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

Сообщение Chettuser »

Умножать в PIC'ах 18-й серии дурной тон...
Сколько памяти сразу отъест. :hunger:
FlySnake
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Пт ноя 20, 2009 20:38:12
Откуда: Калининград (Koenigsberg)
Контактная информация:

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

Сообщение FlySnake »

Chettuser писал(а):Умножать в PIC'ах 18-й серии дурной тон...
Сколько памяти сразу отъест. :hunger:

Вы хотели сказать не умножать, а делать арифметику с плавающей точкой ;) Потому что для умножения во всех PIC18 есть железный умножитель 8*8 бит за один машцикл
Chettuser

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

Сообщение Chettuser »

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

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

Сообщение misterkuk »

Перенёс масивы в начало МАЙНа а всё скомпилировалось:)
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 931
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

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

Сообщение Ghost in shell »

Несколько замечений:
- вместо переменных лучше использовать структуры. У меня прога только из-за этого глючила.
- сначала объявляют структуры, переменные, функции, массивы. Потом - подпрограмма обработчика прерываний (ППОП), коей у вас там нет.
- паузу делают только через таймер+счетчик. В ППОП.
- динамическая индикация (да и все в целом) лучше всего описана тут: http://vrtp.ru/index.php?showtopic=10583&st=0
Она делается без паузы и в ППОП.
- состояние общих точек индикаторов проще задавать прямо, а не через массив.
Кот гуляет сам по себе, но вблизи холодильника.
FlySnake
Мучитель микросхем
Сообщения: 429
Зарегистрирован: Пт ноя 20, 2009 20:38:12
Откуда: Калининград (Koenigsberg)
Контактная информация:

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

Сообщение FlySnake »

Ghost in shell писал(а):- вместо переменных лучше использовать структуры. У меня прога только из-за этого глючила.

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

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

Сообщение misterkuk »

unsigned int tmr1temp; хранит сколько переполнений таймера было.
unsigned long int tmp; конечное число которое будет выводится на индикаторы
unsigned int tmppr; тут обьеединяются старшиы и младший разряды таймра.

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

tmp=tmr1temp*655536; //Считаем количество машинных цыклов (полных)
tmp=tmp+tmppr;                   // Прибовляем то что осталось в таймере на момент прерывания.
                             // Теперь знаем количество машинных цыклов за периуд. зная что 1 цикл =200наносекун,
                             // умножаем количество циклов на 200 наносекунд.
tmp=tmp*200;                 // умножаем. И получается огромное чисо.
tmp=tmp/1000000000;     // так как Приставка нано это 10 в -9 степени то делим на 1000000000. Тоесть переводим в секунды.
tmp=1/tmp;                    // теперь зная время перриуда, делим 1 на время по фформуле 1/Т

Код обработки молученных цыфр.
Но а самом деле всё по другому. В симуляторе такк. Подаём сигнал с частотой 180 Гц.
tmr1temp=0 9и при такой частоте всегда =0)
tmppr= У нас выводится как 40249
tmp=tmr1temp*655536; тут если 0 умножыть на число то будет 0. всё норм.
tmp=tmp+tmppr; Здесь в tmp заносится число 40249
tmp=tmp*200; далее судя по моей локике должно получится что tmp = 40249*200= 8 049 800. но симулятор после
этой операцции показывает ччисло 54480
tmp=tmp/1000000000; далее это число 54480 делится на 1000000000 и у нас выходит 4 . как оно может тут выйти!!! А по идее число 8049800/1000000000=0.0080498с. Но это в идеале.
tmp=1/tmp;Далее програма 1/4=0 А должно быть 1/0.0080498=124.2266...
Я плохо разбираюсь в этом. Может както нуужно обьявлять переменные чтоб с не целыми числами работать?
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

(c) Даже самая красивая девушка не может дать больше того, что у нее есть...
В смысле, если формат числа unsigned int - оно 16 битное - максимально, что можно туда влепить - это число в диапазоне 0-65535 , всего 65536 значений.
tmp=tmr1temp*655536; - вот здесь как бы 5 лишняя, не находите ?
----------
tmp = 40249*200= 8 049 800. но симулятор после
этой операцции показывает ччисло 54480
----------
ну а что оно может показать, если макс 65535 ?

Почитайте о формате чисел хотя бы здесь, только там опечатка

http://www.labkit.ru/html/C_for_PIC?id=251

unsigned shar (символ без знака)
надо читать
unsigned сhar (символ без знака)
----------
unsigned long int tmp; - это сколько ? int Или long ?
Это же хайтек, а не ццс...
Хотя с точки зрения Си запись верная, но
unsigned long tmp;
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

urry писал(а):(c)
tmp=tmr1temp*655536; - вот здесь как бы 5 лишняя, не находите ?
тут опечатка, не увидел лишнюю 5. видно случайно нажал ещё рас. Тут я не спорю.
urry писал(а):tmp = 40249*200= 8 049 800. но симулятор после
этой операцции показывает ччисло 54480
----------
ну а что оно может показать, если макс 65535 ?

Почемуже если tmp у меня unsigned long int что соотвецтвует 0 … 4294967295. Тут я не пойму.

Начал учить си с этого сайта, как на меня самое лучшее что я находил.
urry писал(а):Хотя с точки зрения Си запись верная

Хоть это радует. спс. Строчка аж придала сил:)
Просто если не unsigned long int? 8 миллионов больше не во что не влезет вродебыш.
Я пока хочу понять само програмирование. основу, нюансы разные, красиво писать программу пока не рвусь. Сейчас главное чтоб работала.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение urry »

да забудьте Вы, наконец, эту запись unsigned long int
для Хайтека просто unsigned long
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

urry писал(а):да забудьте Вы, наконец, эту запись
И вышеупомянутй сайт тоже.
Вот почитайте для начала http://eldigi.ru/site/programms/?download=picc_env.rar
И вот http://eldigi.ru/site/programms/?downlo ... manual.rar
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

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

Сообщение misterkuk »

unsigned long tmp
tmp=13/8 ( кк примеру)
Такого не хочет делать, в симуляторе прыгает чарез такие действия. Так и не удалось решыть проблему арифметических операций выложеных выше. Не хочит считать и все.
Ответить

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