Обсуждаем контроллеры компании Atmel.
Ответить

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

Чт ноя 14, 2019 13:36:23

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

Добавлено after 28 minutes 24 seconds:
Стал колом и дальше не двигаюсь.

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

Чт ноя 14, 2019 16:11:58

olegue, всё-таки внимательно посмотрите, включая схему подключения. Чем у меня отличается от того, что у вас. У меня-то работает.

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

Чт ноя 14, 2019 20:20:07

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, можете сбросить мне ваш проект?

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

Чт ноя 14, 2019 20:29:37

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

Добавлено after 8 minutes 35 seconds:
NStorm, можете сбросить мне ваш проект?

https://yadi.sk/d/Btk5KOhqQLcA3Q

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

Чт ноя 14, 2019 22:31:16

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

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

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

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

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

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

Добавлено after 1 minute 30 seconds:
Короче дело было не в бобине, .... сидел в кабине

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

Пт ноя 15, 2019 06:45:40

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

Vcc, питалово тобишь.

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

Пт ноя 15, 2019 13:55:21

ну думаю немножко продвинуть
Повесил на 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++;
   }
}

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

Пт ноя 15, 2019 14:21:26

на _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);
  }
}

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

Сб ноя 16, 2019 18:21:32

да квавр так может... но мне это ниразу не пригождалось...

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

Ср дек 11, 2019 15:47:21

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

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

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

Создать шим по кнопке мне по силам. А вот дальше уже сложнее.

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

Ср дек 11, 2019 19:57:54

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

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

А приёмник (МК) просто принимает сигнал, переводит в числа и сравнивает с ранее записанным в память числом.
Если число (код) совпадает, то приёмник выполняет соответствующую команду - включить/выключить.
Всё))
Для простых (и самодельных) радио модулей лучше использовать пакетную передачу и частотную манипуляцию.
image102.jpg
(33.13 KiB) Скачиваний: 255

Просто. Надёжно.

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

Ср дек 11, 2019 21:13:21

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

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

что бы отправить число на порт вероятно есть какая-то функция
Что касается протокола, то здесь я не понял. Протокол поддерживается на уровне микроконтроллера - это тоже какая-то программная функция?

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

Ср дек 11, 2019 21:51:20

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

что бы отправить число на порт вероятно есть какая-то функция

Нету. Самому надо писать. Для отправки элементарно.

Что касается протокола, то здесь я не понял. Протокол поддерживается на уровне микроконтроллера - это тоже какая-то программная функция?

Нету никаких функций. Это не ардуина ведь. Или пишем своё или берем чужое в сети. Модули тупые - что отправим в порт последовательно, то и смодулируют в радио, как я почитал про них (не работал с такими модулями).
А вот принять сложнее будет. Надо будет выделить сигнал из мусора.

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

Ср дек 11, 2019 22:09:48

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

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

Функцию можно использовать только одну - 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 KiB) Скачиваний: 258

01010... и т.д.))
Всё ))
Последний раз редактировалось roman.com Ср дек 11, 2019 22:29:29, всего редактировалось 1 раз.

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

Ср дек 11, 2019 22:28:38

roman.com, это не программа, а простыня извращений arduino-style.

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

Ср дек 11, 2019 22:30:27

:)))
Пишите свой вариант))

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

Ср дек 11, 2019 22:39:05

Банально функции написать для отправки бита и пакета, чтобы не писать простыни. А еще нужна какая-то последовательность, для отделения данных от мусора. Можно ИК-протокол какой-нибудь за основу взять.

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

Ср дек 11, 2019 22:58:56

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

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


В общих чертах, что такое протокол?

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

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


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

Разве что так?

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

Ср дек 11, 2019 23:14:34

В общих чертах, что такое протокол?

https://radiohlam.ru/nec/ - пример описания пожалуй самого распространенного протокола для ИК пультов.

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

А если не соответствует? А если сначала соответствовала, а следующий фронт - нет? А погрешности?

Оно-то так, но в идеальных условиях. В реальных нужно много чего учитывать.

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

Ср дек 11, 2019 23:56:29

NStorm писал(а):пример описания пожалуй самого распространенного протокола для ИК пультов.


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