Скачиваний:
13
Добавлен:
30.03.2023
Размер:
188.43 Кб
Скачать
  1. Какие бывают аналоговые входы?

Аналоговый режим отличается от цифрового уровнями подаваемых на вход сигналов. Для цифрового режима — это стандартные двоичные перепады напряжения НИЗКИЙ/ВЫСОКИЙ. Для аналогового режима допускаются сигналы любой формы в диапазоне 0… VСС.

Аналоговые входы МК отождествляются с аналоговым компаратором и АЦП (усилитель с программируемым коэффициентом усиления). Основной параметр АЦП – разрядность.

  1. Назначение резисторов rup / rdown.

Резисторы имеют англоязычные названия: «pull-up» («тянуть вверх»), «pulldown» («тянуть вниз»). Если для коммутации резисторов применяется ключ («switch»), то используются похожие термины «switched pull-up», «switched pulldown».

Резисторы RUР, RDOWN изготавливаются на основе интегральных полевых транзисторов. Большой технологический разброс определяет широкие допуски, вплоть до ±50% от номинала, например, 30…100 кОм.

ТЕМА 2

Условие:

Мигать попеременно светодиодами D1 и D5. Время горения светодиода в четыре раза больше чем время простоя. При нажатии кнопки загораются D5 и D8. Организовать мигание с помощью прерываний от таймера.

Решение:

#include <xc.h> //подключение библиотеки

#define _XTAL_FREQ 4000000 // объявим частоту нашего резонатора

// CONFIG

#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)

#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)

#pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is enabled)

#pragma config CP = OFF // Code Protection bit (Code protection disabled)

//------------------------------------------

unsigned int TIM0_count=0; //Добавим глобальную переменную для счёта вхождений в обработчик прерывания

//------------------------------------------

unsigned char CheckButton(void) //распознавание зажатой кнопки

{

unsigned char result=0;

unsigned int butcount=0;

while(!RA2)

{

if(butcount < 10000)

{

butcount++;

}

else

{

result = 1;

break;

}

}

return result;

}

void __interrupt() timer0() //Добавим специальную функцию-обработчик прерывания от таймера0

{

if(CheckButton()){ //при нажатой кнопке происходит следующее

PORTBbits.RB7 = 1; //включен горит

PORTBbits.RB4 = 1; //включен горит

switch(TIM0_count%10) //получаем в качестве аргумента остаток от деления на 10

{ //включается и выключается при case 0, 5 и 4, 9 соответственно

case 0:

PORTBbits.RB0 = 1;

break;

case 4:

PORTBbits.RB0 = 0;

break;

case 5:

PORTBbits.RB0 = 1;

break;

case 9:

PORTBbits.RB4 = 1;

PORTBbits.RB0 = 0;

break;

}

}

else //в ином случае (когда кнопка не нажата)

{

switch(TIM0_count%10)

{ //при соответствующих кейсах вкл/выкл соответствующие светодиоды, создавая эффект бегущих огней

case 0:

PORTBbits.RB0 = 1;

break;

case 3:

PORTBbits.RB4 = 0;

break;

case 4:

PORTBbits.RB0 = 0;

PORTBbits.RB4 = 1;

break;

case 5:

PORTBbits.RB0 = 1;

break;

case 8:

PORTBbits.RB4 = 0;

break;

case 9:

PORTBbits.RB4 = 1;

PORTBbits.RB0 = 0;

break;

}

}

TIM0_count++;

if(TIM0_count>3999)

{

TIM0_count=0;

}

T0IF=0;

}

//------------------------------------------

void main(void) {

TRISB = 0x00;

PORTB = 0x00;

TRISA &= ~0x03;

PORTA &= ~0x03;

TRISA |= 0x04;

OPTION_REG=0x07; //включаем 0,1 и 2 биты предделителя

INTCON=0xA0; //включаем глобальные прерывания и прерывания от таймер, установкой в 1 биты 7 и 5 регистра

TMR0=0; // заносится 0 в регистр счета таймера, запуск таймера

while(1)

{

}

return;

}

Вывод:

Создан проект в котором изучены принципы управления таймер-счетчиками. Таймер-счетчики предназначаются для формирования временных интервалов и подсчета событий, что позволяет (при использовании соответствующего программного обеспечения) реализовывать на их основе любые функции времени, в том числе управление в реальном времени (т.е. во временном масштабе объекта).

Контрольные вопросы: