PIC16F1503. Тачка для прокачки — 3. Еда

PIC16F1503. Тачка для прокачки — 3. Еда

530

Ранее это было про звук и свет.
В конце концов , отойти некуда и пора собирать кар в нечто целое и практически никаких дивидендов. Есть один малюсенький вопросец: Как работает эта машинка будет врубаться и выключаться? А что традиция продолжится и в последующем посте с предшествующей темой?

Что бы не нарушить традицию продолжим тему предшествующего поста: blink svetodiodiki. Что в этом отвратительного?

Не так много с ними, начиная от Кривой на временной задержки и к ужасному событию обработчик прерываний от таймера.
Для начала необходимо сделать нормальную функцию задержки. Набор TIMER1 сроком на 1 мс и добавьте код
Для наших целей будет довольно с огромным запасом. Таковым обычным методом, мы получаем частотно-зависимый/Иной код функции задержки (основное, что бы Таймер Tikal) — 65 секунд. volatile uint16_t millis=0;
void DelayMS(uint16_t м)
{
millis=0;
while(millis<m);
}
… void TMR1_ISR(void)
{
millis++;

Как-то некрасиво в прерывание делать задержку (даже цикл), плюс куча сравнений, который отлично быть обращено куда-нибудь подальше. Сейчас поглядите на код зажигания светодиодов. Нет, для дома проекты полностью для себя, а для промышленных — не отлично.
Разглядим, к примеру, порт C, которая полностью отдана под светодиоды. Давайте опять поменять метод. Какой в этом смысл?
Младшие 3 бита мы в ответе за цвет. Старший 3 — для первых 3-х светодиодов. На уровне мыслей включите 1-ый красноватый, 2-ой зеленоватый, 3-ий-за оранжевый (либо красноватый+зеленоватый). Что будет в порту?
1-ый шаг, «красноватый» канал
0b00101001
2-ой шаг, «зеленоватый» канал
0b00110010
3-ий шаг, «голубий» канал
0b00000100
И формирование этих байтов дать функцию setLed — это именуется еще пореже, чем код прерывания и может дозволить для себя всякие расчеты, петли, и остальные излишества. Как вы сможете созидать, мы были не один раз высланы в порт б, что бы получить ту же функциональность.
Ну, мы знаем, что мы можем запихнуть в порт все, что он получил 2 биты никуда не подключен (судя по Даташиту и код). Это может быть восхитительная функция «побитовое» и «побитовое либо». Но что делать с портом, и от кого нам необходимо поменять лишь один бит, не мешая иным?
Что бы было понятней, напишу к примеру:
0b00001010 чтение из порта текущее значение. Нам нужен бит я выделил — нужно лишь поменять его значение. Другие располагаются случайным образом.
Сделать «побитового » либо» (обязано быть 1, Что бы и итог 1) с pre-function setLed маска. Чтоб включить бит он должен быть 0b00100000. Мы, к примеру, могут включать в себя биты
0b00001010 | 0b0010000 = 0b00101010
Все, нужен бит установлен, другие нетронутыми, так что вы сможете записать приобретенное значение обратно в порт.
А сейчас, что же бит будет сброшен с помощью «побитовое и» (обязано быть 1, Что бы на выходе тоже 1)
0b00101010 & 0b11011111 = 0b00001010
Казалось бы, все разумно. Переписать код.
Сменные светодиодные.c и Сид.ч В общем, функция setLed доверено приготовить 6 байтов, которые мы дадим в порт.
// базисных цветов
#define RED 1
#define GREEN 2
#define BLUE 3
#define OFF 0

extern volatile __u8 lc[3];
extern volatile __u8 la[3];

void setLed(__u8 n,__u8 c)
{
__u8 b;

if(n==0) b=0b11110111;
if(n==1) b=0b11101111;
if(n==2) b=0b11011111;
if(c>0)
{
c—;
if(n==3)
{
la[0]=1;
la[1]=1;
la[2]=1;
la[c]=0;
}
еще
{
lc[c]=lc[c]&b;
}
}
еще
{ // Выключить канал N
b=b^0xff;
if(n==3)
{
la[0]=1;
la[1]=1;
la[2]=1;
}
еще
{
lc[0]=lc[0]|б;
lc[1]=lc[1]|Б;
lc[2]=lc[2]|Б;
}
}

И в обработчик прерываний рецепт
LATC=lc[current_led];
_LED4_ = la[current_led];
current_led++;
раз(current_led==3) current_led=0;
И по времени скорее, так что на общую производительность контроллера тоже выше. Но, чтоб получить «белоснежный» сейчас будут иметь в три раза позвонить setLed, но это мелочи. Согласитесь, намного короче, чем прошлые версии (хотя биты я оставил для порта C, и порт, и было легче, чтоб вручную вынуть). Раза короче, потому он работает скорее. Приличный бонус со всех сторон.
Сейчас остается решить основной вопросец: как включить и как Выключить?
Но до этого чем это сделать-прикладные работы, нужно оценить «должны»? В принципе, у меня есть вариант, предложенный создателями машине клавиши на двери.
Написать последующий код
Прервать нас, пока мы не поставляем, потому просто включить-Выключить вручную при измерении. setLed(3, RED);
setLed(2, голубий);
PWM3_LoadDutyValue(49*2);
TMR2_LoadPeriodRegister(49);
__u8 c,q;
for(q=0;q<1;q++) {
setLed(0, красноватый);
setLed(1, выкл);
DelayMS(100);
for (c = 0; c < 10; c++) {
setLed(0);
DelayMS(50);
setLed(0, красноватый);
DelayMS(50);
}

setLed(1, BLUE);
setLed(0);
DelayMS(100);
for (c = 0; c < 10; c++) {
setLed(1, выкл);
DelayMS(50);
setLed(1, BLUE);
DelayMS(50);
}
}
PWM3_LoadDutyValue(0);
TMR2_LoadPeriodRegister(0);
setLed(0);
setLed(1, выкл);
setLed(2, выкл);
setLed(3, OFF);
DelayMS(10);
SLEEP();

Обратите внимание на крайнее утверждение — SLEEP() переводит микроконтроллер в спящий режим, когда все выключено и вынуть из этого состояния лишь некие прерывания.
Мой когда выдан svetodiodiki спалить и динамик болит, ток употребления 2.97-3mA. Подключите мультиметр для измерения тока употребления. И когда все это заканчивается, 0,01 ма и наименее (просто мой мультиметр 0,01 ма нижний предел измерения). Разница меж тактовой частотой 1 МГц и 4 МГц малы — всего 0,2 ма. Раз Вы не pelikat динамик, 2,85-2,9.
Согласен, стильные фигуры для 12 мигающие светодиоды? Раз мы ставим на «как традиционно», он получил бы ток 30-40ма.
Так у меня будет 2 батарейки ААА (средней мощности они MoC), просто подсчитать, сколько будет жить машинка.
Раз все время сигналит и мигает — MC/3mA/24h=13 дней. И раз все время спать, — 1000/0,1/24= 416 дней.
В целом, необходимость отдельного выключателя нет, и потому я решил применять уже приготовленный шаблон для клавиши. Подключите клавишу меж RA4 и «минус», в коде конфигураторе включил эту ногу для чтения и не забудьте включить подтягивающий резистор и генерация прерываний по данной ноге. Понятно, что в действительности числа будут меньше, поэтому что нет аккума не дозволит для себя, чтоб разрядить «в ноль». Но так-год, в спячку для каров-это чрезвычайно отлично.
Почему-то в коде конфигуратор запамятовал добавить код, чтоб разрешить прерывания (хотя клещей) и из-за этого я должен открыть Datasheet на процессор и отыскать, какие биты за что отвечают (на самом деле это отменная вещь). Включить включение прерывания от периферийных устройств и дозволить, присоединенный к порту A4 для их сотворения.
INTCONbits.IOCIE =1;
IOCANbits.IOCAN4 =1;
В США нажимая все пробуждается, моргает пару раз и засыпает. И проверьте еще раз.
со скоростью 0,2 Гц. Прекрасные флешер уже есть (Код выше), и с частотами сирены посодействовал мне в комментах. И не спрашивайте меня, как скорость измерять в Герцах 🙂 но звук чрезвычайно похож. Сирена милиции от 650 Гц. до 1350 Гц. Сирена скорой помощи: частотно-модулированного сигнала треугольной формы, с изменяющейся во времени частоты генерации 850 Гц и 1550 Гц.
Сейчас мы должны собрать все вышло (звук, мигающие огни, сон) в один кусочек кода. В наилучших традициях учебники, я оставлю его для вас, а не.

Практически готово, можно принимать, как традиционно, я multik.org/pic/policecar.rar habrahabr.ru