07-11-2014, 07:22 AM
(Сообщение последний раз редактировалось: 07-11-2014, 07:39 AM БендеровецЪ.)
Самый просто способ "поморгать" пинами выглядит как-то так:
#define REL PA0
#define LED0 PA5
#define LED1 PA4
#define DDRA_RESET_VALUE ( (1 << REL) + (1 << LED0) + (1 << LED1) )
#include <avr/io.h>
unsigned int counter = 0;
int main(void)
{
DDRA = DDRA_RESET_VALUE;
PORTA |= (1 << REL) + (1 << LED0);
while(1)
{
counter++;
if (!counter)
{
PINA |= (1 << REL) + (1 << LED0);
}
}
}
Что было сделано
Была создана беззнаковая переменная типа интеджер, 16 бит, максимально значение которой равно 65535
Програма "крутится" в главном цикле, и каждый оборот добавляет к переменной единицу.
Запись counter++; эквивалентна counter = counter + 1;
потом в if происходит проврека условия когда counter == 0
! является логическим отрицанием, которое вернет единицу только в одном случае когда counter равен нулю. Можно было записать иначе
if (counter == 0)
{
}
Главное помнить что сравнение это ==, а = это присвоение значения. В данном случае надо использовать ==
Далее, когда мы попадаем внутрь if мы устанавливаем две еденицы в регистре PINA
Если обратится в DS то там написано что такая операция изменяет значение соотв пина на противоположное, что и дает нам мигание. Впринципе это можно было сделать и несколькими другими способами, но так получается достатоно компактно и без лишних операций.
По поводу частоты мигания. В таком случае она задается коственно, ее можно узнать поделив тактовую частоту МК на количество инструкций в цикле, домножив на количество тактов на операцию. Правда не все операции могут занимать одинаковое количество команд, так что может прийдется считать индивидуально.
Ну а вобще надо делать это с помощью таймера, завтра попробую набросать.
#define REL PA0
#define LED0 PA5
#define LED1 PA4
#define DDRA_RESET_VALUE ( (1 << REL) + (1 << LED0) + (1 << LED1) )
#include <avr/io.h>
unsigned int counter = 0;
int main(void)
{
DDRA = DDRA_RESET_VALUE;
PORTA |= (1 << REL) + (1 << LED0);
while(1)
{
counter++;
if (!counter)
{
PINA |= (1 << REL) + (1 << LED0);
}
}
}
Что было сделано
Была создана беззнаковая переменная типа интеджер, 16 бит, максимально значение которой равно 65535
Програма "крутится" в главном цикле, и каждый оборот добавляет к переменной единицу.
Запись counter++; эквивалентна counter = counter + 1;
потом в if происходит проврека условия когда counter == 0
! является логическим отрицанием, которое вернет единицу только в одном случае когда counter равен нулю. Можно было записать иначе
if (counter == 0)
{
}
Главное помнить что сравнение это ==, а = это присвоение значения. В данном случае надо использовать ==
Далее, когда мы попадаем внутрь if мы устанавливаем две еденицы в регистре PINA
Если обратится в DS то там написано что такая операция изменяет значение соотв пина на противоположное, что и дает нам мигание. Впринципе это можно было сделать и несколькими другими способами, но так получается достатоно компактно и без лишних операций.
По поводу частоты мигания. В таком случае она задается коственно, ее можно узнать поделив тактовую частоту МК на количество инструкций в цикле, домножив на количество тактов на операцию. Правда не все операции могут занимать одинаковое количество команд, так что может прийдется считать индивидуально.
Ну а вобще надо делать это с помощью таймера, завтра попробую набросать.
"Найкраще сало то ковбаса." (с)