задержка включения и выключения на 8-й меге

Модератор: boogyman

задержка включения и выключения на 8-й меге

Сообщение:#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 раз.
автоматика для систем отопления
Аватара пользователя
scorpionlion
Любитель
 
Сообщения: 17
Зарегистрирован: 07 янв 2015, 23:39
Откуда: Россия Евпатория

Re: задержка включения и выключения на 8-й меге

Сообщение:#2  Сообщение AntonChip » 11 янв 2015, 17:49

Использование прерываний по таймеру поможет
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 202
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

Re: задержка включения и выключения на 8-й меге

Сообщение:#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
Откуда: Россия Евпатория

Re: задержка включения и выключения на 8-й меге

Сообщение:#4  Сообщение scorpionlion » 17 янв 2015, 00:55

ну вот и следующий шаг сделал, все получилось, код подправил
автоматика для систем отопления
Аватара пользователя
scorpionlion
Любитель
 
Сообщения: 17
Зарегистрирован: 07 янв 2015, 23:39
Откуда: Россия Евпатория

Re: задержка включения и выключения на 8-й меге

Сообщение:#5  Сообщение AntonChip » 17 янв 2015, 16:26

scorpionlion писал(а):ну вот и следующий шаг сделал, все получилось, код подправил

Да, все правильно
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 202
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров


Вернуться в Микроконтроллеры AVR

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

cron
Rambler's Top100