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

Поклонники продукции Microchip Technology Inc тусуются тут.
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Таймер... фоновый режим... парсить... Слова то какие.))

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

while (1) {
  static char c;
  
  DelayMs(50);
  if (KEY) {
    on(LED);
    c = 0;
  }
  if (LED && ++c >= 1000 / 50)
    off(LED);
}
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

OKF писал(а):Слова то какие.))
Ну а что тут такого ? ))
Вся проблема может заключаться в том, что человеку нужно дополнение к его уже существующей программе. Например, чтобы горел светодиод при приёме информации по UART'у. В таком случае, подобные примеры, уже не катят. Нужно основываться на уже реализованном алгоритме.
По этому, проще объяснить на словах, чем давать готовые и возможно бесполезные куски кода.
Реклама
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

Задержек в основном цикле быть не должно, иначе можно пропустить "важные события". В итоге должно выглядеть как то так: по UART приходят сообщения с переиодичностью в 100мс., если сообщение попадает под условие - горит светодиод, если сообщение "неправильное" или нет сообщений - светодиод гаснет.
Vano79
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт янв 11, 2013 10:54:43

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

Сообщение Vano79 »

Dmitry888 писал(а):Задержек в основном цикле быть не должно, иначе можно пропустить "важные события". В итоге должно выглядеть как то так: по UART приходят сообщения с переиодичностью в 100мс., если сообщение попадает под условие - горит светодиод, если сообщение "неправильное" или нет сообщений - светодиод гаснет.
Камень, компилятор?Весь алгоритм в прерывании.
не понятно в чём заключается проблема.
?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

по-моему, тут налицо непонимание общего алгоритма решения задачи.
если я все понял верно, то решение такое:
1. после получения "правильного" сообщения включаем светодиод и запускаем таймера на 1 сек.
2. проверяем, истек таймер или нет
3. если истек - гасим светодиод.
то есть где-то в нужном месте добавляется такой код:

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

if(resived_message()){
   start_timer(1000) // 1000 мс
   led_on();
}
if (!timer_is_running()) led_off();
таймер, разумеется, асинхронный
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

Vano79 писал(а):Камень, компилятор?Весь алгоритм в прерывании.
PIC18F2580, MikroC Pro.

Дле тренировки сделал пока так:

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

void Interrupt(){
  if (TMR0IF_bit){
    TMR0IF_bit = 0;
    TMR0H	 = 0x0B;
    TMR0L	 = 0xDC;
    
    PORTB = 0x00;   // Гасим светодиод
    
  }
}


void main() {
  
  T0CON	 = 0x85;
  TMR0H	 = 0x0B;
  TMR0L	 = 0xDC;
  GIE_bit	 = 1;
  TMR0IE_bit	 = 1;

  
  ADCON1 |= 0x0F;        // turn off analog inputs

  TRISB = 0;             // PORTB is output
  TRISA = 0x1;           // A0 - input


  while(1) {

    if (RA0_bit==1){           // Если кнопка нажата - зажигаем светодиод и сбрасываем таймер
    
      PORTB = 0xFF;
      TMR0H	 = 0x0B;          //Сбрасываем таймер в начальные значения
      TMR0L	 = 0xDC;
      
    }

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

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

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

Посмотрите в сторону TMR2. Им можно отсчитывать ровные периодичные интервалы, без постоянной переустановки значений таймера.
Сделайте на нём обработчик, вызывающийся каждую миллисекунду.
В этом обработчике используйте счётчики-переменные (аля программные таймеры), для отсчётов всяческих интервалов.
Как пример, для понимания:
Спойлер

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

unsigned int led_cnt_ms=0;

void _1Ms(void){   // миллисек. интервалы
.............
if(led_cnt_ms){
  led_cnt_ms--;
  if(!led_cnt_ms)  LED_OFF();
}
.............
}
Где-то в программе:

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


if(led_event){
  clear_led_event();
  LED_ON();
  led_cnt_ms = 1000;
}
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

Спасибо!
Не могли бы вы объяснить чем этот вариант лучше?

Получилось как-то так:
Спойлер

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

volatile unsigned int led_cnt_ms = 0;

void Interrupt(){
  if (TMR2IF_bit){
    TMR2IF_bit = 0;

    if(led_cnt_ms){
      led_cnt_ms--;
        if(!led_cnt_ms) PORTB = 0x00;   // Гасим светодиод;
    
    }

  }
}


void main() {
  
  T2CON	 = 0x7C;
  TMR2IE_bit	 = 1;
  PR2		 = 249;
  INTCON	 = 0xC0;
  GIE_bit    = 1;
  
  ADCON1 |= 0x0F;        // turn off analog inputs

  TRISB = 0;             // PORTB is output
  TRISA = 0x1;           // A0 - input


  while(1) {

    if (RA0_bit==1){           // Если кнопка нажата
    
      PORTB = 0xFF;            // Зажигаем светодиод
      led_cnt_ms = 1000;       // Заряжаем таймер на 1с.
      
    }
  }
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Ну, хотябы тем, что таймер занят не только для одного светодиода. Его можно использовать для множества подобных "программных таймеров".
Например, будете Вы принимать данные от UART'а, он спасёт Вас для реализации таймаута. Ну или, например, можно туда-же динамическую индикацию воткнуть, или всякие кнопки опрашивать, ....
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

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

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

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

Кстати, можно (даже будет более правильнее) добавить к счётчику, в пару, флаг события-таймаута и в основном цикле манипулировать этими флагами. А в прерывании только чисто обработка, без всяких лишних кодов, связанных с этими событиями.
Например:
СпойлерОбъявление собственного таймера. Функция установки таймера:

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

typedef struct{
  unsigned int timer;
  unsigned     time_out:1;
}t_my_tmr;
//-----------------------------------
volatile t_my_tmr  tmr_led;
//---------------------------------------------------------------------------
void set_timer(t_my_tmr* tmr, unsigned int val){
bit _gie = GIE_bit;
  GIE_bit = 0;           // Не забываем про атомарный доступ !
  tmr->timer=val;
  tmr->time_out=0;
  GIE_bit = _gie;
}
//---------------------------------------------------------------------------
Обработчик таймера:

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

//---------------------------------------------------------------------------
void Interrupt(){
........
if(tmr_led.timer){
  if(!--tmr_led.timer)  tmr_led.time_out=1;
}
........
}
//---------------------------------------------------------------------------
Использование:

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

..........
..........
if(led_event){
  clear_led_event();
  set_timer(&tmr_led, 1000);
  LED_ON();
}
..........
..........
if(tmr_led.time_out){
  tmr_led.time_out=0;
  LED_OFF();
}
..........
..........
Всю работу с таймерами (установка, чтение, работа с флагами) можно вынести в отдельный модуль, и подключать его где необходимо.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

в случаях, когда особых требований к точности временных интервалов не предъявляется, я делаю так:

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

volatile int delay = 0;

//в обработчике прерываний таймера так:
if(delay) delay--;

// там, где надо выдержку сделать, делаю так:
delay = 100;
while(delay); // ожидание заданного интервала
разумеется, вовсе не обязательно тупо ждать, просто время от времени смотреть, обнулилась ли переменная delay или нет. и не нужно лишних флагов и т.п.

чаще всего я переменную delay делаю однобайтной...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

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

Тут, в принципе, тоже самое и получается. Только к переменной добавляется ещё флаг, указывающий на окончание отсчёта.
Просто не всегда бывает проверка переменной на ноль (т.б. проверка на окончание отсчёта) идёт после установки этой переменной. Она (проверка) может быть в любом месте цикла. А проверять, запускали ли мы её или нет - это ещё какой-то флаг нужен.

ЗЫ: вообще, я уже давно этой всей хренью не занимаюсь. Практически в каждом проекте использую ОСРВ, и не парюсь :) Даже просто для одного светодиода выделяю задачу, в которой собираю все флаги и мигаю там им :)
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

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

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

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

Ну представьте, есть процессы, которые работают параллельно (псевдо-, конечно, но выглядят как параллельно). Очень удобно, особенно в подобных случаях, как у Вас.
Вообще, понимание их оправданности и рациональности приходит с опытом их использования. Трудно это словами объяснить, но скажу одно - втянитесь, за уши потом от неё не оторвёшь :)
Почитайте - http://www.pic24.ru/doku.php/osa/ref/intro
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

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

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

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

Я ссылку дал не для выбора именно этой ОСи, а для почитать :) Автор хорошо описывает возможности ОСРВ, плюс как раз рассказывает об оправданности ОС в проектах.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

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

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

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

Я пользуюсь именно этой (OSA). Ось отличная. Простая и довольно-таки мощная.
Для камней, которые она не поддерживает (например PIC32), пишу свои простенькие планировщики.
Dmitry888
Встал на лапы
Сообщения: 131
Зарегистрирован: Чт мар 05, 2015 07:14:58

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

Сообщение Dmitry888 »

Спасибо за информацию, обязательно займусь изучением этой ОСРВ. Но пока у меня немного другие проблемы, дело в том что , как я уже писал, опыта у меня мало, в связи с этим есть определённые трудности: написал я программу, вроде работает, но вот смотрю я на исходный код и кажется мне, что какой -то он убогий, неоптимальный, мне даже самому спустя некоторое время будет трудно в нём разобраться, как говорят - "быдлокод". Я понимаю, что это приходит с опытом, но все - же посоветуйте что почитать на эту тему?
Ответить

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