2013 г MPLAB IDE v8.89 Microchip MPLAB XC8 C Compiler V1.12 Метки:PIC10
Метка:PIC10
Датчик приближения от Румена Желева
Проект на Болгарском языке. Автор Румен Желев. Болгария. Проект, датчик приближения в котором устранены все недостатки влияния засветки посторонними источниками. Применен совершенно оригинальный принцип контроля ИК излучения. Основната идея на този датчик на приближение (proximity sensor) е да се управлява светодиодна лента която се използва като осветление над кухненски плот, чрез приближаване с ръка или …
Читать далее Датчик приближения от Румена Желева
Самый простой диммер для светодиодного освещения
Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы приведем несколько решений на PIC-микроконтроллеров. PIC10F320/322 это идеальное решения для создания всевозможных регуляторов освещения. При этом мы получаем довольно функционально навороченное устройство с минимальной стоимостью и минимальными …
Читать далее Самый простой диммер для светодиодного освещения
Гаджеты для домашней автоматики – Емкостной сенсор
Управление светодиодным освещением – Сенсор емкостной. Данный гаджет предназначен для управления освещением где необходимо включением освещение сенсорным прикосновением. Датчик позволяет управлять светодиодной нагрузкой в виде модулей или светодиодных лент освещения. Питание 12-24 вольта постоянного стабилизированного тока. Нагрузка активная, светодиодная лента на 12 или 24 вольта с максимальным током до 5А (13 А). Принцип реализации сенсора на …
Читать далее Гаджеты для домашней автоматики – Емкостной сенсор
Гаджеты для домашней автоматики – Датчик приближения
Управление светодиодным освещением – Датчик приближения. Данный гаджет предназначен для управления внутренним освещением мебели. Датчик позволяет определить закрытие или открытие дверцы или ящика и при этом включать или выключать освещение. Также его можно использовать в качестве выключателя (для светильника) – приблизил руку свет включился, второй раз выключился. Питание 12-24 вольта постоянного стабилизированного тока. Нагрузка активная, …
Читать далее Гаджеты для домашней автоматики – Датчик приближения
Гаджеты для домашней автоматики – Датчик движения
Управление светодиодным освещением – Датчик движения. Данный гаджет предназначен для управления освещением рабочих столов (кухонных столов), освещение прихожих, освещение зеркал в прихожих, автоматическое включение света в коридорах. Датчик позволяет определить наличие человека в зоне датчика и при этом включать освещение. Питание 12-24 вольта постоянного стабилизированного тока. Нагрузка активная, светодиодная лента на 12 или 24 вольта с …
Читать далее Гаджеты для домашней автоматики – Датчик движения
Первый проект для самых маленьких
Современные микроконтроллеры, это довольно сложные по функциональности устройства. Но есть образцы которые представляют устройство с минимальной конфигурацией, но обладают всеми первоначальными устройствами для понимания работы PIC-контроллеров.
PIC10F222 / PIC10F320/322
Самая простая архитектура, которая позволит, понять принцип работы микроконтроллера под управление программы.
Контроллер имеет 4 порта ввода вывода, 3 двунаправленных, т. е. могут как выводить информацию из контроллера, так и получать информацию из вне. Один порт, который может только работать на ввод данных.
Восьми битный АЦП работы с аналоговыми сигналами. Он позволяет сигналы в диапазоне 0-5 вольт преобразовывать в числовое значение в диапазоне от 0 до 255.
Восьми битный таймер для подсчета импульсов. Таймер может работать как от внутреннего генератора, так и с импульсами с “внешнего мира”. Таймер имеет предварительный делитель, который позволяет расширить диапазон подсчитываемых импульсов.
Двухуровневый стек – позволяющий вызывать в программе функции в два уровня вложения.
Сторожевой таймер – для контроля работы программы.
Для обучения необходимо собрать схему с применением PIC-контроллера. Для это можно использовать любую демо-плату.
К сожалению для обучения необходимо наличие программатора. Рекомендую использовать PICKIT-2, PICKIT-3.
Схема примера для обучения.
Резистор R1 для тестирования работы АЦП контроллера. Кнопки PB1 и PB2 предназначены для проведения опытов по вводу цифровых данных. Светодиоды LD1 и LD2 для индикации выполнения запрограммированных функций.
И так первое собираем схему на демо-плате.
Второе создаем проект.
Загружаем MPLAB®X.
Создаем новый проект
Выбираем тип проекта
Выбираем контроллер
Нажать продолжить
Выбираем компилятор для проекта.
Придумаем имя проекта, а также создадим каталог для проекта, выберем кодировку windows-1251.
Создаем рабочий файл – с именем main.
и вот оно начало
Прошло время и вышел на первое место PIC10F320/322 это уже полноценный микроконтроллер изучая который можно получить практически полное понятие о работе и функциях микроконтроллера.
Все примеры написаны на Microchip MPLAB XC8 C Compiler (Free Mode) V1.30
Функциональная схема микроконтроллера
Еще раз с чего начинаем, как подключить микроконтроллер к питающему напряжению и как подключить к программатору:
Для начала работы необходимо иметь не только микроконтроллер паяльник, а и тестер для возможности измерения напряжения и тока.
Первое на что начинающему электронщику надо обратить внимание, для питания необходимо взять пятивольтовый стабилизатор для нашего примера подойдет 78L05. Добавьте последовательно диод для защиты от неправильного подключения питания, это спасет от первых ошибок. Основная проблема по работе с таким микроконтроллером это его габариты, второе, что для тренировки необходимо выполнить условие внутрисхемного программирования. Для подключения внешних устройств к микроконтроллеру, необходимо учитывать, что должны быть подключены через резисторы с сопротивлением не ниже 680 ом. При первом включении проверьте напряжение на выходе стабилизатора должно быть 5 вольт и замерьте ток потребления, он не должен превышать нескольких миллиампер.
Для начала необходимо собрать выше приведенную схему, собирать можно на любой макетной плате, или можно использовать любые платы с этого сайта где используется микроконтроллер PIC10.
В PIC10F320 4 порта через которые он моде общаться с внешним миром, 3 двунаправленные, т.е. по ним может как поступать в контролер информация, так и выводиться из микроконтроллера обработанные данные, и один однонаправленный только на вход, это связана с техническими ограничениями.
С чего начинается программирование микроконтроллера. Первое это мы должны понять сможет ли наш выбранный контроллер решить поставленную задачу. Но в нашем варианте мы обучаемся и первая задача это ввод и вывод дискретных данных. Ввод будет при помощи тактовых кнопок вывод для индикации на светодиод.
Этап первый конфигурирование:
В каждом микроконтроллере есть регистры настройку которых необходимо выполнить в процессе программирования. Эти регистры отвечают за основные характеристики работы микроконтроллера, для этого в начале текста программы мы должны описать и настроить их работу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <xc.h> // для настройки под выбранный контроллер //------------------------------------------------------------------------------ // конфигурирование контроллера PIC10F320/322 //------------------------------------------------------------------------------ #pragma config FOSC = INTOSC // настраиваем работу от внутреннего генератора #pragma config BOREN = ON // Режим работы при пониженном напряжении #pragma config WDTE = ON // Сторожевой таймер включен #pragma config PWRTE = ON // Таймер задержки по включения питания включен #pragma config MCLRE = ON // Вывод сброса микроконтроллера выполняет функцию для внешнего сброса #pragma config CP = ON // Защита памяти программы включена #pragma config LVP = OFF // Режим низковольтного программирования отключен #pragma config LPBOR = ON // Сброс по понижению питания включен #pragma config BORV = HI // Уровень активации сброса - 2.7V #pragma config WRT = ALL // Защита памяти от записи - установлена на всю память |
Кратко можно понять из комментарием по работе каждого бита конфигурации. В будущем мы их будет менять, для изменения функций микроконтроллеры.
Следующий этап это настроить работу основной модуль это тактовый генератор:
В таком маленьком контроллера, такой функционально навороченный генератор. По функциональной схеме видно, что можно использовать для тактирования микропроцессора как внутренний генератор, так и внешний источник тактовых импульсов, эта функция переключается в регистре конфигурации бит FOSC. Если мы выбираем внутренний генератор, то можно выбрать широкий диапазон частот. Нам необходимо учитывать только одно, если нет необходимости в быстроте обработки данных, то выбираем максимально низкую частоту для экономии потребления. Хочу оговориться в микроконтроллере есть константа калибровки частоты внутреннего генератора и необходима его загрузка, но эту функцию выполнить компилятор Си автоматически. Для нашего проекта выполним настройку (она также будет изменяться в зависимости от необходимости):
1 2 3 4 5 6 7 |
OSCCON = 0b01110000; //регистр настройки генератора микроконтроллера /* ||||||+------ HFIOFS:флаг стабильности частоты внутреннего высокочастотного генератора 16 MHz * |||||+------- LFIOFR:флаг готовности работы низкочастотного генератора 31 kHz * ||||+-------- не используется, чтение дает 0 * |||+--------- HFIOFR:флаг готовности работы высокочастотного генератора 16 MHz * +++---------- IRCF<2:0>: выбор частоты генератора */ |
Так как мы в регистре конфигурации активировали сторожевой таймер, в функцию которого входит контроль непрерывной работы программы микроконтроллера. Если таймер отсчитает до нуля, то выполняется полный сброс микроконтроллера и запуск его программы с начала. Нам необходимо не только выполнить настройку, но и вставить в главный цикл команду сброса сторожевого таймера.
Таймер тактируется от собственного генератора и имеет предделитель для настройки периода срабатывания. Мы настроим на максимальное время 256 секунд. После коррекции программа примет вид
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
/* * File: main.c * Author: Gena Chernov * Catcatcat electronic * обучающий проект * Created on 1 Март 2014 г., 8:59 */ #include <xc.h> // для настройки под выбранный контроллер //------------------------------------------------------------------------------ // конфигурирование контроллера PIC10F320/322 //------------------------------------------------------------------------------ #pragma config FOSC = INTOSC // настраиваем работу от внутреннего генератора #pragma config BOREN = ON // Режим работы при пониженном напряжении #pragma config WDTE = ON // Сторожевой таймер включен #pragma config PWRTE = ON // Таймер задержки по включения питания включен #pragma config MCLRE = ON // Вывод сброса микроконтроллера выполняет функцию для внешнего сброса #pragma config CP = ON // Защита памяти программы включена #pragma config LVP = OFF // Режим низковольтного программирования отключен #pragma config LPBOR = ON // Сброс по понижению питания включен #pragma config BORV = HI // Уровень активации сброса - 2.7V #pragma config WRT = ALL // Защита памяти от записи - установлена на всю память void main(void) { OSCCON = 0b01110000; //регистр настройки генератора микроконтроллера /* ||||||+------ HFIOFS:флаг стабильности частоты внутреннего высокочастотного генератора 16 MHz * |||||+------- LFIOFR:флаг готовности работы низкочастотного генератора 31 kHz * ||||+-------- не используется, чтение дает 0 * |||+--------- HFIOFR:флаг готовности работы высокочастотного генератора 16 MHz * +++---------- IRCF<2:0>: выбор частоты генератора */ WDTCON = 0b00100101; /* |||||||+------ SWDTEN: таймер включен * ||+++++------- WDTPS<4:0>: период - 10010 = 1:8388608 (223) (Interval 256s nominal) * ++------------ не используется. */ // главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- } } |
Дальнейшее необходимо выполнить настройку портов ввода вывода. Для начала необходимо обратиться к схеме и настроим на вход порт RA0 и все остальные на выход. Кроме того подключим к порту RA0 внутренний подтягивающий резистор для создания потенциала для получения сигнала от тактовой кнопки.
1 2 3 4 5 6 |
// PORTA = 0b00000000; TRISA = 0b00000001; // настройка ввода вывода портов LATA = 0b00000000; // инициализация выходов ANSELA = 0b00000000; // все порты цифровые WPUA = 0b00000001; // активировать подтягивающий резистор на RA0 OPTION_REG = 0b00000000; // регистры подтягивающие включены |
Для удобства и краткости программы опишем наши порты, например порт индикации назовем LED, а порт тактовой кнопки TK0.
1 2 |
#define LED LATAbits.LATA1 // порт управления светодиодом #define TK0 PORTAbits.RA0 // вход подключенный к тактовой кнопке |
На этом основная настройка выполнена, теперь надо протестировать работу. Напишем функцию которая позволит при замыкании кнопки включать светодиод.
1 2 |
if(!TK0)LED=1; // если уровень = 0 включить светодиод else LED=0; // иначе выключить светодиод |
Текст программы для загрузки

Первый проект для самых маленьких - программа 01 1.29 KB 548 downloads
Первый проект для самых маленьких - программа...Это простая программа не учитывающая много особенностей работы механических кнопок. Для этого выполним режим когда нам необходимо выполнить функцию переключения. Т.е. нажатие кнопки включает светодиод, повторное выключает.
Логика работы следующая:
- Проверяем нажатие кнопки, т.е. проверяем уровень.
- Если уровень не соответствует нажатой кнопки пропускаем функцию и сбрасываем флаг кнопка нажата.
- Если уровень соответствует нажатой кнопке – выполним ожидание 10 мСек. которое необходимо для успокоения переходных помех при нажатии тактовый кнопки.
- Опять проверяем уровень на таковой кнопки
- Если уровень высокий пропускаем функцию, считаем, что это просто помеха была
- Если уровень низкий проверяем состояние флага кнопка нажата
- Если бит высокий, то мы считаем, что кнопка уже нажата и выполняется удержание, функция пропускается
- Если бит низкий то это значит, что кнопка еще не нажималась и необходимо активировать переключение светодиода
- Выполняем переключение и установку бита кнопка нажата, для блокировки повторения выполнения переключения если при следующем цикле клавиша будет удерживаться.
Текст программы главного цикла
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- if(!TK0) // проверяем нажатие кнопки { __delay_ms(10); // ожидаем окончание механического дребезга if(!TK0) // повторно проверяем нажатие { if(!NAG) // проверяем состояние флага кнопка нажата { NAG=1; // установить флаг кнопка нажата LED=!LED; // переключение светодиода } } } else { NAG=0; // сбросить флаг кнопка нажата } } |
Но для реализации этого фрагмента необходимо описать следующие параметры:
#define _XTAL_FREQ 16000000 // тактовая частота – указать компилятору рабочую тактовую частоту
bit NAG; // флаг кнопки нажатия – описать флаг
Скачать программу

Первый проект для самых маленьких - программа 02 1.46 KB 360 downloads
Первый проект для самых маленьких - программа...Теперь заставим светодиод мигать, для этого будем использовать макросы задержки _delay(х), __delay_ms(х), __delay_us(х).
1 2 3 4 5 6 7 |
// главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- LED=!LED; // переключение светодиод __delay_ms(500); // ожидаем } |
Код главного цикла очень прост, переключаем светодиод и выполняем ожидание макросом в полсекунды. Но такой пример для нормальной программы неприемлем, так как все основное машинное время тратиться на непродуктивное ожидание. Необходимо, чтобы формированием занимались таймера а процессор занимался бы основной обработкой данной. Для этого изучим включение таймера и обработку прерывание. А также формирование временных интервалов при помощи таймера.
Настройка таймера
1 2 3 4 5 6 7 8 9 |
// настройка таймера Т0 для формирования временных интервалов OPTION_REG = 0b00000111; /* |||||+++----- PS<2:0>: настройка предделителя * ||||+-------- PSA: предделитель подключен к таймеру * |||+--------- T0SE: выбор фронта синхронизации от внешнего источника * ||+---------- T0CS: тактирование от внутреннего генератора * |+----------- INTEDG: выбор фронта формирования от внешнего прерывания * +------------ WPUEN: регистры подтягивающие включены */ |
При такой настройке мы получим прерывание с частотой 61,035 Гц (61=4000000/256/256).
Настройка прерываний
1 2 3 4 5 6 7 8 9 10 11 |
// настройка прерываний INTCON = 0b10100000; /* |||||||+----- IOCIF: флаг прерывания по изменению состоянию по входам * ||||||+------ INTF: INT Флаг прерывания от внешнего источника * |||||+------- TMR0IF: Timer0 флаг прерывания от таймера * ||||+-------- IOCIE: прерывания по изменения состояния входов отключены * |||+--------- INTE: INT внешние прерывания отключены * ||+---------- TMR0IE: Timer0 разрешить прерывания * |+----------- PEIE: прерывания от периферии отключены * +------------ GIE: разрешить глобальные прерывания */ |
Разрешим прерывание от таймера и разрешим глобальные прерывания.
Сам текст функции прерывания
1 2 3 4 5 6 7 8 9 10 11 12 |
void interrupt my_isr(void) // { if(TMR0IF) { TMR0IF=0;//сбросить прерывания if(--timer_sek==0) { timer_sek=30; LED=!LED; // переключение светодиод } } } |
В этой функции переменой timer_sek выполняется функция дополнительного делителя. При значении 30 время выполнения составляет приблизительно 0,5 секунды.
Теперь усложним задачу и добавим функция мигания светодиода с управлением длительностью таймером и функция выключения включения одной кнопкой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
/* * File: main.c * Author: Gena Chernov * Catcatcat electronic * обучающий проект * Created on 1 Март 2014 г., 8:59 * v 0.01 - включения светодиода от нажатия кнопки * v 0.02 - функция переключения светодиода одной кнопкой * v 0.03 - функция мигания светодиода с управлением длительностью таймером и функция выключения включения одной кнопкой */ #include <xc.h> // для настройки под выбранный контроллер //------------------------------------------------------------------------------ // конфигурирование контроллера PIC10F320/322 //------------------------------------------------------------------------------ #pragma config FOSC = INTOSC // настраиваем работу от внутреннего генератора #pragma config BOREN = ON // Режим работы при пониженном напряжении #pragma config WDTE = ON // Сторожевой таймер включен #pragma config PWRTE = ON // Таймер задержки по включения питания включен #pragma config MCLRE = ON // Вывод сброса микроконтроллера выполняет функцию для внешнего сброса #pragma config CP = ON // Защита памяти программы включена #pragma config LVP = OFF // Режим низковольтного программирования отключен #pragma config LPBOR = ON // Сброс по понижению питания включен #pragma config BORV = HI // Уровень активации сброса - 2.7V #pragma config WRT = ALL // Защита памяти от записи - установлена на всю память #define LED LATAbits.LATA1 // порт управления светодиодом #define TK0 PORTAbits.RA0 // вход подключенный к тактовой кнопке #define _XTAL_FREQ 16000000 // тактовая частота bit NAG, FLAGLED; // флаг кнопки нажатия char timer_sek; // таймер предделитель #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) void main(void) { OSCCON = 0b01110000; //регистр настройки генератора микроконтроллера /* ||||||+------ HFIOFS:флаг стабильности частоты внутреннего высокочастотного генератора 16 MHz * |||||+------- LFIOFR:флаг готовности работы низкочастотного генератора 31 kHz * ||||+-------- не используется, чтение дает 0 * |||+--------- HFIOFR:флаг готовности работы высокочастотного генератора 16 MHz * +++---------- IRCF<2:0>: выбор частоты генератора */ WDTCON = 0b00100101; /* |||||||+------ SWDTEN: таймер включен * ||+++++------- WDTPS<4:0>: период - 10010 = 1:8388608 (223) (Interval 256s nominal) * ++------------ не используется. */ CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- // настройка портов микроконтроллера // PORTA = 0b00000000; TRISA = 0b00000001; // настройка ввода вывода портов LATA = 0b00000000; // инициализация выходов ANSELA = 0b00000000; // все порты цифровые WPUA = 0b00000001; // активировать подтягивающий резистор на RA0 // настройка таймера Т0 для формирования временных интервалов OPTION_REG = 0b00000111; /* |||||+++----- PS<2:0>: настройка предделителя * ||||+-------- PSA: предделитель подключен к таймеру * |||+--------- T0SE: выбор фронта синхронизации от внешнего источника * ||+---------- T0CS: тактирование от внутреннего генератора * |+----------- INTEDG: выбор фронта формирования от внешнего прерывания * +------------ WPUEN: регистры подтягивающие включены */ // настройка прерываний INTCON = 0b10100000; /* |||||||+----- IOCIF: флаг прерывания по изменению состоянию по входам * ||||||+------ INTF: INT Флаг прерывания от внешнего источника * |||||+------- TMR0IF: Timer0 флаг прерывания от таймера * ||||+-------- IOCIE: прерывания по изменения состояния входов отключены * |||+--------- INTE: INT внешние прерывания отключены * ||+---------- TMR0IE: Timer0 разрешить прерывания * |+----------- PEIE: прерывания от периферии отключены * +------------ GIE: разрешить глобальные прерывания */ timer_sek=30; // главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- if(!TK0) // проверяем нажатие кнопки { __delay_ms(10); // ожидаем окончание механического дребезга NOP(); if(!TK0) // повторно проверяем нажатие { if(!NAG) // проверяем состояние флага кнопка нажата { NAG=1; // установить флаг кнопка нажата FLAGLED=!FLAGLED; // переключение светодиода } } } else { NAG=0; // сбросить флаг кнопка нажата } NOP(); } } void interrupt my_isr(void) // { if(TMR0IF) { TMR0IF=0;//сбросить прерывания if(--timer_sek==0) { timer_sek=30; if(FLAGLED)LED=!LED; // переключение светодиод else LED=0; } } } |
Файл для загрузки

Первый проект для самых маленьких - программа 03 1.98 KB 317 downloads
Первый проект для самых маленьких - программа...Измерение температуры при помощи модуля индикатора температуры
Для этого необходимо включить два модуля в работу
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// настройка АЦП ADCON = 0b10011001; /* |||||||+----- ADON: * ||||||+------ GO/DONE: * |||+++------- CHS<2:0>:110 = Temperature Indicator(1) * +++---------- ADCS<2:0>:100 = FOSC/4 */ // настройка индикатора температуры FVRCON = 0b00110000; /* ||||||++----- ADFVR<1:0>:00 = ADC Fixed Voltage Reference Peripheral output is off. * ||||++------- Unimplemented: Read as ‘0 ‘ * |||+--------- TSRNG:1 = VOUT = VDD - 4VT (High Range) * ||+---------- TSEN:1 = Temperature Indicator is enabled * |+----------- FVRRDY:0 = Fixed Voltage Reference output is not ready or not enabled * +------------ FVREN:0 = Fixed Voltage Reference is disabled */ |
Для контроля в главный цикл вставим измерение и индикацию. Значение настроено приблизительно температуру тела человека, при нагреве от тепла руки будет переключение индикации. Если температура ниже будет гореть светодиод, при нагреве отключаться. Эта функция носит название на нагрев. Для охлаждения необходимо знак в “<” на “>“.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- GO_nDONE=1; while(GO_nDONE); if(ADRES<99)//режим для обогрева { LED=1; } else { LED=0; } } |
Файл примера для загрузки

Первый проект для самых маленьких - программа 04 1.92 KB 305 downloads
Первый проект для самых маленьких - программа...Пример простая “мигалка”. Используется для управления три кнопки, в две предназначенные задания частоты мигания, третья для включения выключения мигания.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
/* * File: main.c * Author: Gena Chernov * Catcatcat electronic * обучающий проект * Created on 1 Март 2014 г., 8:59 * v 0.01 - включения светодиода от нажатия кнопки * v 0.02 - функция переключения светодиода одной кнопкой * v 0.03 - функция мигания светодиода с управлением длительностью таймером и функция выключения включения одной кнопкой * v 0.04 - контроль температуры при помощи микроконтроллера. * v 0.05 - измерение температуры, контроль * v 0.06 - мигалка с изменяемой частотой */ #include <xc.h> // для настройки под выбранный контроллер //------------------------------------------------------------------------------ // конфигурирование контроллера PIC10F320/322 //------------------------------------------------------------------------------ #pragma config FOSC = INTOSC // настраиваем работу от внутреннего генератора #pragma config BOREN = ON // Режим работы при пониженном напряжении #pragma config WDTE = ON // Сторожевой таймер включен #pragma config PWRTE = ON // Таймер задержки по включения питания включен #pragma config MCLRE = OFF // Вывод сброса микроконтроллера выполняет функцию для внешнего сброса #pragma config CP = ON // Защита памяти программы включена #pragma config LVP = OFF // Режим низковольтного программирования отключен #pragma config LPBOR = ON // Сброс по понижению питания включен #pragma config BORV = HI // Уровень активации сброса - 2.7V #pragma config WRT = ALL // Защита памяти от записи - установлена на всю память #define LED LATAbits.LATA1 // порт управления светодиодом #define TK0 PORTAbits.RA0 // вход подключенный к тактовой кнопке #define TK1 PORTAbits.RA2 // вход подключенный к тактовой кнопке #define TK2 PORTAbits.RA3 // вход подключенный к тактовой кнопке #define _XTAL_FREQ 16000000 // тактовая частота bit NAG, FLAGLED; // флаг кнопки нажатия char timer_sek, chstota; // таймер предделитель #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) void main(void) { OSCCON = 0b01110000; //регистр настройки генератора микроконтроллера /* ||||||+------ HFIOFS:флаг стабильности частоты внутреннего высокочастотного генератора 16 MHz * |||||+------- LFIOFR:флаг готовности работы низкочастотного генератора 31 kHz * ||||+-------- не используется, чтение дает 0 * |||+--------- HFIOFR:флаг готовности работы высокочастотного генератора 16 MHz * +++---------- IRCF<2:0>: выбор частоты генератора */ WDTCON = 0b00100101; /* |||||||+------ SWDTEN: таймер включен * ||+++++------- WDTPS<4:0>: период - 10010 = 1:8388608 (223) (Interval 256s nominal) * ++------------ не используется. */ CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- // настройка портов микроконтроллера // PORTA = 0b00000000; TRISA = 0b00001101; // настройка ввода вывода портов LATA = 0b00000000; // инициализация выходов ANSELA = 0b00000000; // все порты цифровые WPUA = 0b00001101; // активировать подтягивающий резистор на RA0 // настройка таймера Т0 для формирования временных интервалов OPTION_REG = 0b00000111; /* |||||+++----- PS<2:0>: настройка предделителя * ||||+-------- PSA: предделитель подключен к таймеру * |||+--------- T0SE: выбор фронта синхронизации от внешнего источника * ||+---------- T0CS: тактирование от внутреннего генератора * |+----------- INTEDG: выбор фронта формирования от внешнего прерывания * +------------ WPUEN: регистры подтягивающие включены */ // настройка прерываний INTCON = 0b10100000; /* |||||||+----- IOCIF: флаг прерывания по изменению состоянию по входам * ||||||+------ INTF: INT Флаг прерывания от внешнего источника * |||||+------- TMR0IF: Timer0 флаг прерывания от таймера * ||||+-------- IOCIE: прерывания по изменения состояния входов отключены * |||+--------- INTE: INT внешние прерывания отключены * ||+---------- TMR0IE: Timer0 разрешить прерывания * |+----------- PEIE: прерывания от периферии отключены * +------------ GIE: разрешить глобальные прерывания */ chstota=30; timer_sek=30; // таймер дополнительный делитель // главный цикл программы while(1) { CLRWDT(); // сброс сторожевого таймера +++++++++++++++++++++- if(!TK1) // проверяем нажатие кнопки { __delay_ms(10); // ожидаем окончание механического дребезга NOP(); if(!TK1) // повторно проверяем нажатие { if(!NAG) // проверяем состояние флага кнопка нажата { NAG=1; // установить флаг кнопка нажата FLAGLED=!FLAGLED; // переключение светодиода } } } else if(!TK0) // проверяем нажатие кнопки { __delay_ms(10); // ожидаем окончание механического дребезга NOP(); if(!TK0) // повторно проверяем нажатие { if(!NAG) // проверяем состояние флага кнопка нажата { NAG=1; // установить флаг кнопка нажата if(chstota<255)chstota++; // переключение светодиода } } } else if(!TK2) // проверяем нажатие кнопки { __delay_ms(10); // ожидаем окончание механического дребезга NOP(); if(!TK2) // повторно проверяем нажатие { if(!NAG) // проверяем состояние флага кнопка нажата { NAG=1; // установить флаг кнопка нажата if(chstota>1)chstota--; // переключение светодиода } } } else { NAG=0; // сбросить флаг кнопка нажата } // // NOP();chstota } } void interrupt my_isr(void) // { if(TMR0IF) { TMR0IF=0;//сбросить прерывания if(--timer_sek==0) // дополнительный делитель до 2 Гц { timer_sek=chstota; // 30 - 2 Гц if(FLAGLED)LED=!LED; // переключение светодиод else LED=0; } } } |
Файл для загрузки

Первый проект для самых маленьких - программа 05 2.15 KB 370 downloads
Первый проект для самых маленьких - программа...Для дальнейшего развития, читайте проекты:
Самый простой диммер для светодиодного освещения
Гаджеты для домашней автоматики – Емкостной сенсор
Гаджеты для домашней автоматики – Датчик приближения
Гаджеты для домашней автоматики – Датчик движения
Датчик приближения от Румена Желева
Это может быть интересно
Счетчики посетителей
Вас сосчитали!? или счетчики посетителей. Для чего нужны счетчики посетителей? Какие они бывают? ТОРГОВЛЯ. Подсчитайте, сколько ваш магазин посещает человек за день. Кок много человек приходит утром, какое количество вечером. …Часы + Календарь + Термометр + …
Часы + Календарь + Термометр + Индикатор влажности + Секундомер + Дистанционное управление на ИК лучах (пульты на RC-5 протоколе) + Автоматическая регулировка яркости + Возможность вывода данных через USB, на плате ILLISSI_B4_primum …Цифровой спидометр для автомобиля
Универсальность печатной платы ch-c0030pcb позволяет создавать на её основе разнообразные устройства. Одним из таких устройств является электронный спидометр для автомобиля, в котором можно задать два компаратора скорости, например, для города и …Ссылки на интересные источники
Сбор 3D моделей от André L’Hérault конденсаторы, резисторы, индуктивности dropbox IPC-SM-782 Surface Mount Design and Land Pattern Standard Видео уроки по Altium designer Alexey Sabunin https://www.youtube.com/channel/UCG7N5CqXpyK8nQjr1EmMgng Сергей Булавинов https://www.youtube.com/channel/UCISAMXRnN_Qw9UTjUwZI1Jw Robert Feranec https://www.youtube.com/user/matarofe Самый быстрый, …NS108-5050-16bit от Newstar
Кто уже использует в своих проектах адресуемые светодиоды хорошо знакомы с такими как WS2812 и им подобные. Эти светодиоды для управления используют однопроводную шину. Из-за этого пропускная способность такой шины …MCC PIC24 – модуль OUTPUT COMPARE – в режиме генератора звуковых сигналов
При проектировании простых устройств автоматики, часто необходимо иметь механизм звукового оповещения. Самый верхний уровень, это формирование голосовых сообщений, но об этом, как то по позже… В самом примитивном варианте можно …MCC PIC24 – модуль OUTPUT COMPARE – режиме ШИМ
Во многих системах управления, для формирования управляющих сигналов требуется модуль ШИМ, он позволяет не только формировать импульсы заданной длительности, но и с применением обычного RC фильтра строить простые ЦАП. MCC …Регулятор влажности ch-3800
И еще один проект на плате ch-c3xxx – универсальный регулятор влажности ch-3800. Регулятор позволяет работать как в режиме индикатора влажности, так и в режиме регулятора. Рабочий диапазон измеряемой относительной …LED драйвер TM1639
TМ1639 позволяет работать на матрицу 8*8 или 8 семисегметных индикаторов. Может работать как на индикаторы с общим катодом, но и есть возможность подключать общим анодом. Для управления драйвером используется трех …Moving average – скользящее среднее
Скользящая средняя, скользящее среднее (англ. moving average, MA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания краткосрочных колебаний …