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

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

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

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

Сообщение Bkmz »

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

Сообщение HHIMERA »

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

Сообщение Bkmz »

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

Сообщение HHIMERA »

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

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

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

Сообщение 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 скачивание
Интересная,однако,штука
Встал на лапы
Аватара пользователя
Сообщения: 92
Зарегистрирован: Сб апр 03, 2010 19:30:17
Откуда: СПб

Сообщение 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);

};


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

Сообщение Pavel_1978 »

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

Сообщение alex_ »

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

Сообщение 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 нет возможности - он занят.
что делать? спасибо!
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

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

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

Сообщение 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);
}
Родился
Сообщения: 12
Зарегистрирован: Сб мар 28, 2015 23:06:05

Сообщение ViktoMyavr »

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

Сообщение Dmitry888 »

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

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

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

Сообщение Dmitry888 »

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

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

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

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

Сообщение Dmitry888 »

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

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

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

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

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