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

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

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

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

как выставляется частота работы микропроцессора?
Она никак не выставляется, она определяется тактовым генератором, который может бить внутренним или внешним.
Читайте даташит, раздел осцилятора.
Реклама
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

Аlex писал(а):Она никак не выставляется
Ну приехали. А как компилятор будет определять на какой частоте работает контроллер? Например если использовать __delay
Реклама
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

А причём здесь компилятор??? Для delay есть свой дефайн... для симулятора - свои уставки частоты... но к самому МК это никакого отношения не имеет...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
Bkmz
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Пт сен 02, 2011 09:14:44

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

Сообщение Bkmz »

Ну тогда изначально вопрос некорректно был задан и каждый его истолковал по-своему. Выше я указал как раз для delay, а в Протеусе в свойствах контроллера задается. Или же конфигом в самой программе если это внутренний генератор и тогда на него симулятор уже не влияет.
Реклама
Эиком - электронные компоненты и радиодетали
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Всё намного интереснее... В новых чипах можно менять частоту МК... PLL, например... Какие частоты для delay закладывать изначально... если частота может меняться??? Всё ложится на плечи программиста... и никак иначе...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Bkmz писал(а):Ну тогда изначально вопрос некорректно был задан и каждый его истолковал по-своему
С этим на форумах постоянно и сталкиваешься. Человек бездумно забегает на форум, спрашивает какую-нибудь херню и убегает, думая что тут все экстрасенсы.
Мало того, большинство даже не понимают что спрашивают. Главное - спросить :)
Килять давно пора в мусорку подобные вопросы, да жалко уставы этого не позволяют. Дабы человек понял, что хуйню спросил.
Реклама
Darkmaster
Встал на лапы
Сообщения: 137
Зарегистрирован: Вс окт 11, 2009 09:54:59
Откуда: Пенза

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

Сообщение Darkmaster »

Всем привет :)
может кто спасет мой моск.
Значит написан код на Си :общение с датчиком ds18b20 и вывод на 7сегментный индикатор.
Проблема:при первом включении измеряется температура и выводится на индикатор.Но ! замер и вывод у меня в главном цикле -при изменении значения температуры показания не меняются. :( опытным путем установлено шо замер (принятие данных от датчика) происходит лишь один раз..как будто датчик потом умирает.
симулю в proteus 7.6
коды на С в файле.


В две головы думаем -и никак не справимся с этой бедой

p s компилятор Hi tech 9.6

p p s сам нашел косяк. :)
по коду было State =0 delay 480
а надо State =0 Pin =0 delay 480
Вложения
Project.rar
(19.74 КБ) 171 скачивание
Интересная,однако,штука
Аватара пользователя
money21
Встал на лапы
Сообщения: 92
Зарегистрирован: Сб апр 03, 2010 19:30:17
Откуда: СПб

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

Сообщение money21 »

Коты! Почему оно не работает?
Прогоняется один раз внутренний цикл, и усё, молчит.
Компилируется всё хорошо.
Спасите, не могу управлять выводом инфы на светодиодную матрицу.
Спасибо!

for (xx==0; xx<10; xx++)
{


for (counter == 1; counter < 6; counter++)
{
if (counter == 0) truecount = 1;
...
if (counter == 5) truecount = 32;

PORTA = truecount;
PORTB = column_array[counter+1];

delay_ms(20);

};


};
Аватара пользователя
Pavel_1978
Опытный кот
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

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

Сообщение Pavel_1978 »

Потому что хх==0 и х=0, далеко не одно и тоже. Обьяснять почему?
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

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

Сообщение alex_ »

money21 писал(а):Коты! Почему оно не работает?
Прогоняется один раз внутренний цикл, и усё, молчит.
Вот смотри, так написано у тебя for (xx==0; xx<10; xx++), а так надо for (xx=0; xx<10; xx++), называется найди отличие :)
Аватара пользователя
money21
Встал на лапы
Сообщения: 92
Зарегистрирован: Сб апр 03, 2010 19:30:17
Откуда: СПб

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

Сообщение money21 »

спасибо, узрел!
тогда ещё вопрос: задумка у меня такая - часы-бегущая строка на матрице 5х7 и PIC16F628 в размере наручных (не спрашивайте, зачем))
сейчас RA0-RA4 и RB0-RB6 заняты матрицей, RB7 - кнопкой. TMR0 дёргается для прерываний, по которым заполняется матрица.
программа выглядит примерно так:
Спойлерvoid updateled() {
один "прогон" матрицы с данными из массива.
}

void roll() {
изменение ячеек массива ("кадры")
delay_ms(10);
updateled();
}

void interrupt() {
cnt++; // Increment value of cnt on every interrupt
if (Button(&PORTB, 7, 1, 1)) {
roll();};
TMR0 = 96;
INTCON = 0x20; // Set T0IE, clear T0IF
}

void main() {

(инициализация)

do { } while(1);
}
и вроде бы всё ничего, жмёшь - показывает. но вот вопрос - на чём, собсно, организовать счёт времени? тактировать TMR1 кварцем на RB6 нет возможности - он занят.
что делать? спасибо!
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

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

Сообщение Albert_V »

money21 писал(а):что делать?
Как правило, вначале "прикидывают" схему думая о том как будет написана программа и т.д. и только после этого пишется программа.
В вашем случае - делайте счёт времени по TIMER2 или убирайте кварц и "переходите" на INTRC. Освободятся RA6 и RA7. Дальше, думайте как освободить RB6 и RB7.

P.S.
money21 писал(а):в размере наручных
Хочется верить что вы читали документацию.
Изображение
Аватара пользователя
money21
Встал на лапы
Сообщения: 92
Зарегистрирован: Сб апр 03, 2010 19:30:17
Откуда: СПб

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

Сообщение money21 »

Пикоты! помогите( решил переделать считалку от mikroel под кухонный таймер. всё работает отлично, кроме следующего - по достижении 0 минут (да, я знаю, что в минуте не 1000мс)) не появляется 1 на А2. и на А6 не появляется (TRISА менял), и вообще именно эта строка не работает.

Подскажите, будьте добры.
Спасибо!
Спойлер#include "Display_utils.h"
#define buzzerpin PORTA.F2


unsigned short digit_no, digit10, digit1, digit, i,minutes, start, m;

void scanbuttons() {
если кнопка нажата, изменять minutes
}

void count() {
for (i = minutes; i<=minutes; i--) {
digit = i % 10u;
digit1 = mask(digit); // считать от числа минут до 0
digit = (char)(i / 10u) % 10u;
digit10 = mask(digit);
if (i == 0) { // пикнуть, когда время выйдет
buzzerpin = 1; //этого не происходит
Delay_ms(5000);
buzzerpin = 0;
minutes = 55; //это происходит
}

Delay_ms(1000);


}
}


void interrupt() {
обновление 7сегментных индикаторов
}

void main() {
minutes = 0;

OPTION_REG = 0x80; // Timer0 settings
TMR0 = 0;
INTCON = 0xA0;
PORTA = 0;
TRISA = 0b10110000;
PORTB = 0;
TRISB = 0;
do {

digit = minutes % 10u;
digit1 = mask(digit); // prepare ones digit
digit = (char)(minutes / 10u) % 10u;
digit10 = mask(digit); // prepare tens digit
scanbuttons();
Delay_ms(400);
if (Button(&PORTA, 7, 1, 1)) {count();} //при нажатии кнопки "старт" - начать отсчёт
}

while (1);
}
ViktoMyavr
Родился
Сообщения: 12
Зарегистрирован: Сб мар 28, 2015 23:06:05

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

Сообщение ViktoMyavr »

Доброго времени суток!
money21 писал(а): не появляется 1 на А2. и на А6 не появляется (TRISА менял), и вообще именно эта строка не работает.
#define buzzerpin PORTA.F2
- в этой строке нет опечатки?
попробуйте #define buzzerpin RA2 или static volatile bit buzzerpin @ (unsigned)&PORTA*8+2; , если у вас конечно компилятор С.
помните - нумерация портов начинается с 0
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

Всем привет!
Прошу помочь решить простую задачку:
по определённому событию, например по нажатию кнопки - должен загораться светодиод и в случае если кнопка не была нажата повторно в течении 1 сек - светодиод должен погаснуть. Как это реализовать? Нужно ли использовать для этого таймер? или можно без него обойтись? Как правильнее?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

По указанной ссылке нет ответа на мой вопрос. Самому приходит на ум такой алгоритм:
1) настраиваем прерывание по переполнению таймера на 1 сек.
2) В основном цикле программы делаем проверку: если кнопка нажата - обнуляем счётчик таймера и поднимаем флаг события.
Если флаг события поднят - светодиод горит, иначе - не горит.
3) В обработчике прерываний: опускаем флаг события.

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

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

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

Dmitry888 писал(а):По указанной ссылке нет ответа на мой вопрос.
Всё есть, Вы просто не дочитали.
http://radiokot.ru/forum/viewtopic.php? ... 8#p1470598
Опрос выводов кнопок идёт в "фоновом режиме" (в прерывании таймера). По этому, "узнать" была ли нажата кнопка, можно хоть через секунду.
Останется только сделать задержку в основном цикле любым удобным для вас способом, и после неё проверить была ли кнопка нажата.
Там же, в примере, имеются миллисекундные вызовы таймера, в которых можно отсчитывать любые временные интервалы.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

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

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

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

Ну тогда не понятно в чём заключается проблема.
Пришло сообщение - задерживаем программу на 1 сек (повторюсь - любым удобным для Вас способом !) - смотрим не приходило ли оно ещё раз.
Приём по УАРТу в буфер реализуем по прерываниям, чтобы не вешать программу попросту. Оценивать (парсить) буфер можно уже в основном цикле, процесс не из долгих.

ЗЫ: Ну а вообще, реализация будет зависеть от текущей структуры Вашей программы. Каждый пишет по-своему. И лучше/хуже - вопрос относительный. Как удобнее, так и лучше.
Ответить

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