Код: Выделить всё
while (1) {
static char c;
DelayMs(50);
if (KEY) {
on(LED);
c = 0;
}
if (LED && ++c >= 1000 / 50)
off(LED);
}
Код: Выделить всё
while (1) {
static char c;
DelayMs(50);
if (KEY) {
on(LED);
c = 0;
}
if (LED && ++c >= 1000 / 50)
off(LED);
}
Ну а что тут такого ? ))OKF писал(а):Слова то какие.))
Камень, компилятор?Весь алгоритм в прерывании.Dmitry888 писал(а):Задержек в основном цикле быть не должно, иначе можно пропустить "важные события". В итоге должно выглядеть как то так: по UART приходят сообщения с переиодичностью в 100мс., если сообщение попадает под условие - горит светодиод, если сообщение "неправильное" или нет сообщений - светодиод гаснет.
?не понятно в чём заключается проблема.
Код: Выделить всё
if(resived_message()){
start_timer(1000) // 1000 мс
led_on();
}
if (!timer_is_running()) led_off();PIC18F2580, MikroC Pro.Vano79 писал(а):Камень, компилятор?Весь алгоритм в прерывании.
Код: Выделить всё
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;
}
}
}
Проблема в недостатке опыта и знаний.Vano79 писал(а):не понятно в чём заключается проблема.
Код: Выделить всё
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;
}
Код: Выделить всё
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с.
}
}
}Код: Выделить всё
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();
}
..........
..........
Код: Выделить всё
volatile int delay = 0;
//в обработчике прерываний таймера так:
if(delay) delay--;
// там, где надо выдержку сделать, делаю так:
delay = 100;
while(delay); // ожидание заданного интервалаНасколько оправдано использование ОСРВ? Удобно-ли её использование? Трудно разобраться в этом?Аlex писал(а):Практически в каждом проекте использую ОСРВ, и не парюсь![]()