Jump to content

uuu2

Members
  • Content Count

    18
  • Joined

  • Last visited

Community Reputation

1 Обычный

About uuu2

  • Rank
    Новенький
  1. Идея заключается в том, чтобы внутри корпуса ЛА разместить компрессор (винт?), который бы нагнетал воздух в солпа и тем самым удерживал ЛА в воздухе. Смысл заключается в том, чтобы: а) ЛА был более безопасным (винт не мог задеть при полёте какие-либо предметы) б) улучшилась управляемость (ведь можно изменять углы наклона сопел, а также поток воздуха с помощью клапанов) Насколько это реально? Что скажут товарищи конструкторы-моделисты?
  2. Я не хочу устраивать философский диспут на тему кодирования и шифрования. Задача заключается в том, чтобы передавать видеосигнал по обычному каналу, который способен принять обычный телевизор. Только "посторонние телевизоры" должны показывать неразборчивый шум. А мой телевизор (антенна которого подключена через декодер) должен показывать нормальное ч/б изображение. Так понятно объяснил? Докторская диссертация тут не нужна. Есть куча аналоговых телеканалов, которые вещают именно таким образом (кодированным сигналом). Точнее были - сейчас всё перевелось на цифру. Но особой технической сложности тут нет. Только нужна соответствующая микросхема, которая наверняка существует.
  3. Я в этом не сомневаюсь. По теме что-нибудь будет сообщить?
  4. Необходимо передать с камеры шированный видеосигнал. При этом, для приёма сигнала будет использоваться ноутбук с тюнером. Поэтому шифровать/расшифровывать придётся ВЧ-сигнал на антенном тракте. По-видимому, к антенне надо подключить "переходник", который будет управляться микросхемой, сдвигающей частоту в соответствии с "ключом". Либо, я не знаю, - делать собственный тюнер? Вообще, есть какие-то существующие решения? Микросхемы с подобной функциональностью?
  5. void USART_vSendByte(unsigned short int u8Data) { // Wait if a byte is being transmitted while((UCSR0A&(1<<UDRE0)) == 0); // Transmit data UDR0 = u8Data; } void BootFlashPage(uint32_t page, uint8_t *buf){ uint16_t i; uint16_t Data; boot_page_erase(page); // стирание страницы boot_spm_busy_wait(); // ждать окончание стирания for(i = 0; i < BootPageSize; i += 2){ Data = *buf++; // формирование слова данных Data = (Data<<8) | (*buf++); // формирование слова данных boot_page_fill(page+i, Data); // записать в буфер bootloader-а // USART_vSendByte(*buf); } boot_page_write(page); // запись страницы во FLASH boot_spm_busy_wait(); // ждать окончания записи } Вызываю продедуру самопрограммирования: BootFlashPage(page,buffer). Появляются следующие странные глюки: 1) при "page=0" всё программируется нормально 2) при "page=64" (программирую вторую страницу) вместо данных из буфере в память грузится 0xFFFF, т.е. данные только лишь стираются 3) однако, если ввести "page=64" и раскомментировать строку "USART_vSendByte(*buf);", то всё, опять же, программируется нормально; только непонятно, при чём тут USART? 4) если программировать последнюю не до конца заполненную страницу (например, я прошил программатором код из 10 страниц, в последней странице не 32 слова, а только 3), то при самопрограммировании в память из буфера (buffer) заносятся только те данные, которые во флэш-памяти не равны 0xFFFF. Например: флэш-память (до самопрограммирования) 0x64F3 0x8d72 0x1ee8 0xffff 0xffff 0xffff ... буфер (buffer) 0x0001 0x0002 0x0003 0x0004 0x0005 0x0006 ... результат (после самопрогр.) 0x0001 0x0002 0x0003 0xffff 0xffff 0xffff ...
  6. Так я и пытаюсь сейчас написать всю прогу на ASM, но не компилится ничего. На сях компилится, на ассемблере -нет. Да и потом, это я пишу "учебный" загрузчик для atmega48. А реально будет схема на atmega128 с довольно сложным кодом. Писать накой объём кода на ассемблере - гм...
  7. А как на сях указать адрес загрузки отдельной процедуры? Чтобы основной код был прошит по адресу 0x000, а вот эта процедура (загрузчик) - по адресу 0xf00. Во-вторых, у меня только 256 байт (128 слов) т.е.разумнее (экономичнее) писать загрузчик на ассемблере.
  8. С ассемблерными командами я разобрался - там ничего сложного. У меня не получается скомпилить ассемблерный код в WinAVR/gcc. Во первых, не подключаются файлы с константами. #include <avr/io.h> - при таком объявлении avr-gcc пишет, что значения не определены. .include "avr/io.h" - ругается, что такого файла нет .include "iom48р.h" (скопировал в папку с проектом) - "значения не определены" Попробовал ещё сделать так: .include "iom48р.inc" (откопал ассемблерный заголовочный файл) - выдаёт кучу ошибок: 1) gcc не понимает ".equ test_const = R20". При исправлении на ".equ test_const, R20" - понимает. А вот AVR Studio понимает наоборот (почему?) 2) не понимает конструкции ".def" 3) пишет ошибку в "ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN)", говоря, что регистр должен быть старше 15-го. При этом ранее объявлено ".equ spmcrval, R20". Т.е. соответствия констант ассемблер не понимает. Если написать " ldi R20, (1<<RWWSRE) | (1<<SPMEN)", то ошибка исчезает. Во-вторых, проблема с взаимодействием си и ассемблера. Надо, чтобы разные участки кода пользовались одними константами и переменными. Дублировать их специально для си и специально для ассемблера (используя разный синтаксис) - это бред. ---------------- Что касается задачи, то сейчас я пытаюсь сначала сделать весь код на ассемблере и разместить его в boot-секторе. Программа последовательно считывает байты по UART, при прочтении байтов 0x55, 0x55, 0x55 (команда на программирование) считываются следующие 64 байта, заносятся в ОЗУ, прошиваются в первую страницу флэш-памяти.
  9. Умное оружие - это такая штука, которая заявит: "не хочу я никуда стрелять и никого бомбить; если у вас, идиотов, руки чешутся, то набейте друг другу морды"
  10. Как юзать в ассемблерном файле ("test.s") константы? Компилятор их не видит. Эти варианты подключения не катят: #include <avr/io.h> .include "avr/io.h"
  11. Если у кого-нибудь тут есть сабжевый код - запостите, пожалуйста, для примера. А то я уже замучался. Конкретная задача такая: должен быть основной код на С, а в boot-секторе будет ассемблерный загрузчик (для самопрограммирования). Плюс (возможно) ещё несколько ассемблерных процедур. Программирую в WinAVR (gcc 4.3.2). Т.е. сишный код должен быть по адресу 0x000, а ассмеблерный - по адресу BOOTSTART: .equ PAGESIZEB = PAGESIZE*2; установка пост.значения .org BOOTSTART; адрес boot-сектора Write_page: ldi spmcrval, (1<<PGERS) | (1<<SPMEN); page erase; константу в регистр call Do_spm ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN); re-enable the RWW section; константу в регистр call Do_spm ; transfer data from RAM to Flash page buffer ldi looplo, low(PAGESIZEB);init loop variable ldi loophi, high(PAGESIZEB);not required for PAGESIZEB<=256 Wrloop: ld r0, Y+ ld r1, Y+ ldi spmcrval, (1<<SPMEN); константу в регистр call Do_spm adiw ZH:ZL, 2;Сложить константу и слово Rdh:Rdl = Rdh:Rdl + K6 sbiw loophi:looplo, 2;use subi for PAGESIZEB<=256;sbiw - Вычесть конст. из слова Rdh:Rdl = Rdh:Rdl - K6 brne Wrloop;Перейти если не равно if(Z==0) PC = PC + k + 1 ; execute page write subi ZL, low(PAGESIZEB);restore pointer; Вычитание константы Rd = Rd - K8 sbci ZH, high(PAGESIZEB);not req for PAGESIZEB<=256; Вычитание константы с переносом Rd = Rd - K8 - C ldi spmcrval, (1<<PGWRT) | (1<<SPMEN); константу в регистр call Do_spm ; re-enable the RWW section ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN); константу в регистр call Do_spm Return: in temp1, SPMCR sbrs temp1, RWWSB; If RWWSB is set, the RWW section is not ready yet ; Пропустить если бит в регистре установлен ret ; re-enable the RWW section ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN); константу в регистр call Do_spm rjmp Return Do_spm: ; check for previous SPM complete Wait_spm: in temp1, SPMCR; Чтение порта sbrc temp1, SPMEN; Пропустить если бит в регистре очищен rjmp Wait_spm ; input: spmcrval determines SPM action disable interrupts if enabled, store status in temp2, SREG; Чтение порта cli;Очистить флаг прерываний ; check that no EEPROM write access is present Wait_ee: sbic EECR, EEWE; Пропустить если бит в порту очищен rjmp Wait_ee ; SPM timed sequence out SPMCR, spmcrval;Запись в порт spm ; restore SREG (to enable interrupts if originally enabled) out SREG, temp2 ret Я ещё пробовал сделать весь проект на ASM (File->New->Avr assembler), но gcc ругается на какой-то elf-файл ("no rule to make target test.elf").
  12. Объясните насчёт транзистора. Когда транзистор НЕ установлен на плату, то напряжение на коллекторном входе (на плате) 12.3 вольт; на входе базы - 1.3 вольт; на эмиттере, ессно, 0. При установке транзистора на базе образуется 0.8 вольт; на эмиттере - 0.7 вольт. Почему? Куда деваются 12 вольт? Сопротивление R5 мало по сравнению с R2, на нём должно повиснуть маленькое напряжение (как я понял, R5/R2 выполняют роль делителя). Кроме того, ток в точке А близок к нулю (0.1 мА). Это противоречит инструкции к схеме: Распиновка вроде определена правильно (прозвонка база-коллектор даёт 0.547, база-эмиттер 0.609).
  13. > А вообще с автора причитается большая информация по своей задумке. Задумка следующая. Имеется ноутбук и подключенная к нему (по USB) плата с радиомодулем. Имеется группа (10 штук) одинаковых устройств (роботов). Все это располагается на открытом полигоне. В ходе испытаний часто хочется что-то поменять в прошивке роботов. Бегать за ними и программировать обычным программатором - глупо. Поэтому логично программировать их по радиоканалу. Алгоритм следующий: управляющая программа (на ПК) посылает роботу (с таким-то ID) команду на прошивку. МК робота пеерводит радиомодуль на режим наименьшей скорости (для уменьшения вероятности ошибки) и передаёт управление загрузчику (или внешнему МК). Загрузчик передаёт ПК сообщение о готовности к приёму кода и постранично получает код, проверяя контрольную сумму. После чего прошивает себя. Насчёт стоимости компонентов. Внешний контроллер тут нужен не самый мощный. Atmega48 сгодится - это около 100 рублей. Внешняя флэш-память у роботов будет порядка десятка мегабайт (для сохранения телеметрии) т.е. выделить 128 кб для временного хранения полученного кода не так сложно.
  14. Почему мертвым? Загрузчик (после передачи ему управления) получает код программы. Если в течение 10 минут код не передан (или передан не полностью, или передан с ошибочной контрольной суммой), загрузчик передаёт управление основному коду (старому). Если за 10 минут код передан успешно, загрузчик прошивает МК и передаёт управление уже новому коду.
  15. Приблизительно решение я вижу так. Есть "главный" МК, который надо удалённо программировать. Есть "программирующий" МК, в который зашивается (не удалённо) программирующая программа, которая при поступлении команды по радиоканалу выполняет следующие действия: 1) переводит главный МК в режим программирования 2) "захватывает" радиомодуль 3) настраивает радиомодуль (выставляет минимальную скорость) 4) принимает по радиоканалу код программы, проверяет контрольную сумму 5) прошивает главный МК 6) отправляет сообщение об успешной прошивке 7) переводит главный МК в обычный режим Главный чип - atmega128. Программирующий - atmega48 (?). Но не понятно, как это реализовать. Есть где-нибудь готовый код для такого "встроенного" программатора? Чтобы один чип запрограммировал другой?
×
×
  • Create New...