Программирование ATtiny13

Обсуждаем контроллеры компании Atmel.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

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

Добавлено after 28 minutes 24 seconds:
Стал колом и дальше не двигаюсь.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

olegue, всё-таки внимательно посмотрите, включая схему подключения. Чем у меня отличается от того, что у вас. У меня-то работает.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

NStorm писал(а):olegue, всё-таки внимательно посмотрите, включая схему подключения. Чем у меня отличается от того, что у вас. У меня-то работает.
NStorm,Охотно верю, к Вам у меня кроме благодарности за содействие в изучении, нету никаких претензий. Сам понимаю ,что анекдот. Я уже поставил даже другую версию Протеуса 8.7 и в ней тоже лампочками не моргается. Надо сделать перерывчик и успокоится. А заодно прошить реальную тиньку.

Добавлено after 1 hour 12 minutes 25 seconds:
NStorm, Может будет это иметь отношение, а как у Вас получается так что диод моргает. У меня диод не моргает, а моргает обычно синий квадрат возле диода (синий/красный)?

Добавлено after 1 minute 40 seconds:
я уже до отладчика добрался. Расставил точки оставнова, трассирую строки. Но в функцию ISR(PCINTO_vect) никак не заходит. Ни при запуске , ни при нажатии кнопок.

Добавлено after 1 hour 2 minutes 34 seconds:
NStorm, можете сбросить мне ваш проект?
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

В стандартной библиотеке компонентов в протеусе есть модели LED-RED, LED-GREEN и LED-BLUE - они анимированные, если их ставить, будут так подсвечиваться.
Отладка AVR в протеусе может работать криво кстати.
Какая версия тулчейна у вас (компилятора), какой и откуда ставили? В настройках тиньки в протеусе (свойства объекта) меняли что-то?

Добавлено after 8 minutes 35 seconds:
[uquote="olegue",url="/forum/viewtopic.php?p=3736746#p3736746"]NStorm, можете сбросить мне ваш проект?[/uquote]
https://yadi.sk/d/Btk5KOhqQLcA3Q
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

заработало!
КАк дело было. Скачал Ваш проект. Он оказался версией выше, скачал портабельную 8.7, запустил. Ваш проект сразу заработал

Тогдая я в этой 8.7 запустил свой проект, но скопировал код из вашего. Ничего не заработало. Не в коде дело.
Подумал что дело в схеме. Создал новый проект в 8.7 и попробовал нарисовать схему. Но протеус вылетает каждые 2 минуты

Пошел опять в 8.5, создал новый проект, создал новую схему, а заодно удалил WinAVR-20100110 и установил его заново.

И сразу все заработало. Спасибо. Можно двигаться дальше.

Добавлено after 3 minutes 7 seconds:
Изображение

что это за стрелка такая?

Добавлено after 1 minute 30 seconds:
Короче дело было не в бобине, .... сидел в кабине
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

что это за стрелка такая?
Vcc, питалово тобишь.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

ну думаю немножко продвинуть
Повесил на INT0 увеличеине переменной s на 100, чтбы потом в цикле регулировать частоту моргания.
Ну все по классике. И вот что она мне выдала

Изображение


Код: Выделить всё

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

#define BUTTON0 PB0 // КНОПКА НА INT0

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned int s=500;
// Обработчик прерывания PCINT0
ISR(PCINT0_vect)
 
{
   
   _delay_ms (50) ; // антидребезг (использовать задержки в прерываниях некошерно, но пока и так сойдёт)
  if  (PINB & (1<<BUTTON0))
   {s=s+100;}
}

int main(void)
{

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

все отлично работает. Переменная (видно в отладчике) увеличивает свое значение

Добавлено after 3 minutes 10 seconds:
на _delay_ms(s) выдает ошибки. Чем ему не нравиться?

Добавлено after 1 hour 12 minutes 35 seconds:
обошел.

Код: Выделить всё

while(1)
for (i=1;i<s;i++)
{
PORTB^=(1>>LED);
_delay_ms(100);
}
не сам, конечно, придумал.
но в Атмеге видел как подставляют s в delay_ms.

Теперь в програмных прерываниях

Код: Выделить всё

if (PINB & (1<<BUTTON1))  // при нажатии -уменьшаяем частоту мигания
 {s++;}

if (PINB&(1<<BUTTON2)) // увеличиваем частоту мигания
{if (s>0)
   { 
      s++;
   }
}
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

на _delay_ms(s) выдает ошибки. Чем ему не нравиться?
Нельзя этой функции передавать переменные. Новый компилятор вообще ругнется и не соберет так:

Код: Выделить всё

util/delay.h:187:2: error: __builtin_avr_delay_cycles expects a compile time integer constant
А старый видимо дублирует кучу функций, вот так много места и выходит. Там вообще используются вычисления с плавающей запятой, поэтому в новых версиях только во время компиляции статический расчет включен. Делайте как-то так:

Код: Выделить всё

void my_delay_ms(unsigned int n) {
 while(n--) {
  _delay_ms(1);
 }
}
...
my_delay_ms(s);
Добавлено after 1 minute 10 seconds:
PS: И прекращайте писать разные вызовы в коде в одну строчку, я уже об этом писал, это вредно.

Добавлено after 50 seconds:
но в Атмеге видел как подставляют s в delay_ms.
Это наверное в CVAVR, там функция другая.

Добавлено after 19 minutes 25 seconds:
Спойлер

Код: Выделить всё

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

#define BUTTON0 PB0 // КНОПКА НА INT0

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

unsigned int s = 500;
// Обработчик прерывания PCINT0
ISR(PCINT0_vect) {
  _delay_ms(50); // антидребезг (использовать задержки в прерываниях некошерно, но пока и так сойдёт)
  if (PINB & (1 << BUTTON0)) {
    s = s + 100;
  }
}

void my_delay_ms(unsigned int n) {
  while (n--) {
    _delay_ms(1);
  }
}

int main(void) {

  // Пины кнопок
  DDRB &= ~((1 << BUTTON1) | (1 << BUTTON2) | (1 << BUTTON0)); // входы
  PORTB |= (1 << BUTTON1) | (1 << BUTTON2) | (1 << BUTTON0); // подтянуты
  // Пин светодиода
  DDRB |= (1 << LED); // выход
  PORTB &= ~(1 << LED); // выключен
  // Настройка прерываний

  GIMSK |= (1 << INT0);
  // GIMSK |= (1<<PCIE); // Разрешаем внешние прерывания PCINT0.
  PCMSK |= (1 << BUTTON1) | (1 << BUTTON2) | (1 << BUTTON0); // Разрешаем по маске прерывания на ногак кнопок (PCINT3, PCINT4)
  sei(); // Разрешаем прерывания глобально: SREG |= (1<<SREG_I)
  while (1) {
    PORTB ^= (1 << LED);
    my_delay_ms(s);
  }
}
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

да квавр так может... но мне это ниразу не пригождалось...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

Придумал себе задачку. Управление с помощью радиомодулей одной кнопкой с помощью Аттини13
Радимодули (fs1000 и xy-mk-5v) О них известно, что сигнал они не инвертируют.

Хочу спросить как схематично это делается. Естественно хочу попробовать сначала сам порешать.

Нужно послать сигналы , как я понял , нужен ШИМ
А потом нужно принять этот ШИм и сравнить с предопределенным.

Создать шим по кнопке мне по силам. А вот дальше уже сложнее.
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Не совсем понял вопроса...
Вот тут например мы делали радиоуправление на любых модулях - https://radiokot.ru/forum/viewtopic.php?f=28&t=148087
Сначала определитесь с протоколом. А дальше всё стандартно))

Чтобы просто включить/выключить кнопку достаточно просто передать секретный код.
Код это просто любое произвольное число...
В двоичном виде типа так:
011010111010101010001111010101010 - включить кнопку.
101010000101111001010000111101010 - выключить кнопку.
Чем больше число, тем выше надёжность всех системы))

А приёмник (МК) просто принимает сигнал, переводит в числа и сравнивает с ранее записанным в память числом.
Если число (код) совпадает, то приёмник выполняет соответствующую команду - включить/выключить.
Всё))
Для простых (и самодельных) радио модулей лучше использовать пакетную передачу и частотную манипуляцию.
image102.jpg
(33.13 КБ) 271 скачивание
Просто. Надёжно.
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

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

или моргнуть светодиодом, или выключить его.

что бы отправить число на порт вероятно есть какая-то функция
Что касается протокола, то здесь я не понял. Протокол поддерживается на уровне микроконтроллера - это тоже какая-то программная функция?
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

olegue, ну вот, например: https://cxem.net/mc/mc315.php
Только мне кажется вы слишком высоко берете. Для начала с основами бы дальше разбираться. Таймеры освойте, ШИМ на них аппаратный и т.д. Вы попробуйте на _аппаратном_ ШИМ плавно зажигать и гасить светодиод для начала хотя бы )

[uquote="olegue",url="/forum/viewtopic.php?p=3753886#p3753886"]что бы отправить число на порт вероятно есть какая-то функция[/uquote]
Нету. Самому надо писать. Для отправки элементарно.

[uquote="olegue",url="/forum/viewtopic.php?p=3753886#p3753886"]Что касается протокола, то здесь я не понял. Протокол поддерживается на уровне микроконтроллера - это тоже какая-то программная функция?[/uquote]
Нету никаких функций. Это не ардуина ведь. Или пишем своё или берем чужое в сети. Модули тупые - что отправим в порт последовательно, то и смодулируют в радио, как я почитал про них (не работал с такими модулями).
А вот принять сложнее будет. Надо будет выделить сигнал из мусора.
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

для одной кнопки не нужны никакие функции... протоколы... и т.д.
достаточно просто передать один код на включение и этот же код передать на выключение. Всего нужен один секретный код. ))

число не нужно отправлять на порт. Мы просто включаем/выключаем порт через разные промежутки времени.

Функцию можно использовать только одну - delay. Этого достаточно для передачи любого кода))

Программа для тиньки ))
-------------------------------------
#include <tiny13.h>
#include <delay.h>
void main(void)
{

// настроили порт:
DDRB.1=1;
PORTB.1=0;

// начало программы:
PORTB.1=1; // включили
delay_ms(1); // подождали...
PORTB.1=0; // выключили
delay_ms(1); // подождали...
PORTB.1=1; // включили
delay_ms(2); // подождали...
PORTB.1=0; // выключили
delay_ms(2); // подождали...
PORTB.1=1; // включили
delay_ms(1); // подождали...
PORTB.1=0; // выключили
delay_ms(1); // подождали...
PORTB.1=1; // включили
delay_ms(2); // подождали...
PORTB.1=0; // выключили
delay_ms(2); // подождали...
PORTB.1=1; // включили
delay_ms(1); // подождали...
PORTB.1=0; // выключили
delay_ms(1); // подождали...
PORTB.1=1; // включили
delay_ms(2); // подождали...
PORTB.1=0; // выключили
delay_ms(2); // подождали...
PORTB.1=1; // включили
delay_ms(1); // подождали...
PORTB.1=0; // выключили
delay_ms(1); // подождали...
PORTB.1=1; // включили
delay_ms(2); // подождали...
PORTB.1=0; // выключили
delay_ms(2); // подождали...
PORTB.1=1; // включили
delay_ms(1); // подождали...
PORTB.1=0; // выключили
delay_ms(1); // подождали...
PORTB.1=1; // включили
delay_ms(2); // подождали...
PORTB.1=0; // выключили
delay_ms(2); // подождали...
PORTB.1=1; // включили
delay_ms(1); // подождали...
PORTB.1=0; // выключили
delay_ms(1); // подождали...
PORTB.1=1; // включили
delay_ms(2); // подождали...
PORTB.1=0; // выключили
delay_ms(2); // подождали...
PORTB.1=1; // включили
delay_ms(1); // подождали...
PORTB.1=0; // выключили
delay_ms(1); // подождали...
PORTB.1=1; // включили
delay_ms(2); // подождали...
PORTB.1=0; // выключили
delay_ms(2); // подождали...
PORTB.1=1; // включили
delay_ms(1); // подождали...
PORTB.1=0; // выключили
delay_ms(1); // подождали...
PORTB.1=1; // включили
delay_ms(2); // подождали...
PORTB.1=0; // выключили
delay_ms(2); // подождали...

// ... и т.д. на сколько хватит памяти тиньки ))

// конец программы.

}
-----------------------------------------------------

Работает просто.
Подаём питание на тинку через кнопку. На выходе тиньки видим вот такой код:
код.jpg
(183.8 КБ) 277 скачиваний
01010... и т.д.))
Всё ))
Последний раз редактировалось roman.com Ср дек 11, 2019 22:29:29, всего редактировалось 1 раз.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

roman.com, это не программа, а простыня извращений arduino-style.
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

:)))
Пишите свой вариант))
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Банально функции написать для отправки бита и пакета, чтобы не писать простыни. А еще нужна какая-то последовательность, для отделения данных от мусора. Можно ИК-протокол какой-нибудь за основу взять.
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

roman.com, не могу дать профессиональную оценку как NStorm, но то, что это мой уровень - это 100% попадание. Что-то наподобие я и предполагал. Теперь вот думаю как будет выглядеть код на стороне приемника.

>NStorm,
Можно ИК-протокол какой-нибудь за основу взять.
В общих чертах, что такое протокол?

Добавлено after 15 minutes 15 seconds:
на приемнике,

получаю сигнал, измеряю длительность,
если длительность соответствует, запоминаю в переменную
получаю слещущий измеряю длительность....


а потом сравниваю с тем, кодом который должен быть.

Разве что так?
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

[uquote="olegue",url="/forum/viewtopic.php?p=3753938#p3753938"]В общих чертах, что такое протокол?[/uquote]
https://radiohlam.ru/nec/ - пример описания пожалуй самого распространенного протокола для ИК пультов.

[uquote="olegue",url="/forum/viewtopic.php?p=3753938#p3753938"]получаю сигнал, измеряю длительность,
если длительность соответствует, запоминаю в переменную
получаю слещущий измеряю длительность....[/uquote]
А если не соответствует? А если сначала соответствовала, а следующий фронт - нет? А погрешности?

Оно-то так, но в идеальных условиях. В реальных нужно много чего учитывать.
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

NStorm писал(а):пример описания пожалуй самого распространенного протокола для ИК пультов.
понятно, это описание и стандартизация пауз и длительностей импульсов. По крайней мере мне так показалось.
Если следовать какому либо протоколу, что можно где-то задейсвовать стандартное оборудование под свои нужды
Ответить

Вернуться в «AVR»