Здравствуйте, многоуважаемые Коты.
Я новенький в этом деле, так что прошу сильно не кусаться
Занимался как-то программированием в
IDE Arduino и решил попробовать себя на МК, для начала поставил перед собой цель: переписать уже имеющийся код, для
Attiny2313, однако при компиляции проекта(Работаю в
Atmel Studio 6.2)
выдала ошибку ссылаясь на переменную в ф-ции delay. Немного погуглив в мою "
светлую" голову дошло, что в эту функцию можно записывать только
константы, что меня очень смутило потому, что в IDE Arduino я с легкость присваивал ей переменную.
Так вот собственно в чем вопрос, можно ли как-нибудь сделать аналогичны код на Attiny?
Мои попытки написать в студии:
#define F_CPU 1000000UL // Частота ядра = 1 МГц
#include <avr/io.h>
#include <util/delay.h>
// — Макрос для управления состоянием выхода —
#define LED_BLUE_ON PORTB |= (1 « PB0) // Лог 1
#define LED_BLUE_OFF PORTB &= ~(1 « PB0) // Лог 0
int MODE = 1; // Переменная, которая определяет задержку
int DELAY = 5000; //
// Основная программа
void main(void) {
DDRD |= (0 « PD2); // Пин 6 - на вход
PORTD |= (1 « PD2); // Включаем подтягивающий (Pull-UP) резистор для пина 6
DDRD |= (0 « PD3); // Пин 7 - на вход
PORTD |= (1 « PD3); // Включаем подтягивающий (Pull-UP) резистор для пина 7
DDRB |= (1 « PB0); // Пин 12 - на вывод
// — Бесконечный цикл —
while(1) {
if( !(PIND & (1 « PD2)) ) { // Проверяем нажата ли кнопка
_delay_ms(50); // Задержка 50 мс (дребезг контактов)
while(!(PIND & (1 « PD2))); // Ждем пока кнопка не будет отпущена
if( !(PIND & (1 « PD2)) ) {
if( MODE != 11){
MODE++; // изменяем мод, тем самым изменяем саму задержку так же для вычитания
}//конец операции сложения D2
}//конец цикла первой кнопки D2
}
if( !(PIND & (1 « PD3)) ) { // Проверяем нажата ли кнопка
_delay_ms(50); // Задержка 50 мс (дребезг контактов)
while(!(PIND & (1 « PD3))); // Ждем пока кнопка не будет отпущена
if( !(PIND & (1 « PD2)) ) {
if( MODE != 1){
MODE--;
}//конец операции вычитания D3
}//конец цикла кнопки D3
}
switch(MODE) // кейсы в которых хранится время задержки
{
case 1:
DELAY = 3000;
case 2:
DELAY = 5000;
case 3:
DELAY = 6000;
}//Конец ф-ции switch
LED_BLUE_ON; // лог 1
_delay_us(DELAY);
LED_BLUE_OFF;
_delay_us(DELAY); // лог 0
} // Конец блока цикла
}
// По своей сути это генератор прямоугольных импульсов определенного диапазона, есть подобный код только на прерывания, но решил
//взять за основу его т.к. он проще
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Код на Arduino
const int OUTPIN = 9; // макрос для выхода генератора
const int Button1 = 2; // макрос кнопки
boolean lastButton1 = LOW;
boolean currentButton1 = LOW;
const int Button2 = 3;// макрос кнопки 2
boolean lastButton2 = LOW;
boolean currentButton2 = LOW;
int n = 1; //мод задержки
int d = 4166;// начальная задержка
void setup() {
pinMode(2, INPUT); // кнопки на вход
pinMode(3, INPUT);
pinMode(OUTPIN, OUTPUT); // настраеваем выход генератора на выход))
}
boolean debouance1(boolean lastButton1) // устраняем дребезг кнопок программно для кнопки 1
{
boolean currentButton1 = digitalRead(Button1);
if(lastButton1 != currentButton1)
{
delay(100);
currentButton1 = digitalRead(Button1);
return currentButton1;
}
}
boolean debouance2(boolean lastButton2)// устраняем дребезг кнопок программно для кнопки 2
{
boolean currentButton2 = digitalRead(Button2);
if(lastButton2 != currentButton2)
{
delay(100);
currentButton2 = digitalRead(Button2);
return currentButton2;
}
}
void loop()
{
currentButton1 = debouance1(lastButton1);
if (lastButton1 == LOW && currentButton1 == HIGH)
{
if(n != 15)
{
n = n + 1;
}
}
currentButton2 = debouance2(lastButton2);
if (lastButton2 == LOW && currentButton2 == HIGH)
{
if(n != 1)
{
n = n - 1;
}
}
switch(n) // ф-ция определяющая задержку
{
case 1:
d = 4167;
break;
case 2:
d = 4347;
break;
case 3:
d = 4545;
break;
case 4:
d = 4761;
break;
case 5:
d = 5000;
break;
case 6:
d = 5263;
break;
case 7:
d = 5555;
break;
case 8:
d = 5882;
break;
case 9:
d = 6250;
break;
case 10:
d = 6666;
break;
case 11:
d = 7142;
break;
case 12:
d = 7692;
break;
case 13:
d = 8333;
break;
case 14:
d = 9090;
break;
case 15:
d = 10000;
break;
}
digitalWrite(OUTPIN, HIGH);
delayMicroseconds(d);
digitalWrite(OUTPIN, LOW);
delayMicroseconds(d);
}