Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа 3.docx
Скачиваний:
13
Добавлен:
04.06.2015
Размер:
55.49 Кб
Скачать

Void adc_init(void) {

ADCSRA = 0x0 0;

ADMUX = 0x6 0; //АЦП инициализируется на работу с входом ADC0

ADCSRA = 0x0 0;

ADCSRA = 0xCF; //АЦП запускается в одиночном режиме

} //с предделителем 128

//Подпрограмма обработки прерывания готовности АЦП:

#pragma interrupt_handler adc_isr:iv_ADC

void adc_isr(void)

{

CLI(); //Запрет всех прерываний

adc_result=ADCH; //Считывание результата преобразования АЦП

if(adc_result<=5) adc_result=5; //Минимальная скважность

else if(adc_result>=250) adc_result=250; //Максимальная скважность

OCR0=adc_result; //Выдача результата на ШИМ таймера Т0

ADCSRA|=0x4 0; //Перезапуск АЦП

SEI(); //Разрешение всех прерываний

}

//Подпрограмма обработки прерывания по совпадению таймера Т0:

#pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP

void timer0_comp_isr(void)

{

CLI(); //Запрет всех прерываний

if((PINA&0x02)==0x02) //При движении «Вперед» {

PORTB=0x08; //включается транзистор VT4

}

else //При движении «Назад»

{

PORTB=0x02; //Включается транзистор VT2

}

SEI(); //Разрешение всех прерываний

}

//Подпрограмма обработки прерывания по переполнению таймера Т0:

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF

void timer0_ovf_isr(void)

{

CLI(); //Запрет всех прерываний

if((PINA&0x02)==0x02) //При движении «Вперед» {

PORTB=0x09; //Включаются транзисторы VT1 и VT4

}

else //При движении «Назад»

{

PORTB=0x06; //Включаются транзисторы VT2 и VT3

}

SEI(); //Разрешение всех прерываний

}

//Функция инициализации периферийных устройств контроллера:

void init_devices(void)

{

CLI(); //Запрет всех прерываний

port_init(); //Вызов функции инициализации портов

timer0_init(); //Вызов функции инициализации таймера Т0

adc_init(); //Вызов функции инициализации АЦП

MCUCR = 0x0 0;

GICR = 0x0 0; //Запрет всех внешних прерываний

TIMSK = 0x03; //Разрешение прерываний по совпадению и

//переполнению таймера Т0

SEI(); //Разрешение всех прерываний

}

//Главная функция программы:

Void main(void)

{

init_devices(); //Вызов функции инициализации устройств контроллера

while(1) //Бесконечный цикл

{

if((PINA&0x04)==0x04) //При подаче сигнала разрешения {

TCCR0=0x4B; //Запускается таймер Т0 в режиме ШИМ

}

else //При снятии сигнала разрешения

{

TCCR0=0x00; //Таймер Т0 останавливается

TCNT0=0x00;

PORTB=0x00; //управляющие импульсы снимаются

}

}

}

//

Рассмотрим программу более подробно.

  1. Сначала подключаются основные библиотеки, необходимые для работы программы и глобальные переменные:

#include <iom32v.h>

#include <macros.h>

unsigned char adc_result=0;

  1. После этого происходит переход на выполнение главной функции main (), из которой происходит вызов функции инициализации периферийных устройств контроллера init_devices():

CLI();

port_init() ;

timer0_init();

adc_init();

MCUCR = 0x00;

GICR = 0x00;

TIMSK = 0x03;

SEI();

  1. Функция инициализации периферийных устройств последовательно вызывает функции инициализации портов ввода/вывода, таймера Т0 и АЦП:

Void port_init (void) {

PORTA = 0xFE;

DDRA = 0x00;

PORTB = 0xF0;

DDRB = 0x0F;

PORTC = 0xFF;

DDRC = 0x00;

PORTD = 0xFF;

DDRD = 0x00;

}

void timer0_init(void)

{

TCCR0 = 0x00;

TCNT0 = 0x00;

OCR0 = 0x00;

TCCR0 = 0x00;

}