Страница 9 из 103
Re: Програмирование pic на СИ.
Добавлено: Вт июн 21, 2011 22:09:09
Аlex
Я просто не вижу разницы между захватом и внешним прерыванием.
Ну не видите, значит делайте на захвате. Только я вижу что для Вас есть разница. Вы кучу вопросов задаёте по этому модулю....
а если нужно 2 или таких входов?
Вот тогда и будете "химичить" с захыватами и искать другие способы внешних прерываний, если INT'ов не хватит.
Re: Програмирование pic на СИ.
Добавлено: Вт июн 21, 2011 22:30:50
misterkuk
Аlex писал(а):Ну не видите, значит делайте на захвате. Только я вижу что для Вас есть разница. Вы кучу вопросов задаёте по этому модулю....
Просто сказали ранне что лучше ССР. Вот и пошли вопросы. Попробую сделать на ИНТ.
Аlex писал(а):Вот тогда и будете "химичить" с захыватами и искать другие способы внешних прерываний, если INT'ов не хватит.
Эт теперь ясно.

Re: Програмирование pic на СИ.
Добавлено: Вт июн 21, 2011 22:32:22
misterkuk
Аlex писал(а):Ну не видите, значит делайте на захвате. Только я вижу что для Вас есть разница. Вы кучу вопросов задаёте по этому модулю....
Просто сказали ранне что лучше ССР. Вот и пошли вопросы. Попробую сделать на ИНТ.
Аlex писал(а):Вот тогда и будете "химичить" с захыватами и искать другие способы внешних прерываний, если INT'ов не хватит.
Эт теперь ясно.

. Просто почемуто так разработали. Наверно на то были причины.
Re: Програмирование pic на СИ.
Добавлено: Вт июн 21, 2011 22:48:09
Аlex
Просто сказали ранне что лучше ССР.
Возможно что и лучше, но не для Вас. Этот модуль один из сложных. В нём, к сожалению, тяжеловато разобраться начинающему.

Re: Програмирование pic на СИ.
Добавлено: Вт авг 30, 2011 13:02:21
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
Re: Програмирование pic на СИ.
Добавлено: Вт авг 30, 2011 13:13:11
Аlex
unsigned shar tmr1temp;
Это что за тип такой -
shar ?

Далее, строки не захотел считать. Смотрите в каких строчках ошибки и ищите их там
Видимо
tmr1temp Вы хотели объявить как
char. Тогда эта сторока
не проканает. Он же сначала будет умножать, затем присваивать.
Разбирайтесь с приведением типов.
Re: Програмирование pic на СИ.
Добавлено: Вт авг 30, 2011 14:17:51
misterkuk
Аlex писал(а):unsigned shar tmr1temp;
Это что за тип такой -
shar ?

Далее, строки не захотел считать. Смотрите в каких строчках ошибки и ищите их там
Видимо
tmr1temp Вы хотели объявить как
char. Тогда эта сторока
не проканает. Он же сначала будет умножать, затем присваивать.
Разбирайтесь с приведением типов.
Да, точно char. Но это ничег оне дало.
а почему сначала умножение а потом присвоение. присвоениеж проводится в самомначале программы. А про чар взял здесь
http://www.labkit.ru/html/C_for_PIC?id=251 .Всё равно кучаааа ошибок и не компелируется.
строчка
tmp=tmp\1000000000; ругается на неё как
illegal character (0134). пошол искать ошибки
Re: Програмирование pic на СИ.
Добавлено: Вт авг 30, 2011 14:51:01
Аlex
присвоениеж проводится в самомначале программы.
В начале программы не присваивание, а объявление. Присвоить - это символ "=".
строчка tmp=tmp\1000000000; ругается на неё как illegal character (0134).
А что Вы этой строчкой хотите сделать ? Я вот например тоже не понимаю, так-же как и компилятор.
Посмотрите на неё внимательнее и поймёте в чём ошиблись.
Re: Програмирование pic на СИ.
Добавлено: Вт авг 30, 2011 17:53:37
Chettuser
Умножать в PIC'ах 18-й серии дурной тон...
Сколько памяти сразу отъест.

Re: Програмирование pic на СИ.
Добавлено: Вт авг 30, 2011 19:04:39
FlySnake
Chettuser писал(а):Умножать в PIC'ах 18-й серии дурной тон...
Сколько памяти сразу отъест.

Вы хотели сказать не умножать, а делать арифметику с плавающей точкой

Потому что для умножения во всех PIC18 есть железный умножитель 8*8 бит за один машцикл
Re: Програмирование pic на СИ.
Добавлено: Вт авг 30, 2011 19:42:51
Chettuser
Сорри - именно это и хотел сказать.

Re: Програмирование pic на СИ.
Добавлено: Вт авг 30, 2011 22:52:39
misterkuk
Перенёс масивы в начало МАЙНа а всё скомпилировалось:)
Re: Програмирование pic на СИ.
Добавлено: Ср авг 31, 2011 08:54:21
Ghost in shell
Несколько замечений:
- вместо переменных лучше использовать структуры. У меня прога только из-за этого глючила.
- сначала объявляют структуры, переменные, функции, массивы. Потом - подпрограмма обработчика прерываний (ППОП), коей у вас там нет.
- паузу делают только через таймер+счетчик. В ППОП.
- динамическая индикация (да и все в целом) лучше всего описана тут:
http://vrtp.ru/index.php?showtopic=10583&st=0
Она делается без паузы и в ППОП.
- состояние общих точек индикаторов проще задавать прямо, а не через массив.
Re: Програмирование pic на СИ.
Добавлено: Ср авг 31, 2011 09:50:19
FlySnake
Ghost in shell писал(а):
- вместо переменных лучше использовать структуры. У меня прога только из-за этого глючила.
А структуры - это не переменные?

Смею предположить что проблемы растут из отсутствия квалификатора volatile у глобальных переменных изменяемых в прерывании. misterkuk, кстати, это тоже касается. Все глобальные переменные, которые могут быть спонтанно изменены в прерывании должны быть volatile. Во всех книжках/мануалах про Си это написано.
Re: Програмирование pic на СИ.
Добавлено: Ср авг 31, 2011 15:39:39
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...
Я плохо разбираюсь в этом. Может както нуужно обьявлять переменные чтоб с не целыми числами работать?
Re: Програмирование pic на СИ.
Добавлено: Ср авг 31, 2011 17:14:00
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;
Re: Програмирование pic на СИ.
Добавлено: Ср авг 31, 2011 18:33:17
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 миллионов больше не во что не влезет вродебыш.
Я пока хочу понять само програмирование. основу, нюансы разные, красиво писать программу пока не рвусь. Сейчас главное чтоб работала.
Re: Програмирование pic на СИ.
Добавлено: Ср авг 31, 2011 20:30:31
urry
да забудьте Вы, наконец, эту запись unsigned long int
для Хайтека просто unsigned long
Re: Програмирование pic на СИ.
Добавлено: Ср авг 31, 2011 20:35:27
Аlex
urry писал(а):да забудьте Вы, наконец, эту запись
И вышеупомянутй сайт тоже.
Вот почитайте для начала
http://eldigi.ru/site/programms/?download=picc_env.rar
И вот
http://eldigi.ru/site/programms/?downlo ... manual.rar
Re: Програмирование pic на СИ.
Добавлено: Пн сен 05, 2011 15:14:46
misterkuk
unsigned long tmp
tmp=13/8 ( кк примеру)
Такого не хочет делать, в симуляторе прыгает чарез такие действия. Так и не удалось решыть проблему арифметических операций выложеных выше. Не хочит считать и все.