Передача данных из множества ATtiny13A в один ATmega328P
- Сообщения: 63
- Зарегистрирован: Пн дек 29, 2014 21:29:32
Всё это конечно классно и интересно, но хочется максимальной простоты и надежности. И прошить каждую тиньку своей прошивкой не есть проблема на самом деле. Сейчас главная проблема для меня написать толковый программный UART, специализированный для данного проекта. Пробую готовые решения, но пока результата нет.
- Реклама
А задействовать что-то, вроде SPI ? Да, лишний оптрон на каждую тиньку, зато никаких проблем с разбегом частот. Аппаратный SPI, правда, не задействуешь, ему трех сигналов не хватит, но кто мешает наладить синхронизацию на уровне протокола?
Или организовать тинькам внешний клок (задействовать CLKI) через импульсный трансформатор (многообмоточный), тогда разбега частот не будет в принципе. Где, правда, брать такой трансформатор...
Или организовать тинькам внешний клок (задействовать CLKI) через импульсный трансформатор (многообмоточный), тогда разбега частот не будет в принципе. Где, правда, брать такой трансформатор...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Батарея плюс контроллер ее заряда (тинька) единый блок. Не фиг даже пытаться по отдельности подключать батареи и тиньки.
Если в транспортном средстве независимые батареи, то каждая из них будет управляться независимым контроллером. Потому что иначе смысла в их независимости не будет.
Опторонами развязали только шину интерфейса, полной гальванической развязки при этом нет и в помине. Это потенциальный бабах или паранойя?
По мне так добавить две лишних конструкторские единицы (полевик и резистор) всяко лучше, чем добавить 23 конструкторские единицы, причем очень похожих и которые легко перепутать.
Если в транспортном средстве независимые батареи, то каждая из них будет управляться независимым контроллером. Потому что иначе смысла в их независимости не будет.
Опторонами развязали только шину интерфейса, полной гальванической развязки при этом нет и в помине. Это потенциальный бабах или паранойя?
По мне так добавить две лишних конструкторские единицы (полевик и резистор) всяко лучше, чем добавить 23 конструкторские единицы, причем очень похожих и которые легко перепутать.
- Сообщения: 1407
- Зарегистрирован: Вт июн 07, 2011 08:03:18
Кстати, если включить цепочкой, то достаточно одного транзистора для преобразования уровня вместо оптронов. На последнем, конечно, оптрон необходим, для связи с мастером. Но это так, минимизация.)
А кто сказал, что нет полной гальванической развязки ?ПростоНуб писал(а):Опторонами развязали только шину интерфейса, полной гальванической развязки при этом нет и в помине. Это потенциальный бабах или паранойя?
по оптрону на Tx и Rx - и этого достаточно!
Мастер может быть связан с одной из батарей, а может быть и не связан.. Оптика дает вам гарантированную развязку.
Определение адреса, как пишет ТС, не нужно. Соответственно, усложнение в сторону отказа от универсальности - не нужно.
- Реклама
[uquote="goldenandy",url="/forum/viewtopic.php?p=3582333#p3582333"]по оптрону на Tx и Rx - и этого достаточно![/uquote]
Для развязки от хоста - да. А гальванической развязки между тиньками нет по определению. И потому наличие полевика в цепочке тинек никак на гальваническую развязку не повлияет.
Для развязки от хоста - да. А гальванической развязки между тиньками нет по определению. И потому наличие полевика в цепочке тинек никак на гальваническую развязку не повлияет.
А если это 2 независимых батареи ?
И контроллер один на две батареи ?
И основной вопрос - зачем полевик в цепочке тинек ?
Что бы городить последовательную передачу эстафеты от тини к тине ? Так ТС уже сказал, что адрес у него будет зашит в прошивке...
Добавлено after 58 minutes 7 seconds:
От мастера прилетает 2 байта - первый 0х55 - для синхронизации, второй - запрашиваемый адрес.
Переменная ЗАДЕРЖКА, инициализирована нулем, тут будет посчитанная задержка для приема и последующей передачи.
Переменная СЧЕТЧИК - это наш счетчик задержки
Переменная РХ, принятый байт.
Переменная ТХ - байт для передачи
Переменная БИТ, счетчик битов.
переменная БАЙТЫ, счетчик принятых байт
РХПОРТ - бит порта, который отвечает за rx (прием)
ТХПОРТ - выходной бит порта для передачи
состояние линии УАРТ - высоки уровень.
Стартовый бит длиной Т - низкий уровень, потом идут 8 бит данных, каждый длиной Т, от младшего к старшему. Потом стоп-бит, длиной Т.
В случае передачи байта 0х55 будет:
старт, биты 0....7, стоп бит: 0 1 0 1 0 1 0 1 0 1
Т.е. по факту мы принять должны 9 бит, первый из которых - всегда 0
Отсюда алгоритм будет такой - по перепаду в 0 просыпаемся, ждем единичку, считаем длину единички, дальше работаем как со стандартным УАРТ....
поехали.
1. Просыпаемся по низкому уровню на РХПОРТ.
2. ЗАДЕРЖКА = 0
3. СЧЕТЧИК = 0
4. РХ = 0
5. БАЙТЫ = 0
6. Если РХПОРТ == 0: возвращаемся к п.6 //ожидание, пока пройдет стартовый бит
// сюда попадем, когда стартовый нулевой бит сменится единичкой младшего бита на РХПОРТ
7. Если РХПОРТ == 0: переход на п.11 //начался второй бит посылки (мы помним, что посылка у нас 0101010101)
8. увеличиваем ЗАДЕРЖКА
9. если ЗАДЕРЖКА досчитала до конца: переходим на п.39 //переполнение счетчика - признак того, что на линии какая то левотня, т.е. ошибка
10. переход на п.7.
11. БИТ = 2; РХ = 0х01 //приняли старт-бит и первый бит (мы помним, что посылка у нас 0101010101)
12. СЧЕТЧИК = ЗАДЕРЖКА / 2
13. Если СЧЕТЧИК>0: уменьшаем СЧЕТЧИК; возвращаемся к п.13
14. РХ сдвинули влево ( РХ <<= 1 )
15. если РХПОРТ == 1: РХ |= 0х01
16. БИТ++
17. если БИТ<9: СЧЕТЧИК = ЗАДЕРЖКА; переход на п.13
18. БАЙТЫ++
19. Если БАЙТЫ == 2: переход на п. 24 //получили второй байт, уходим на обработку принятого адреса
// сюда попадем только после принятия первого байта (БАЙТы ==1)
20. если РХ != 0х55: переход на п.39 //ошибка, первый байт должен быть 0х55
// готовимся принять второй байт.
21. ПОРТСОСТ = РХПОРТ; // ПОРТСОСТ - локальная переменная, нужна для запоминания предыдущего состояния порта
22. Если ПОРТСОСТ == РХПОРТ: идем на п.22 // изменений на бите порта нет
23. Если РХПОРТ== 1: идем на п.22 // изменение на бите порта есть, но от 0 к 1, нам такое не нужно.
// сюда попадаем, когда начинается стартовый бит второго байта.
24. БИТ = 0
25. РХ = 0
26. Переход на п.12
24. если РХ != наш адрес: переходим к п.39 //вопрос не к нам, молчим в тряпочку
//тут, судя по всему, нужно включить транзистор, управляющий нагрузкой, запустить АЦП дважды (первое измерение может быть кривое), подождать второй результат измерений, выключить АЦП и нагрузку
25. БАЙТЫ = 0
26. если БАЙТЫ ==0: ТХ = младший байт результата АЦП; иначе ТХ = старший байт результата АЦП
27. БИТ = 0
28. Если БИТ ==0: ТХПОРТ = 0; переход на п.31
29. если ТХ & 0х01: ТХПОРТ = 1; иначе ТХПОРТ = 0
30. ТХ >>= 1 //сдвинули вправо на 1 бит
31. БИТ++
32. СЧЕТЧИК = ЗАДЕРЖКА
33. если СЧЕТЧИК !=0: СЧЕТЧИК--; переход на п.33
34. если БИТ<9: переход на п.29
//стоп бит
35. ТХПОРТ = 1
36. если БИТ==9: Переход на п.31 //для отправки стоп бита.
37. БАЙТЫ++
38. если БАЙТЫ<2: переход на п.26
// все, конец передачи
39. Подготовка ко сну, уход в сон
--------------
Возможно, в пп. 17 и 32 нужно писать СЧЕТЧИК = ЗАДЕРЖКА-_константа_; константа будет где то 2..3..4.. как компенсация времени, затраченного на изменения счетчиков, выборку бита....
И контроллер один на две батареи ?
И основной вопрос - зачем полевик в цепочке тинек ?
Что бы городить последовательную передачу эстафеты от тини к тине ? Так ТС уже сказал, что адрес у него будет зашит в прошивке...
Добавлено after 58 minutes 7 seconds:
Как на данный момент я представляю себе ваш уарт...Combatos писал(а):главная проблема для меня написать толковый программный UART
От мастера прилетает 2 байта - первый 0х55 - для синхронизации, второй - запрашиваемый адрес.
Спойлер
Определяем переменные.Переменная ЗАДЕРЖКА, инициализирована нулем, тут будет посчитанная задержка для приема и последующей передачи.
Переменная СЧЕТЧИК - это наш счетчик задержки
Переменная РХ, принятый байт.
Переменная ТХ - байт для передачи
Переменная БИТ, счетчик битов.
переменная БАЙТЫ, счетчик принятых байт
РХПОРТ - бит порта, который отвечает за rx (прием)
ТХПОРТ - выходной бит порта для передачи
состояние линии УАРТ - высоки уровень.
Стартовый бит длиной Т - низкий уровень, потом идут 8 бит данных, каждый длиной Т, от младшего к старшему. Потом стоп-бит, длиной Т.
В случае передачи байта 0х55 будет:
старт, биты 0....7, стоп бит: 0 1 0 1 0 1 0 1 0 1
Т.е. по факту мы принять должны 9 бит, первый из которых - всегда 0
Отсюда алгоритм будет такой - по перепаду в 0 просыпаемся, ждем единичку, считаем длину единички, дальше работаем как со стандартным УАРТ....
поехали.
1. Просыпаемся по низкому уровню на РХПОРТ.
2. ЗАДЕРЖКА = 0
3. СЧЕТЧИК = 0
4. РХ = 0
5. БАЙТЫ = 0
6. Если РХПОРТ == 0: возвращаемся к п.6 //ожидание, пока пройдет стартовый бит
// сюда попадем, когда стартовый нулевой бит сменится единичкой младшего бита на РХПОРТ
7. Если РХПОРТ == 0: переход на п.11 //начался второй бит посылки (мы помним, что посылка у нас 0101010101)
8. увеличиваем ЗАДЕРЖКА
9. если ЗАДЕРЖКА досчитала до конца: переходим на п.39 //переполнение счетчика - признак того, что на линии какая то левотня, т.е. ошибка
10. переход на п.7.
11. БИТ = 2; РХ = 0х01 //приняли старт-бит и первый бит (мы помним, что посылка у нас 0101010101)
12. СЧЕТЧИК = ЗАДЕРЖКА / 2
13. Если СЧЕТЧИК>0: уменьшаем СЧЕТЧИК; возвращаемся к п.13
14. РХ сдвинули влево ( РХ <<= 1 )
15. если РХПОРТ == 1: РХ |= 0х01
16. БИТ++
17. если БИТ<9: СЧЕТЧИК = ЗАДЕРЖКА; переход на п.13
18. БАЙТЫ++
19. Если БАЙТЫ == 2: переход на п. 24 //получили второй байт, уходим на обработку принятого адреса
// сюда попадем только после принятия первого байта (БАЙТы ==1)
20. если РХ != 0х55: переход на п.39 //ошибка, первый байт должен быть 0х55
// готовимся принять второй байт.
21. ПОРТСОСТ = РХПОРТ; // ПОРТСОСТ - локальная переменная, нужна для запоминания предыдущего состояния порта
22. Если ПОРТСОСТ == РХПОРТ: идем на п.22 // изменений на бите порта нет
23. Если РХПОРТ== 1: идем на п.22 // изменение на бите порта есть, но от 0 к 1, нам такое не нужно.
// сюда попадаем, когда начинается стартовый бит второго байта.
24. БИТ = 0
25. РХ = 0
26. Переход на п.12
24. если РХ != наш адрес: переходим к п.39 //вопрос не к нам, молчим в тряпочку
//тут, судя по всему, нужно включить транзистор, управляющий нагрузкой, запустить АЦП дважды (первое измерение может быть кривое), подождать второй результат измерений, выключить АЦП и нагрузку
25. БАЙТЫ = 0
26. если БАЙТЫ ==0: ТХ = младший байт результата АЦП; иначе ТХ = старший байт результата АЦП
27. БИТ = 0
28. Если БИТ ==0: ТХПОРТ = 0; переход на п.31
29. если ТХ & 0х01: ТХПОРТ = 1; иначе ТХПОРТ = 0
30. ТХ >>= 1 //сдвинули вправо на 1 бит
31. БИТ++
32. СЧЕТЧИК = ЗАДЕРЖКА
33. если СЧЕТЧИК !=0: СЧЕТЧИК--; переход на п.33
34. если БИТ<9: переход на п.29
//стоп бит
35. ТХПОРТ = 1
36. если БИТ==9: Переход на п.31 //для отправки стоп бита.
37. БАЙТЫ++
38. если БАЙТЫ<2: переход на п.26
// все, конец передачи
39. Подготовка ко сну, уход в сон
--------------
Возможно, в пп. 17 и 32 нужно писать СЧЕТЧИК = ЗАДЕРЖКА-_константа_; константа будет где то 2..3..4.. как компенсация времени, затраченного на изменения счетчиков, выборку бита....
как-то одному товарищу делал программный UART, как раз, для ATtiny13. но только на передачу. вот, нашел этот код:Combatos писал(а):главная проблема для меня написать толковый программный UART
Код: Выделить всё
; для скорости 9600 бод длительность одного бита должна быть равна 104 мкс
; для тактовой частоты 1,2 МГц это составляет 125 тактов
transmit_byte:
ldi R17, 8 ;передать 8 битов
cbi PortB, 1 ;вкл. оптопару, старт-бит (бит = 1), общая длительность старт-бита 125 тактов
ldi R21, 37 ;1 такт
rcall delay ;длительность задержки (3*37 + 6 = 117 тактов)
nop ;1 такт, выравнивание до 125 тактов
nop ;1 такт, выравнивание до 125 тактов
next_bit:
lsl R16 ;1 такт
brcc bit_0 ;1 такт если нет, 2 такта если да
nop ;1 такт, выравнивание до 125 тактов
cbi PortB, 1 ;2 такта, вкл. оптопару, бит = 1, общая длительность единицы 125 тактов
ldi R21, 36 ;1 такт
rcall delay ;длительность задержки (3*36 + 6 = 114 тактов)
nop ;1 такт, выравнивание до 125 тактов
nop ;1 такт, выравнивание до 125 тактов
dec R17 ;1 такт
brne next_bit ;1 такт если нет, 2 такта если да
rjmp exit ;2 такта
bit_0:
sbi PortB, 1 ;2 такта, выкл. оптопару, бит = 0, общая длительность нуля 125 тактов
ldi R21, 36 ;1 такт
rcall delay ;длительность задержки (3*36 + 6 = 114 тактов)
nop ;1 такт, выравнивание до 125 тактов
nop ;1 такт, выравнивание до 125 тактов
dec R17 ;1 такт
brne next_bit ;1 такт если нет, 2 такта если да
nop ;1 такт, выравнивание до 125 тактов
nop ;1 такт, выравнивание до 125 тактов
exit:
nop ;1 такт, выравнивание до 125 тактов
nop ;1 такт, выравнивание до 125 тактов
;передача двойного стоп-бита
sbi PortB, 1 ;2 такта, выкл. оптопару, стоп-бит (бит = 0), общая длительность двойного стоп-бита 251 тактов
ldi R21, 80 ;1 такт
rcall delay ;длительность задержки (3*80 + 6 = 246 тактов)
ret ;4 такта
--- Delay---
delay: ;длина задержки = 3(rcall delay) + 3 * R21 + 3(ret)
dec R21
brne delay ;если ноль,то выход
ret
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 63
- Зарегистрирован: Пн дек 29, 2014 21:29:32
Спасибо за помощь в программировании, но я остановил свой выбор на такой реализации программного уарта: https://habr.com/ru/post/346980/ . Тут есть даже "самосинхронизация". Но этот проект под Atmel Studio 7.. А я в нем дуб-дубом, даже программатор свой не знаю, как прикрутить. Вот если бы перевести код в привычный мне CodeVision, то наверное все бы получилось.
Не путайте среду разработки и язык Си.
И прочитайте все комментарии, там много всякой вкусной теории.
Ответ на ваш вопрос вот : https://habr.com/ru/post/346980/#comment_19637956
«Проект для Atmel Studio» — это вообще‐то набор самых обычных исходных файлов плюс настройки studio. Если у вас нет studio просто игнорируйте настройки и создайте Makefile/CMakeLists.txt/… для своей среды. Исходный код там есть, он не зашифрован и даже не обёрнут в XML (и я не помню, чтобы так делала вообще какая‐либо IDE). Конкретно в этом случае — файл Tiny_UART/main.c.
Вам нужен один файл - main.c
Добавлено after 3 minutes 6 seconds:
Как запустите - погрейте тиньку феном, засуньте в морозилку и протестируйте обмен данными. Покрутите при этом питание. Как результаты получите - отпишитеь
И прочитайте все комментарии, там много всякой вкусной теории.
Ответ на ваш вопрос вот : https://habr.com/ru/post/346980/#comment_19637956
«Проект для Atmel Studio» — это вообще‐то набор самых обычных исходных файлов плюс настройки studio. Если у вас нет studio просто игнорируйте настройки и создайте Makefile/CMakeLists.txt/… для своей среды. Исходный код там есть, он не зашифрован и даже не обёрнут в XML (и я не помню, чтобы так делала вообще какая‐либо IDE). Конкретно в этом случае — файл Tiny_UART/main.c.
Вам нужен один файл - main.c
Добавлено after 3 minutes 6 seconds:
Как запустите - погрейте тиньку феном, засуньте в морозилку и протестируйте обмен данными. Покрутите при этом питание. Как результаты получите - отпишитеь
- Сообщения: 63
- Зарегистрирован: Пн дек 29, 2014 21:29:32
Ок. Спасибо, буду пробовать. Непонятка вот с этим, например: ":: [Buf]"z"(text), [TX_line]"I"(TxD), [delay]"r"(UART_DELAY), [port]"I"(UART_TX_PORT):"r18"); ". Строки подобного вида в конце каждой ассемблерной вставки...
Это описатели для компилятора, что куда для асма положить и потом забрать. Читайте...
- Сообщения: 58
- Зарегистрирован: Пн янв 08, 2007 18:23:08
Привет Котафеям.
Давненько решал похожую задачку, правда на другом типе микроконтроллера, но сути не меняет.
Задача: нужно было опрашивать 40 адресных устройств, по команде считывать состояние входов, управлять выходом,
менять адрес "адресных"устройств.
описание обмена.
; Устройство позволяет отображать состояние 40 Адресных устройств на LCD (96x68)
; Для связи с адресными устройствами используется 3 провода (+,-, информация).
; (Slave) Адресное устройство отслеживает:
; 4 линии Ввода(замкнуто/разомкнуто).
; 1 линия Вывода (По команде от Master "Vizer40" управляет состоянием OUT)
; Визуально состояние Входов и Выхода - отображается на светодиодах.
; При замыкании Входа светится соответствующий светодиод.
; Свечение светодиода Выхода (OUT)= 1
;
; Для опроса и управления адресными устройствами используется пакет из 8 байт.
; Пакет данных от Master -> Slave состоит:
; Все символы после маркера могут быть ТОЛЬКО (0123456789ABCDEF) то есть Hex.
; Запрос - Маркер начала передачи от Master -> Slave - символ ">".
; Ответ - Маркер начала передачи от Slave -> Master - символ "<".
; Два (Hex) символа - Адрес устройства ( 0..FF) используется только (0..28).
; Один (Hex) символ - Команда.
; Два (Hex) символа - Данные (Master <-> Slave).
; Два (Hex) символа - Контрольная сумма пакета CRC8.
;
; Биты ответа:
; (0 - IN1) Замкнут/Разомкнут. Первый (Hex) байт.
; (1 - IN2) Замкнут/Разомкнут. Первый (Hex) байт.
; (2 - IN3) Замкнут/Разомкнут. Первый (Hex) байт.
; (3 - IN4) Замкнут/Разомкнут. Первый (Hex) байт.
; 4 - состояние OUT. Второй (Hex) байт.
; 5 - Не используется (Расширение). Второй (Hex) байт.
; 6 - Не используется (Расширение). Второй (Hex) байт.
; 7 - Не используется (Расширение). Второй (Hex) байт.
;
; Команды.
; 0 - Чтение из Адресника состояние Входов (1,2,3,4), Выхода OUT.
; 1 - Запись в адресник ( OUT ON) (сохраняется во внутренную Flash)?
; 2 - Запись в адресник ( OUT OFF) (сохраняется во внутренную Flash)?
; 3 - Запись в адресник нового адреса (сохраняется во внутренную Flash).
; 4 - Не используется (Расширение).
; 5 - Не используется (Расширение).
; 6 - Не используется (Расширение).
; 7 - Не используется (Расширение).
; 8 - Не используется (Расширение).
; 9 - Не используется (Расширение).
;
; A,B,C,D,E,F - Не используется (Расширение)
;
; Пакет запроса обмена мастер -> славе, состоит из 8 байт.
; > - начало пакета.
; x,x - два байта адреса. Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; 0-3 - один байт код команды Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; x,x - два байта данные. Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; x,x - два байта CRC Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
;
;
; Пакет ответа славе -> мастер состоит из 8 байт.
; < - начало пакета.
; x,x - два байта адреса. Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; 0-3 - один байт код команды Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; x,x - два байта данные. Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; x,x - два байта CRC Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
;
; Ответ два байта с кодом EE - ASCI (HEX) от адресного устройства Ошибка !!!
;
;
; Пример READ ADR64 >64000ED ответ от адресника <6400062
; (IN1,IN2,IN2,IN3 - разомкнут,OUT =0)
Всё работало, опрос всех 40 устройств около 8 секунд
На фото это устройство в работе.
Давненько решал похожую задачку, правда на другом типе микроконтроллера, но сути не меняет.
Задача: нужно было опрашивать 40 адресных устройств, по команде считывать состояние входов, управлять выходом,
менять адрес "адресных"устройств.
описание обмена.
; Устройство позволяет отображать состояние 40 Адресных устройств на LCD (96x68)
; Для связи с адресными устройствами используется 3 провода (+,-, информация).
; (Slave) Адресное устройство отслеживает:
; 4 линии Ввода(замкнуто/разомкнуто).
; 1 линия Вывода (По команде от Master "Vizer40" управляет состоянием OUT)
; Визуально состояние Входов и Выхода - отображается на светодиодах.
; При замыкании Входа светится соответствующий светодиод.
; Свечение светодиода Выхода (OUT)= 1
;
; Для опроса и управления адресными устройствами используется пакет из 8 байт.
; Пакет данных от Master -> Slave состоит:
; Все символы после маркера могут быть ТОЛЬКО (0123456789ABCDEF) то есть Hex.
; Запрос - Маркер начала передачи от Master -> Slave - символ ">".
; Ответ - Маркер начала передачи от Slave -> Master - символ "<".
; Два (Hex) символа - Адрес устройства ( 0..FF) используется только (0..28).
; Один (Hex) символ - Команда.
; Два (Hex) символа - Данные (Master <-> Slave).
; Два (Hex) символа - Контрольная сумма пакета CRC8.
;
; Биты ответа:
; (0 - IN1) Замкнут/Разомкнут. Первый (Hex) байт.
; (1 - IN2) Замкнут/Разомкнут. Первый (Hex) байт.
; (2 - IN3) Замкнут/Разомкнут. Первый (Hex) байт.
; (3 - IN4) Замкнут/Разомкнут. Первый (Hex) байт.
; 4 - состояние OUT. Второй (Hex) байт.
; 5 - Не используется (Расширение). Второй (Hex) байт.
; 6 - Не используется (Расширение). Второй (Hex) байт.
; 7 - Не используется (Расширение). Второй (Hex) байт.
;
; Команды.
; 0 - Чтение из Адресника состояние Входов (1,2,3,4), Выхода OUT.
; 1 - Запись в адресник ( OUT ON) (сохраняется во внутренную Flash)?
; 2 - Запись в адресник ( OUT OFF) (сохраняется во внутренную Flash)?
; 3 - Запись в адресник нового адреса (сохраняется во внутренную Flash).
; 4 - Не используется (Расширение).
; 5 - Не используется (Расширение).
; 6 - Не используется (Расширение).
; 7 - Не используется (Расширение).
; 8 - Не используется (Расширение).
; 9 - Не используется (Расширение).
;
; A,B,C,D,E,F - Не используется (Расширение)
;
; Пакет запроса обмена мастер -> славе, состоит из 8 байт.
; > - начало пакета.
; x,x - два байта адреса. Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; 0-3 - один байт код команды Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; x,x - два байта данные. Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; x,x - два байта CRC Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
;
;
; Пакет ответа славе -> мастер состоит из 8 байт.
; < - начало пакета.
; x,x - два байта адреса. Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; 0-3 - один байт код команды Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; x,x - два байта данные. Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
; x,x - два байта CRC Код ASCI (HEX) (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
;
; Ответ два байта с кодом EE - ASCI (HEX) от адресного устройства Ошибка !!!
;
;
; Пример READ ADR64 >64000ED ответ от адресника <6400062
; (IN1,IN2,IN2,IN3 - разомкнут,OUT =0)
Всё работало, опрос всех 40 устройств около 8 секунд
На фото это устройство в работе.
- Вложения
-
- Adr1234_Out1.jpg
- (71.78 КБ) 447 скачиваний
- Сообщения: 1407
- Зарегистрирован: Вт июн 07, 2011 08:03:18
[uquote="goldenandy",url="/forum/viewtopic.php?p=3582696#p3582696"]Не путайте среду разработки и язык Си.[/uquote]
Не прокатит.( По крайней мере сразу. Там ведь не только Си. А в Codevision ассемблер отличный от GCC.
Не прокатит.( По крайней мере сразу. Там ведь не только Си. А в Codevision ассемблер отличный от GCC.
- Сообщения: 63
- Зарегистрирован: Пн дек 29, 2014 21:29:32
Да, похоже легче освоить Atmel Studio 7, чем перенести из него код...
[uquote="kuber",url="/forum/viewtopic.php?p=3582763#p3582763"]Всё работало, опрос всех 40 устройств около 8 секунд[/uquote]
Спасибо, но долговато как-то. Повоюем пока с уарт.
[uquote="kuber",url="/forum/viewtopic.php?p=3582763#p3582763"]Всё работало, опрос всех 40 устройств около 8 секунд[/uquote]
Спасибо, но долговато как-то. Повоюем пока с уарт.
- Сообщения: 1407
- Зарегистрирован: Вт июн 07, 2011 08:03:18
Студию можете не осваивать. Ставите WinAVR, берете простейший Makefile и вперёд. С любим редактором.
Второй вариант - переписываете асм секцию под CV. Третий - находите софтовый UART без асм. Четвёртый...)
Второй вариант - переписываете асм секцию под CV. Третий - находите софтовый UART без асм. Четвёртый...)
- Сообщения: 96
- Зарегистрирован: Ср сен 20, 2017 22:49:53
[uquote="Combatos",url="/forum/viewtopic.php?p=3570601#p3570601"]Есть такая задача : передать данные (напряжение каждой из 24 ячеек аккумулятора LiFePO4) с помощью 24 шт. ATtiny13A в один управляющий контроллер ATmega328P.[/uquote]А прямое измерение через делители с помощью АЦП с достаточной разрядностью вам не подходит?
Тогда проще освоить любой универсальный IDE (да хоть Eclipse) и любой универсальный toolchain (хоть тот же GNU make). По крайней мере это даст возможность делать проекты для гетерогенной среды. Иного пути я не знаю. Попробуйте в одном не универсальном IDE сделать проект, в котором совместно используются x86 (Linux/Windows), AVR, ARM и STM8 - тогда поймете о чем я веду речь.
- Сообщения: 1407
- Зарегистрирован: Вт июн 07, 2011 08:03:18
Ну, не все ж так высоко летают.) Со временем люди сами до этого доходят, если понадобится).
- Сообщения: 63
- Зарегистрирован: Пн дек 29, 2014 21:29:32
Люди добрые, господа хорошие программеры! Подскажите, что поменять в программе для работы на частоте тиньки 4,8 МГц. Простая замена строчки #define F_CPU 9600000UL на #define F_CPU 4800000UL и (перепрошивка фьюзов тиньки конечно не помогает). И что означает "UL"? Прога здесь:
https://github.com/Dolphin101546015/ATt ... ART/main.c
На 9,6 МГц UART работает на скорости 9600, но при напряжении питания больше 4В
https://github.com/Dolphin101546015/ATt ... ART/main.c
На 9,6 МГц UART работает на скорости 9600, но при напряжении питания больше 4В





