Например TDA7294

Форум РадиоКот • Просмотр темы - Програмирование pic на СИ.
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн авг 18, 2025 19:05:58

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 1364 ]     ... , , , 33, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 08:55:08 
Сверлит текстолит когтями

Карма: 12
Рейтинг сообщений: 124
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1235
Рейтинг сообщения: 0
Таймер... фоновый режим... парсить... Слова то какие.))
Код:
while (1) {
  static char c;
 
  DelayMs(50);
  if (KEY) {
    on(LED);
    c = 0;
  }
  if (LED && ++c >= 1000 / 50)
    off(LED);
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 08:59:57 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4568
Откуда: Планета Земля
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
OKF писал(а):
Слова то какие.))
Ну а что тут такого ? ))
Вся проблема может заключаться в том, что человеку нужно дополнение к его уже существующей программе. Например, чтобы горел светодиод при приёме информации по UART'у. В таком случае, подобные примеры, уже не катят. Нужно основываться на уже реализованном алгоритме.
По этому, проще объяснить на словах, чем давать готовые и возможно бесполезные куски кода.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 09:14:47 
Встал на лапы

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 10:12:39 
Открыл глаза

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 10:41:20 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2117
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18404
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
по-моему, тут налицо непонимание общего алгоритма решения задачи.
если я все понял верно, то решение такое:
1. после получения "правильного" сообщения включаем светодиод и запускаем таймера на 1 сек.
2. проверяем, истек таймер или нет
3. если истек - гасим светодиод.
то есть где-то в нужном месте добавляется такой код:
Код:
if(resived_message()){
   start_timer(1000) // 1000 мс
   led_on();
}
if (!timer_is_running()) led_off();

таймер, разумеется, асинхронный

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 11:00:00 
Встал на лапы

Зарегистрирован: Чт мар 05, 2015 07:14:58
Сообщений: 131
Рейтинг сообщения: 0
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 писал(а):
не понятно в чём заключается проблема.

Проблема в недостатке опыта и знаний.
Тот код, что привел выше для описаной задачи подходит, или это делается по другому?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 11:19:32 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4568
Откуда: Планета Земля
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Посмотрите в сторону 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;
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 11:44:33 
Встал на лапы

Зарегистрирован: Чт мар 05, 2015 07:14:58
Сообщений: 131
Рейтинг сообщения: 0
Спасибо!
Не могли бы вы объяснить чем этот вариант лучше?

Получилось как-то так:
Спойлер
Код:
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с.
     
    }
  }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 11:51:41 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4568
Откуда: Планета Земля
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Ну, хотябы тем, что таймер занят не только для одного светодиода. Его можно использовать для множества подобных "программных таймеров".
Например, будете Вы принимать данные от UART'а, он спасёт Вас для реализации таймаута. Ну или, например, можно туда-же динамическую индикацию воткнуть, или всякие кнопки опрашивать, ....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 11:54:16 
Встал на лапы

Зарегистрирован: Чт мар 05, 2015 07:14:58
Сообщений: 131
Рейтинг сообщения: 0
Всё понял, еще раз спасибо за помощь!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 12:19:44 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4568
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Кстати, можно (даже будет более правильнее) добавить к счётчику, в пару, флаг события-таймаута и в основном цикле манипулировать этими флагами. А в прерывании только чисто обработка, без всяких лишних кодов, связанных с этими событиями.
Например:
СпойлерОбъявление собственного таймера. Функция установки таймера:
Код:
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();
}
..........
..........

Всю работу с таймерами (установка, чтение, работа с флагами) можно вынести в отдельный модуль, и подключать его где необходимо.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 17:13:23 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2117
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18404
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
в случаях, когда особых требований к точности временных интервалов не предъявляется, я делаю так:
Код:
volatile int delay = 0;

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

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

чаще всего я переменную delay делаю однобайтной...

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Чт апр 16, 2015 17:44:08 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4568
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Тут, в принципе, тоже самое и получается. Только к переменной добавляется ещё флаг, указывающий на окончание отсчёта.
Просто не всегда бывает проверка переменной на ноль (т.б. проверка на окончание отсчёта) идёт после установки этой переменной. Она (проверка) может быть в любом месте цикла. А проверять, запускали ли мы её или нет - это ещё какой-то флаг нужен.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Пн апр 20, 2015 07:47:44 
Встал на лапы

Зарегистрирован: Чт мар 05, 2015 07:14:58
Сообщений: 131
Рейтинг сообщения: 0
Аlex писал(а):
Практически в каждом проекте использую ОСРВ, и не парюсь :)

Насколько оправдано использование ОСРВ? Удобно-ли её использование? Трудно разобраться в этом?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Пн апр 20, 2015 08:21:07 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4568
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Ну представьте, есть процессы, которые работают параллельно (псевдо-, конечно, но выглядят как параллельно). Очень удобно, особенно в подобных случаях, как у Вас.
Вообще, понимание их оправданности и рациональности приходит с опытом их использования. Трудно это словами объяснить, но скажу одно - втянитесь, за уши потом от неё не оторвёшь :)
Почитайте - http://www.pic24.ru/doku.php/osa/ref/intro


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Пн апр 20, 2015 09:22:59 
Встал на лапы

Зарегистрирован: Чт мар 05, 2015 07:14:58
Сообщений: 131
Рейтинг сообщения: 0
почему именно OSA? а не, например, популярая FreeRTOS? или ещё какая-нибудь?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Пн апр 20, 2015 09:49:53 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4568
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Я ссылку дал не для выбора именно этой ОСи, а для почитать :) Автор хорошо описывает возможности ОСРВ, плюс как раз рассказывает об оправданности ОС в проектах.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Пн апр 20, 2015 09:59:05 
Встал на лапы

Зарегистрирован: Чт мар 05, 2015 07:14:58
Сообщений: 131
Рейтинг сообщения: 0
Какой ОС Вы отдали своё предпочтение? Как выбрать именно ту, которая лучше всего подойдёт?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Пн апр 20, 2015 10:04:34 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4568
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Я пользуюсь именно этой (OSA). Ось отличная. Простая и довольно-таки мощная.
Для камней, которые она не поддерживает (например PIC32), пишу свои простенькие планировщики.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Програмирование pic на СИ.
СообщениеДобавлено: Пн апр 20, 2015 10:37:09 
Встал на лапы

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


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 1364 ]     ... , , , 33, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 111


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y