Например TDA7294

Форум РадиоКот • Просмотр темы - Программирование ATtiny13
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт апр 26, 2024 23:58:17

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


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



Начать новую тему Ответить на тему  [ Сообщений: 206 ]    , 2, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Вт ноя 12, 2019 09:55:49 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
Ежли охота Си освоить - то тинька 13я не самое лучшее из имеющегося.

Как разница на таких простых примерах?

Другое дело - на чистом ассемблере в АВР студии 4.19 - там и симулятор работает
и места будет в достатке, и понятнее на уровне "железа".

Да ну. Не нулевые года на дворе в конце-концов. Симулятор работает и в протеусе прекрасно на C.

Добавлено after 6 minutes 42 seconds:
между циклами ожидающими отпускания кнопки вставь циклы, ожидающие нажатия...

Всё верно, только чуть поправлю - ожидающие отпускания )

olegue, соб-но вам Ivanoff-iv правильно подсказал - между while ((PINB & (1 << PB1))){}; и while ((PINB & (1 << PB1))){ PORTB^=(1<<PB0); ... у вас нет ничего. Вы нажимаете кнопку раз, переходите ко 2му while, который сразу же не срабатывает, потому что кнопка еще нажата. Ведь кнопка - не сферическая в вакууме, она не моментально отжимается, а нажата сколько-то там времени, которое много больше, чем 3-4 инструкции МК выполнить.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Вт ноя 12, 2019 10:53:04 
Собутыльник Кота
Аватар пользователя

Карма: 14
Рейтинг сообщений: 115
Зарегистрирован: Сб май 21, 2016 11:04:52
Сообщений: 2957
Откуда: Беларусь
Рейтинг сообщения: 0
NStorm писал(а):
Ведь кнопка - не сферическая в вакууме, она не моментально отжимается, а нажата сколько-то там времени, которое много больше, чем 3-4 инструкции МК выполнить.


вот потихоньку уже начинаю это понимать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Вт ноя 12, 2019 14:08:05 
Друг Кота
Аватар пользователя

Карма: 23
Рейтинг сообщений: 283
Зарегистрирован: Пт мар 09, 2007 15:01:52
Сообщений: 3040
Откуда: Биробиджан
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Правильней проверять кнопку не постоянно, зависая на ней в бесконечном цикле, а в ходе выполнения основной программы. Для простого мигания это не критично, но лучше как можно реже использовать _ms_delay(), это тормозит основную программу.

olegue, проверяй нажатия не в цикле while, а в проверке if. Я вижу примерно следующий алгоритм:
Код:
переменная A = 0
бесконечный цикл {

  если нажата кнопка{
    подождать
    если кнопка всё ещё нажата {присвоить переменной A значение противоположное тому что в ней было}
  }

  если переменная A разрешает мигание {
    включить порт
    подождать
    выключить порт
  }
  иначе {
    выключить порт
  }
}


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


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

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

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Вт ноя 12, 2019 14:52:35 
Собутыльник Кота
Аватар пользователя

Карма: 14
Рейтинг сообщений: 115
Зарегистрирован: Сб май 21, 2016 11:04:52
Сообщений: 2957
Откуда: Беларусь
Рейтинг сообщения: 0
да, кстати, я тоже нахожу довольно трудным управление сразу несколькими вложенными циклами.
Хотя, возможно, это более правильный способ. Но удержать его в голове просто немыслимо пока.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Вт ноя 12, 2019 15:44:59 
Друг Кота
Аватар пользователя

Карма: 23
Рейтинг сообщений: 283
Зарегистрирован: Пт мар 09, 2007 15:01:52
Сообщений: 3040
Откуда: Биробиджан
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
А зачем удерживать в голове если можно нарисовать алгоритм на бумаге?


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

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Вт ноя 12, 2019 16:00:31 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
olegue, функции и макросы могут помочь визуально сделать код более легко читаемым.
Еще советую - почитайте про конечные автоматы. Очень часто на них реализуются в МК задачи.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Вт ноя 12, 2019 22:36:24 
Собутыльник Кота
Аватар пользователя

Карма: 14
Рейтинг сообщений: 115
Зарегистрирован: Сб май 21, 2016 11:04:52
Сообщений: 2957
Откуда: Беларусь
Рейтинг сообщения: 0
Вот что у меня получилось с миганеим светодиода
Одно нажатие - включить мигание
Второе нажатие - выключить мигание
Привожу с коментами. Посмотртие. Учел нажатие и отпускание, как и советовали

Код:
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{

DDRB =(1<<PB0);  // это будет выход, т.е на PB0 будет светодиод)
PORTB=(1<<PB1); //(по аналогии с атмегой PB1=1 (подключен подтягивающий резистор),

while(1)
{
   
      while ((PINB&(1 << PB1))){} //  (Жднем нажатия)
   _delay_ms(20); // Нажали Задержка 20мс. Дребезг
     
       while (!(PINB&(1 << PB1))){ } //  (Жднем отпускания)
   _delay_ms(20); // Отпустили Задержка 20мс Дребезг
     
       while ((PINB&(1 << PB1))){ //  (Жднем нажатия) И входим в цикл Моргания (Моргаем)
           PORTB ^= (1 << PB0);_delay_ms(200);PORTB ^= (1 << PB0);
       }
       _delay_ms(20); // Нажали Задержка 20мс, Дребезг Выходим из цикла моргания.
       
        while (!(PINB&(1 << PB1))){ } //  (Жднем отпускания)
   _delay_ms(20); // Отпустили и вернулись в начало Задержка 20мс Дребезг
}
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 04:11:59 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6626
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
1) моргать не будет... точнее будет, но это глазу не будет видно...
нужно внутри цикла только одно переключение порта оставить.
2) при выходе из моргания светодиод стоит тушить принудительно т.к. если выйти при включенном светодиоде, то он так и останется гореть...
3) в целом для изучения неплохо, но для работы этот код подойдет только если мк кроме мигания ничего не делает - АЛУ всё время занят и ему некогда обрабатывать другие инструкции... если их ему подсовывать через прерывания, то будет немного сбиваться частота мигания светодиодом... (проблема тут в программных задержках делай_мс)

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 09:05:41 
Собутыльник Кота
Аватар пользователя

Карма: 14
Рейтинг сообщений: 115
Зарегистрирован: Сб май 21, 2016 11:04:52
Сообщений: 2957
Откуда: Беларусь
Рейтинг сообщения: 0
Ivanoff-iv писал(а):
1) моргать не будет... точнее будет, но это глазу не будет видно...


Как не видно будет . Там задержка 200 мс...??
PORTB ^= (1 << PB0);_delay_ms(200);PORTB ^= (1 << PB0);


Ivanoff-iv писал(а):
при выходе из моргания светодиод стоит тушить принудительно т.к. если выйти при включенном светодиоде, то он так и останется гореть...


да, я его гасил, а потом убрал этот код, тут согласен.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 11:01:39 
Друг Кота
Аватар пользователя

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 11:08:09 
Собутыльник Кота
Аватар пользователя

Карма: 14
Рейтинг сообщений: 115
Зарегистрирован: Сб май 21, 2016 11:04:52
Сообщений: 2957
Откуда: Беларусь
Рейтинг сообщения: 0
вот смотри: первая инструкция его (допустим) зажгет, потом ждем, потом гасим, тутже начинается новый виток цикла и светодиод зажигается снова... светодиод будет выключен около десяти тактов или (при тактовой 8 МГц) 1,25 мкс...
(а включен 200мс - т.е. в 160000 раз дольше чем выключен...)


я пытаюсь понять, что Вы пояснили, но то что я вижу в Протеусе получается неправильно?
В протеусе диод моргает, в железе не проверял, но теперь хочуется уже вшить этот код в тинку и посмотреть.

Кстати, смотрел Таймеры. Ну там конечно, на первых порах можно мозг сломать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 13:46:19 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14078
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Мигание заметно только до 15Гц.
0,06 секунды на период и больше.
И то... не всяким глазом... А ШПРОТ это все равно покажет.
Лучше раз в пол секунды состояние менять для наглядности.
500 и более миллисекунд.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 14:39:39 
Собутыльник Кота
Аватар пользователя

Карма: 14
Рейтинг сообщений: 115
Зарегистрирован: Сб май 21, 2016 11:04:52
Сообщений: 2957
Откуда: Беларусь
Рейтинг сообщения: 0
Помогайте опять, хотел было тут уже в прерывания влезьть да не тут то было: асадзи назад.

Цитата:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


int main(void)
{

DDRB =(1<<PB0);
PORTB=(1<<PB0);

DDRB =(1<<PB1);
PORTB=(1<<PB1);


while (1)
{
PORTB^=(1<<PB0); _delay_ms(500);
PORTB^=(1<<PB1); _delay_ms(500);
// PORTB^=(1<<LED2); _delay_ms(500);


}
}


должно моргать 2 ламоптчик попеременно, но моргает только последняя обьявленная-инициализированная строками DDRB и PORTB
Что опять не так? Если PB1 убираю то тогда мограет pb0, если еще доБавляю pb2, то она моргает - первые 2 нет!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 14:56:52 
Друг Кота
Аватар пользователя

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

Добавлено after 2 minutes 32 seconds:
П.С.: ддр здесь взят для примера...

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 16:05:16 
Собутыльник Кота
Аватар пользователя

Карма: 14
Рейтинг сообщений: 115
Зарегистрирован: Сб май 21, 2016 11:04:52
Сообщений: 2957
Откуда: Беларусь
Рейтинг сообщения: 0
Спасибо. Теперь работает
Цитата:
int main(void)
{

DDRB =((1<<PB0)| (1<<PB1) | (1<<PB2));
PORTB=((1<<PB0) | (1<<PB1) | (1<<PB2));



while (1)
{
PORTB^=(1<<PB0); _delay_ms(500);
PORTB^=(1<<PB1); _delay_ms(500);
PORTB^=(1<<PB2); _delay_ms(500);
// PORTB^=(1<<LED2); _delay_ms(500);


}
}


Добавлено after 50 seconds:
можно дальше идти

Добавлено after 52 minutes 49 seconds:
я разобрал вот этот код. Здесь работа с кнопками через програмные прерывания
У меня он почему то не работает. Вероятно где -то ошибка ,но найти ее я немогу
С моей точки здения вроде все правильно написано.

Код:
*/

//#define F_CPU 1200000UL
#define LED PB2
#define BUTTON1 PB3 // PCINT3
#define BUTTON2 PB4 // PCINT4

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// Обработчик прерывания PCINT0
ISR(PCINT0_vect)
{
   _delay_ms (50); // антидребезг (использовать задержки в прерываниях некошерно, но пока и так сойдёт)
  if ( (PINB & (1<<BUTTON1)) == 0 || (PINB & (1<<BUTTON2)) == 0 ) // если нажата одна из кнопок
  {
    PORTB ^= (1<<LED); //переключаем состояние светодиода (вкл./выкл.)
    while ( (PINB & (1<<BUTTON1)) == 0 || (PINB & (1<<BUTTON2)) == 0 ) {} // ждём отпускания кнопки
  }
}

int main(void)
{

  // Пины кнопок
  DDRB &= ~((1<<BUTTON1)|(1<<BUTTON2)); // входы
  PORTB |= (1<<BUTTON1)|(1<<BUTTON2); // подтянуты
  // Пин светодиода
  DDRB |= (1<<LED); // выход
  PORTB &= ~(1<<LED); // выключен
  // Настройка прерываний
  GIMSK |= (1<<PCIE); // Разрешаем внешние прерывания PCINT0.
  PCMSK |= (1<<BUTTON1)|(1<<BUTTON2); // Разрешаем по маске прерывания на ногак кнопок (PCINT3, PCINT4)
  sei(); // Разрешаем прерывания глобально: SREG |= (1<<SREG_I)
    while (1)
    {
    }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 18:59:48 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
PORTB^=(1<<PB0); _delay_ms(500); - никогда так не пишите. В одну строчку. Сами потом запутаетесь. Поставили ; - перешли на новую строку. И отступы и форматирование научитесь делать правильно. Это только кажется, что мелочи, но с ними код намного читаемей. https://codebeautify.org/c-formatter-beautifier в помощь

Вот это - "while ( (PINB & (1<<BUTTON1)) == 0 || (PINB & (1<<BUTTON2)) == 0 ) {} // ждём отпускания кнопки" в прерывании не нужно уже. У вас входит в обработчик прерывания при смене состояния порта только. Поэтому ждать отпускания кнопки уже не нужно. И даже очень плохо, в прерывании так нельзя делать. Это хуже чем _delay_ms даже там.

А код так-то рабочий. Что-то не то делаете.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 19:58:07 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
NStorm писал(а):
А код так-то рабочий. Что-то не то делаете.
Полагаю отсутствует
Код:
GIFR |= (1<<PCIF);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Ср ноя 13, 2019 21:52:45 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
Dimon456, зачем и где? Исходя из описание ручками его мало когда надо выставлять:
When a logic change on any PCINT5:0 pin triggers an interrupt request, PCIF becomes set (one). If the I-bit in SREG and the PCIE bit in GIMSK are set (one), the MCU will jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared by writing a logical one to it.

В протеусе код, указанный выше, на тини13 работает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Чт ноя 14, 2019 09:18:59 
Собутыльник Кота
Аватар пользователя

Карма: 14
Рейтинг сообщений: 115
Зарегистрирован: Сб май 21, 2016 11:04:52
Сообщений: 2957
Откуда: Беларусь
Рейтинг сообщения: 0
NStorm писал(а):
В протеусе код, указанный выше, на тини13 работает.


т.е Вы у себя попробовали этот код? И все в порядке. Работает?

я тоже даже на 2-ом компьютере уже попробовал и нифига. Что за чертовщина
Я даже попробовал упрощать его до минимума. Все равно ничего. Не могу добиться хоть какой-то работы на прерываниях
Пробовал даже и на INTO настраивать - не получается запустить.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование ATtiny13
СообщениеДобавлено: Чт ноя 14, 2019 09:49:42 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
Да, работает: https://yadi.sk/i/grOfcR6a8E6u5g / https://youtu.be/RkHESK57hRg
Смотрите видео, в чем у вас отличие ищите.


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

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


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

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


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

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


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