Пн дек 11, 2017 04:29:24
Пн дек 11, 2017 04:42:59
Если вас не беспокоит, что когда контроллер "болтается в delay" он больше ничего делать не может - и так сойдёт.SpeedFighter писал(а):...В чем преимущество работы с таймером при опросе кнопок? Я получаю одинаковый результат же!...
Пн дек 11, 2017 05:06:23
Пн дек 11, 2017 16:08:36
Пн дек 11, 2017 19:05:13
// Подключение нужных библиотек
#include <stdio.h> // Стандартная библиотека ввода-вывода
#include <stdlib.h> // Стандартная библиотека контроля
#include <xc.h> // Специализированная библиотека XC8
// Параметры микроконтроллера
#define _XTAL_FREQ 16000000 // Тактовая частота 4 МГц
#define BOUNCE 15 // Время в мс для обработки дребезга
#define CORRMIN 18 // Число итераций в цикле для задержки в 100 мкс
#define CORRMAX 79998 // Число итераций в цикле для задержки в 400000 мкс
// CORR - Correction factor
// Параметры сигнала
#define SIGNAL 30 // Длительность сигнала в мкс
// Обознаение выводов и кнопок
#define START RA2 // Кнопка ПУСК МК
#define STOP RA3 // Кнопка СТОП МК
#define LED RA0 // Вывод на светодиоды
#define GREEN 1 // Сигнал для зеленого светодиода
#define RED 0 // Сигнал для красного светодиода
#define GENERATOR RA1 // Выход генератора
// Настройка МК
#pragma config FOSC = INTOSC // Выбор генератора (внешний/внутренний)
#pragma config BOREN = ON // Сброс при потере напряжения питания
#pragma config WDTE = ON // Включение/выключение сторожевого таймера
#pragma config PWRTE = OFF // Бит разрешения работы таймера включения (PWRTE)
#pragma config MCLRE = OFF // Перезагрузка устройства через MCLR
#pragma config CP = ON // Бит защиты
#pragma config LVP = OFF // Низковольтное программирование
#pragma config LPBOR = ON // Перезагрузка процессора при низкой мощности
#pragma config BORV = LO // Выбор точки отключения (низкая/высокая)
#pragma config WRT = OFF // Защита флеш памяти от записи
// Настройка прерываний
[b]INTCON=0b11100000; [/b] // Настройка прерываний (разрешение глобального прерывания, включение периферийных прерываний, включение прерываня Timer()
[b]OPTION=0b00101000;[/b] // Настройка TMR0 (отключен предделитель TMR0), т.е. таймер работает на частоте 16/2 = 8 МГц
int main() // Главная функция
{
[b] TMR0=0; // Обнуление таймера TMR0[/b]
// Объявление параметров конгруэнтного метода
g_Random[0] = 1;
g_Random[2] = 3;
g_Random[3] = 5;
Prepare(); // Запуск функции подготовки
while(1) // Бесконечный цикл работы
{
if(g_bStat) // Проверка режима
{
LED = GREEN; // Включение зеленого светодиода (вкл МК)
RandomDelay(); // Запуск функции случайной задержки
GENERATOR = 1; // Выставляем лог. 1 на выход генератора
__delay_us(SIGNAL); // Задерживаем лог. 1 на выходе
GENERATOR = 0; // Обнуляем выход генератора
}
else
{
LED = RED; // Включение красного светодиода (выкл МК)
}
}
return 0;
}
// Функция подготовки
void Prepare()
{
TRISA = 0b1100; // Направление работы ножек порта А (вход)
PORTA = 0b0000; // Очистка порта A
OSCCON = (1<<4)|(1<<5)|(1<<6); // Установка IRCF = '111' для частоты в 16 MHz
WPUA&=~((1<<0)|(1<<1)|(1<<2)|(1<<3)); // Отключение WEAK PULL-UP
ANSELA = 0; // Отключение аналоговой части
}
void ButtonInterrupt isr(void) // Прерывание для опроса кнопок
{
[b]if(TMR0IF)[/b] // Проверка переполнения таймера
{
if(!START && STOP && !g_bStat) // Проверка на нажатие клавиши старт
{
__delay_ms(BOUNCE); // Обработка дребезга
if(!START && STOP) // Обработка дребезга
{
g_bStat = 1; // Установка режима МК (вкл)
}
else
{
g_bStat = 0; // Установка режима МК (выкл)
}
}
else if(START && !STOP && g_bStat) // Проверка на нажатие клавиши стоп
{
__delay_ms(BOUNCE); // Обработка дребезга
if(START && !STOP) // Обработка дребезга
{
g_bStat = 0; // Установка режима МК (выкл)
}
}
else if(!START && !STOP && g_bStat) // Защита от дурака
{
__delay_ms(BOUNCE); // Обработка дребезга
if(!START && !STOP) // Обработка дребезга
{
g_bStat = 0; // Установка режима МК (выкл)
}
}
[b]TMR0IF = 0; // Cбрасываем флаг о переполнении[/b]
}
}
Вт дек 12, 2017 04:23:14
Не забывайте, что на таймеры подаётся FOSC/4.SpeedFighter писал(а):Как быть?
Таймер всегда даст прерывание при переходе на "0". Перефразируйте задачу: "Надо записать в таймер стартовое значение".SpeedFighter писал(а):чтобы таймер считал до числа N
Вт дек 12, 2017 05:17:46
Вт дек 12, 2017 05:24:57
Вт дек 12, 2017 09:16:01
Вт дек 12, 2017 14:39:50
Вт дек 12, 2017 18:52:25
Это надо ТЗ смотреть...SpeedFighter писал(а):...я не задавался этим вопросом, поэтому встречный вопрос: а какие есть варианты?
Вт дек 12, 2017 19:07:43
Ср дек 13, 2017 03:28:27
Ср дек 13, 2017 06:54:54
Ср дек 13, 2017 14:14:47
Ср дек 13, 2017 21:28:06