Модератор: boogyman
scorpionlion
Любитель
Сообщения: 17 Зарегистрирован: 07 янв 2015, 23:39
Откуда: Россия Евпатория
Контактная информация:
#1
Сообщение
scorpionlion » 11 янв 2015, 16:50
изучаю азы программирования, научился включать и мигать светодиодом. теперь попытался сделать задержку включения и выключения для трех независимых "каналов". но что-то не так, нет стабильности.
Код: Выделить всё
#include <avr/io.h>
/***функция задержки***/
void wait1 (void)
{
TCNT1 = 0;
while (TCNT1 < 7812){};
}
int main(void)
{
DDRC = 0x00; // Порт C вход
PORTC = 0xFF; // подключаем внутренние подтяг. резисторы
DDRD = 0xFF; // Порт D выход
PORTD = 0x00; // Лог. 0 на выходе
// Настройка таймера
TCCR1A = 0x00;
TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10); //выбор коэффициента предделителя clk/1024
while(1)
{
//управление 1
if(PINC&(1 << PC0)) // Проверяем наличие сигнала PC0
{
PORTD &= ~(1 << PD0); // нагрузка отключена
wait1(); // Задержка
}
else
{
PORTD |= (1 << PD0); // нагрузка включена PD0
//wait1(); // Задержка
}
//управление 2
if(PINC&(1 << PC1)) // Проверяем наличие сигнала PC1
{
PORTD &= ~(1 << PD1); // нагрузка отключена
wait1(); // Задержка
}
else
{
PORTD |= (1 << PD1); // нагрузка включена PD1
//wait1(); // Задержка
}
//управление 3
if(PINC&(1 << PC2)) // Проверяем наличие сигнала PC2
{
PORTD &= ~(1 << PD2); // нагрузка отключена
wait1(); // Задержка
}
else
{
PORTD |= (1 << PD2); // нагрузка включена PD2
wait1(); // Задержка
}
}
}
использую Atmel Studio 6
Можно ли еще как-то организовать задержку включения и выключения в 3-х каналах?
Последний раз редактировалось
scorpionlion 11 янв 2015, 18:56, всего редактировалось 1 раз.
автоматика для систем отопления
AntonChip
Администратор
Сообщения: 265 Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:
#2
Сообщение
AntonChip » 11 янв 2015, 17:49
Использование прерываний по таймеру поможет
scorpionlion
Любитель
Сообщения: 17 Зарегистрирован: 07 янв 2015, 23:39
Откуда: Россия Евпатория
Контактная информация:
#3
Сообщение
scorpionlion » 11 янв 2015, 18:08
там я не могу разобраться, для одного канала слепил, мож и неправильно. не хватает мозгов пока еще.
Код: Выделить всё
/***Использование прерывания по таймеру***/
#include <avr/io.h>
#include <avr/interrupt.h>
//#include <util/delay.h>
/***Процедура обработки прерывания по Таймеру 1***/
ISR (TIMER1_COMPA_vect)
{
// Обработчик прерывания таймера 1 по совпадению A
//управление насосом
if(PINC&(1 << PC0)) // Проверяем наличие сигнала PC0
{
PORTD &= ~(1 << PD0); // нагрузка отключена
}
else
{
PORTD |= (1 << PD0); // нагрузка включена PD0
}
//управление вентилятором
if(PINC&(1 << PC1)) // Проверяем наличие сигнала PC1
{
PORTD &= ~(1 << PD1); // нагрузка отключена
}
else
{
PORTD |= (1 << PD1); // нагрузка включена PD1
}
//управление газовым клапаном
if(PINC&(1 << PC2)) // Проверяем наличие сигнала PC2
{
PORTD &= ~(1 << PD2); // нагрузка отключена
}
else
{
PORTD |= (1 << PD2); // нагрузка включена PD2
}
}
int main(void)
{
/***настраиваем порты ввода-вывода***/
DDRC = 0xF0; // Порт C вход
PORTC = 0xF; // подключаем внутренние подтяг. резисторы
DDRD = 0xF; // Порт D выход
PORTD = 0xF0; // Лог. 0 на выходе
/***Настраиваем таймер***/
TCCR1A = 0x00;
TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10)|(1 << WGM12); //предделитель clk/1024, режим таймера СТС
TCNT1 = 0x00;
// Верхняя граница счета. Диапазон от 0 до 65535.
OCR1A = 3906; // Частота прерываний A будет = Fclk/(N*(1+OCR1A))
TIMSK |= (1<<OCIE1A); // Разрешить прерывание по совпадению A
//TIMSK |= (1<<OCIE1B); // Разрешить прерывание по совпадению B
//TIMSK |= (1<<TOIE1); // Разрешить прерывание по переполнению
sei(); // Разрешение прерываний
while (1)
{}
}
автоматика для систем отопления
scorpionlion
Любитель
Сообщения: 17 Зарегистрирован: 07 янв 2015, 23:39
Откуда: Россия Евпатория
Контактная информация:
#4
Сообщение
scorpionlion » 17 янв 2015, 00:55
ну вот и следующий шаг сделал, все получилось, код подправил
автоматика для систем отопления
AntonChip
Администратор
Сообщения: 265 Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:
#5
Сообщение
AntonChip » 17 янв 2015, 16:26
scorpionlion писал(а): ну вот и следующий шаг сделал, все получилось, код подправил
Да, все правильно