Например TDA7294

Форум РадиоКот • Просмотр темы - Attiny2313 проблема с _delay_us()
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт мар 28, 2024 11:34:24

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Attiny2313 проблема с _delay_us()
СообщениеДобавлено: Пн июн 12, 2017 10:58:29 
Родился

Зарегистрирован: Пн июн 12, 2017 09:10:16
Сообщений: 3
Рейтинг сообщения: 0
Здравствуйте, многоуважаемые Коты.
Я новенький в этом деле, так что прошу сильно не кусаться :))
Занимался как-то программированием в 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);



}


Вложения:
Проекты.7z [12.39 KiB]
Скачиваний: 165
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Attiny2313 проблема с _delay_us()
СообщениеДобавлено: Пн июн 12, 2017 12:49:44 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
ну, если просит константу - убери переменную d и впиши блок с выводом и задержками прямо в свитч-кейс, тогда в задержку можно будет вписать константу

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Attiny2313 проблема с _delay_us()
СообщениеДобавлено: Пн июн 12, 2017 13:16:19 
Родился

Зарегистрирован: Пн июн 12, 2017 09:10:16
Сообщений: 3
Рейтинг сообщения: 0
ну, если просит константу - убери переменную d и впиши блок с выводом и задержками прямо в свитч-кейс, тогда в задержку можно будет вписать константу

Не много не понял, весь Switch запихать в _delay_us() или наоборот?


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Attiny2313 проблема с _delay_us()
СообщениеДобавлено: Пн июн 12, 2017 17:14:48 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
case 1:
digitalWrite(OUTPIN, HIGH);
delayMicroseconds(4167);
digitalWrite(OUTPIN, LOW);
delayMicroseconds(4167);
break;

правда сам я делаями практически не пользуюсь - использую прерывания по таймеру

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Attiny2313 проблема с _delay_us()
СообщениеДобавлено: Вт июн 13, 2017 11:26:42 
Открыл глаза
Аватар пользователя

Зарегистрирован: Вт дек 15, 2015 23:13:32
Сообщений: 55
Рейтинг сообщения: 0
Привязать переменную можно следующим образом.
Код:
for(int x = 0; x < N; x++)
     _delay_us(1);

где N - нужное кол-во микросекунд.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Attiny2313 проблема с _delay_us()
СообщениеДобавлено: Вт июн 13, 2017 19:09:16 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2057
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18024
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Gap писал(а):
Привязать переменную можно следующим образом.
Код:
for(int x = 0; x < N; x++)
     _delay_us(1);

где N - нужное кол-во микросекунд.
это будет плохо работать для микросекунд, потому что накладные расходы на организацию цикла дадут погрешность на уровне тех же микросекунд. подобный подход можно рекомендовать для миллисекундных задержек или хотя бы для задержек с кратностью 10 и более микросекунд.

Добавлено after 1 minute 3 seconds:
кстати, проще можно так:
Код:
for(;N;N--) _delay_us(1);

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

скушно, бабоньки!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Attiny2313 проблема с _delay_us()
СообщениеДобавлено: Вт июн 13, 2017 20:05:36 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
ARV писал(а):
это будет плохо работать для микросекунд
Особенно на частоте процессора в 1 МГц :) Одна такая интерация растянется тактов в 10, если не больше :roll:
Так что, самый нормальный вариант для ТС'а - в каждый case свой delay.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Attiny2313 проблема с _delay_us()
СообщениеДобавлено: Ср июн 14, 2017 10:29:05 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Можно Ченовской простенькой ассемблерной функцией воспользоваться - там переменную можно
Изображение
файлик asmfunc.S:

пример main.c:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Attiny2313 проблема с _delay_us()
СообщениеДобавлено: Чт июн 15, 2017 18:45:41 
Родился

Зарегистрирован: Пн июн 12, 2017 09:10:16
Сообщений: 3
Рейтинг сообщения: 0
Можно Ченовской простенькой ассемблерной функцией воспользоваться - там переменную можно
Изображение
файлик asmfunc.S:

пример main.c:


Ребят, больше спасибо, завтра все варианты попробую. Дружище, а не затруднит ли тебя описать каждую строчку, не пойму что делаешь...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Attiny2313 проблема с _delay_us()
СообщениеДобавлено: Пт июн 16, 2017 07:15:12 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Цитата:
что делаешь...

делаю так - создаю файл в папке проекта с именем asmfunc.S (это ассемблерный файл), копирую в файл содержимое (выше), подключаю этот файл к проекту.
В файле проекта, например main.c пишем объявление функций из файла asmfunc.S:
void delay_us (uint16_t); /* Defined in asmfunc.S */
void delay_ms (uint16_t); /* Defined in asmfunc.S */
пользуемся этими функциями:
delay_ms(k);
почитать:
https://embedderslife.wordpress.com/201 ... asm-and-c/
автор YS, вроде участник форума


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: OKF и гости: 32


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y