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

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

Чт дек 12, 2019 00:29:32

для тини13, у меня две кнопки пин3 и пин4 и один выход порт 0. Нужно при нажатом пин3 горит светодиод на порту0 а при отпускании гаснет, следующий алгоритм при нажатом пине3 нажимаем пин4 и светодиод на порту 0 через 20сек должен погаснуть

Вот прошивка по твоему алгоритму... МК тактируется на заводских установках (фьюзы прошивать не нужно).
ATiny13.hex


Добавлено after 15 minutes 27 seconds:
У меня такая проблема. Я хочу на тиньке 13 (сабж) сделать небольшую программулю, наподобии той что хотел ТС, но даже проще.

Т.е нажимаю на кнопку, загорается диод, нажимаю еще раз - диод гаснет. Все.

Для тини13, кнопка на РВ3, светик на РВ0… с фьзами как и в предыдущем варианте – не прошивать.
ATiny13_V2.hex

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

Чт дек 12, 2019 01:23:18

olegue писал(а):В общих чертах, что такое протокол?

В общих чертах... слишком большое понятие... )) Протокол - это некое соглашение.
Конкретно протокол передачи данных — набор соглашений интерфейса логического уровня, которые определяют обмен данными между различными программами - https://ru.wikipedia.org/wiki/Протокол
NStorm писал(а):Банально функции написать для отправки бита и пакета... Таймеры освойте... попробуйте на _аппаратном_ ШИМ...

Какие ещё функции... ШИМ... и т.д.
Это я специально для olegue написал, который ещё не до конца разобрался как вообще работает порт в МК.
olegue писал(а):это мой уровень - это 100% попадание.

NStorm писал(а):А вот принять сложнее будет. Надо будет выделить сигнал из мусора.

Вообще не проблема))
NStorm писал(а):А еще нужна какая-то последовательность, для отделения данных от мусора.

Не нужна. В радиоэфире нет мусора. В радиоэфире есть шум))
NStorm писал(а):Можно ИК-протокол какой-нибудь за основу взять.

Нельзя. Точнее можно, но будет работать через жопу.))
Ни один ИК-протокол не соответствует требованиям передачи по радиоканалу.
olegue писал(а):не могу дать профессиональную оценку как NStorm

Эта типа шутка такая ? )) Да, смешно))
olegue писал(а):получаю сигнал, измеряю длительность,
если длительность соответствует, запоминаю в переменную
получаю слещущий измеряю длительность....

Всё верно.
olegue писал(а):а потом сравниваю с тем, кодом который должен быть.

Не потом, а сразу. Потом поздно будет))

1-получаю сигнал, измеряю длительность импульса: Если длительность соответствует, прибавляю в переменную +1. Если не соответствует, записываем в переменную 0 и переходим к пункту 1. Начинаем всё с начала))
2-получаю сигнал, измеряю длительность импульса: Если длительность соответствует, прибавляю в переменную +1. Если не соответствует, записываем в переменную 0 и переходим к пункту 1. Начинаем всё с начала))
...
...
и т.д.
...
...
когда в переменной будет число равное количеству "правильных" импульсов, выполняем команду (включаем реле) записываем в переменную 0 и переходим к пункту 1. Начинаем всё с начала))

P.S. Программа работает в цикле. Анализирует каждый входящий импульс.
Типа поточный алгоритм - https://ru.wikipedia.org/wiki/Поточный_алгоритм
код.png
(42.12 KiB) Скачиваний: 310

код ошибка.png
(34.57 KiB) Скачиваний: 315

Поправка)) В начале пакета нужна преамбула. Типа 101010101... Нафига ? А чтоб тинька сбросила переменную в 0 и перешла к пункту 1. В начало. А то ещё застрянет посередине цикла... и пропустит нужный пакет)) Ну или како-нибудь спец символ.
Только это не разделитель данных. У нас данных нет. Это составная часть пакета. Хотя нет. Это скорее заголовок пакета. Так будет правильней)) :roll:

всё)) :tea:

короче... мы расписали работу обычного цифрового радиомодуля)) ничего нового мы не изобрели)) :)))

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

Чт дек 12, 2019 10:49:02

Буду пробовать. Счас нужно понять как посчитать длительность входящего импульса
Как раз думал заняться таймерами на тиньке. Вот с прицелом на это и буду их рассматривать.

Добавлено after 3 minutes 36 seconds:
NStorm,

olegue, ну вот, например: https://cxem.net/mc/mc315.php


отличный пример. Спасибо. Я то гуглил гуглил.... ничгео подходящего не нашлось.

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

Чт дек 12, 2019 11:20:47

Нельзя. Точнее можно, но будет работать через жопу.))
Ни один ИК-протокол не соответствует требованиям передачи по радиоканалу.

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

Какие ещё функции... ШИМ... и т.д.
Это я специально для olegue написал, который ещё не до конца разобрался как вообще работает порт в МК.

И поэтому советовать как писать НЕ надо? Ардуино-стайл повторяющихся blink-delay? Надо сразу учиться нормально делать, а не через одно место. Функции элементарно освоить, они уже были тут местами в теме.
Код:
void send_bit(char in) {
  PORTB.1=1;
  delay_ms(in ? 1 : 2);
  PORTB.1=0;
  delay_ms(in ? 1 : 2);
}

Если уж CVAVR. И простыня уже в разы меньше. А если уж send_byte/send_packet дальше дописать, то и вообще нормальный вид будет.

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

Чт дек 12, 2019 15:01:52

NStorm писал(а):Но ту же самую идею с преамбулой и коцном передачи можно взять.

ну тогда просто взять из даташита любого радиомодуля))
1.jpg
(20.72 KiB) Скачиваний: 272

А если уж send_byte/send_packet дальше дописать, то и вообще нормальный вид будет.

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

Пипец... нафиг оно надо)) :)))
Для таких задач есть аппаратный ШИМ. Который работает от кварца и не зависит от тактов процессора. На выходе имеем сигнал с абсолютной точностью (постоянная длительность и пауза между импульсами).

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

Чт дек 12, 2019 17:31:29

Бред какой-то. Функции за разное количество тактов... а delay_ms при этом используем. Сначала давай ногодрый простыней, какой там ШИМ аппаратный! А теперь функции говно, потому что ногодрыг, надо только аппаратный ШИМ. Где логика?

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

Пн дек 16, 2019 14:37:56

У меня по работе с портами есть вопрос.

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

А если я вместо кнопки подам сигнал с генератора на к155ла3 , будет ли светодиод мигать реагируя на импульсы генератора?
Если я нажимаю на кнопку то уровень на этой ножке меняется с высокого на низкий

А если подам с генератора, то на ногу придет либо высокий, либо его отсутсвие (высокого). Будет ли отсутсвие выского уровня расценено Тинькой как низкий?

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

Пн дек 16, 2019 14:49:35

А если подам с генератора, то на ногу придет либо высокий, либо его отсутсвие (высокого). Будет ли отсутсвие выского уровня расценено Тинькой как низкий?

Выход у 155ЛА3 не может формировать Z-состояние… на выходе или лог 1, или лог 0. А значит МК будет реагировать на выход ЛА3 (генератор) как и на кнопку.

PS. Зачем реализовывать генератор на дополнительной микросхеме, когда МК и сам может формировать данный сигнал «генератора»? :dont_know:

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

Пн дек 16, 2019 15:54:57

olegue писал(а):Выход у 155ЛА3 не может формировать Z-состояние… на выходе или лог 1, или лог 0.


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

Самсусамыч писал(а):Зачем реализовывать генератор на дополнительной микросхеме, когда МК и сам может формировать данный сигнал «генератора»?


да, вопрос из рубрики, "А Что будет если...."

а еще подумал, где взять импульсы, что бы их например посчитать потом

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

Пн дек 16, 2019 15:59:46

Ну кнопка и есть "обрыв", пока она не нажата. Подтяжка к питанию или к земле - это уже не часть кнопки.
А тут при том, что если "нет Z-состояния", то нет и "отсутствия высокого уровня". Когда на выходе 0 - это низкий уровень, к земле притягивается вывод. А кнопка в воздухе болтается в отличии от. Поэтому кнопку со стороны МК к + или - питания подтягивают, чтобы от наводок не было шума на входе.

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

Пн дек 16, 2019 16:43:28

Смоделировал в протеусе к155ла3 в режиме генератора и Тинька с кнопкой в режиме выключения/влючения. Работает эта связка как тригер -делитель на 2.

Добавлено after 8 minutes 53 seconds:
счас хочу импульсы посчитать.

Добавлено after 1 minute 37 seconds:
без привязки по времени, не частоту.

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

Пн дек 16, 2019 16:56:19

Поясните.

Вывод порта МК сконфигурированный на вход (далее просто вход) не должен висеть в воздухе. Иначе он будет ловить любые наводки… вход в зависимости от требований необходимо подтянуть через резистор, или к общей шине GND, или к плюсу питания. К общей шине вход можно подтянуть только внешним резистором, а вот к плюсу питания, можно подтянуть как внешним, так и внутренним резистором (на выбор разработчика)… так вот в твоём случае (для кнопки), вход подтянут к плюсу питания и если кнопка не подсоединена или не нажата (что для входа МК одно и тоже), то МК на это не будет и реагировать.
Что касается генератора на 155ЛА3… на выходе логического элемента 2И-НЕ всегда присутствует логический сигнал, или 0, или 1 – другого не дано. Таким образом твоё предположение, что на вход МК от генератора будет приходить «то на ногу придет либо высокий, либо его отсутсвие (высокого)» звучит не корректно, так как на вход МК от генератора на ЛА3 будет приходить периодически 1 и 0. Это говорит о том, что алгоритм будет отрабатываться на МК корректно – светодиод будет мигать.

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

Пн дек 16, 2019 17:11:55

счас хочу импульсы посчитать.

Добавлено after 1 minute 37 seconds:
без привязки по времени, не частоту.

Самое простое - программно в прерывании увеличивать некую переменную.
Можно аппаратно, заведя сигнал на ногу T0 включить таймер на внешний клок и тогда МК аппаратно будет увеличивать регистр TMR0 на один каждый фронт.

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

Пн дек 16, 2019 17:17:03

Можно аппаратно, заведя сигнал на ногу T0 включить таймер на внешний клок и тогда МК аппаратно

У тини13 нет внешнего входа Т0. Так что не получится реализовать данный совет.
тини13.png

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

Пн дек 16, 2019 18:35:23

Самсусамыч, есть. На вашем скрине даже. Пин 7 смотрите. И в ДШ прекрасно описан его режим работы по спаду или подъему.

Добавлено after 14 minutes 43 seconds:
Чтобы включить этот режим, надо ногу PB2 (пин 7) переключить на вход и сделать TCCR0B = (1 << CS2) | (1 << CS1) | (1 << CS0);
Это включит режим тиканья таймера по сигналу на PB2 (T0). После этого регистр TCNT0 будет увеличиваться каждый восходящий фронт. На счет переполнения его после 255 сами подумайте )

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

Пн дек 16, 2019 18:52:37

Самсусамыч, есть. На вашем скрине даже. Пин 7 смотрите.

Да, точно есть… :beer: похоже слепой стал – не заметил, а в даташит не полез… каюсь. :oops:

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

Пн дек 16, 2019 20:06:25

olegue писал(а):А если подам с генератора, то на ногу придет либо высокий, либо его отсутсвие (высокого). Будет ли отсутсвие выского уровня расценено Тинькой как низкий?

Откройте схему к155ла3
1-15.gif
(8.09 KiB) Скачиваний: 266

У к155ла3 на выходе два транзистора (верхний и нижний).
-Если верхний открыт , то на выходе высокий уровень.
-Если нижний открыт , то на выходе низкий уровень уровень.

Вывод: на ноге к155ла3 будет или высокий или низкий уровень. Другого не дано))
olegue писал(а):почитал немножко про z состояние, но z состояние можно расспатривать как обрыв...

В z-состоянии сигнал поступает на затвор полевого транзистор (обычный полевой транзистор с изолированным затвором).
Поэтому входное сопротивление в z-состоянии более 1 МОм (точно не мерил).
А ещё там есть подтягивающий резистор ~33 кОм , который подключается к плюсу питания...
Смотрите и изучайте даташиты))
МК.jpg
(152.75 KiB) Скачиваний: 266

olegue писал(а):счас хочу импульсы посчитать.

Посчитать к155ла3 не проблема. Можно любым удобным способом)) Через таймер... Через прерывание... как угодно.

P.S. Только не вздумайте подключать счётный таймер к своему приёмнику.)) На выходе приёмника куча помех...
Если надо посчитать импульсы с приёмника , то это делается по другому.

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

Пн дек 16, 2019 22:53:08

ок, спасибо всем за ответы.

двигаюсь дальше. Изучаю счетчик, и , опять овраги.

Код:
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>


interrupt [TIM0_COMPA] void timer0_compa_isr(void)    {
     TCNT0=0x00;
       
       }

void main(void)
 {
   
 
   
    DDRB=0xFF;
    PORTB=0b00000001;
   
    TCCR0B=0x03;   //Счетный режим таймера с часторой....
    OCR0A=0xF0;    // Заданное число сравления
    TIMSK0=0x04;   //Разрешаем выполнение прерывание по совпадению в OCR0A
   
    sei();
   
   
   
    //PORTB|=(1<<PORTB4);
   // Write your code here
   while (1)
   {
     
   
     


и вот ошибки , ругается на функциию interrupt...

Код:
avr-gcc.exe -Wall -gdwarf-2 -fsigned-char -MD -MP -DF_CPU=1000000 -O1 -mmcu=attiny13  -o "main.o" -c "../main.c"
../main.c:11: error: 'TIM0_COMPA' undeclared here (not in a function)
../main.c:11: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
../main.c:16: warning: return type of 'main' is not 'int'
make: *** [main.o] Error 1

Error code 2


у меня 8-ой протеус, посмотрите в своих протеусах будет ли работать.

WinAVR-20100110

Добавлено after 1 minute 6 seconds:
спасибо заранее

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

Пн дек 16, 2019 23:02:30

Вы пример под CVAVR берете и в WinAVR пытаетесь его собрать. Так не будет работать. В avr-gcc прерывания вот так записываются:
ISR(TIM0_COMPA_vect)
Замените на это объявление interrupt [TIM0_COMPA] void timer0_compa_isr(void), так только в CVAVR пишется.

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

Вт дек 17, 2019 10:15:26

ISR(TIM0_COMPA_vect)


да все завелось. Спасибо.

Код:
void timer_ini(void)
{
   //TCCR0B=0x05;
   TCCR0B|=(1<<CS02);  // УСТАНОВИМ ДЕЛИТЕЛЬ 1024
   TCCR0B|=(1<<CS00);  // Эти 2 бита в 1
   OCR0A=0xFF;  // 255; 1200000/1024=1172 ГЦ и делим на число 0xff (255)= 4.5 гц
   TIMSK0=0x04;   // разрешаем таймер по совпадению с числом в OCR0A
   }


вот получил я скажем 4.5 гц, а как получить 1 гц?

Пробовал гуглить, но ниччего конкретного
Я ведль не могу записать как в Атмеге 2х битное число и скоректировать им на нужную мне частоту.
Например я бы мог запсать в OCR0A 1172 и тогда у меня получился бы 1 гц
Или еще подумал что можно наверно ка-то понизить частоту внутреннего генератора???? Возможно ли это?

Вопрос чисто академичесий, никакого прикладного значения.
Ответить