Перейти к содержанию
    

AndryG

Свой
  • Постов

    181
  • Зарегистрирован

  • Посещение

Весь контент AndryG


  1. Я не использовал никогда компилятора того (кажется там ИАР) ... вот и прошу общественность, если не трудно, поделится знаниями.
  2. PS2 keyboard

    Три варианта ... 1 одну линию генерить клоки .. к ней же подцепить RC-цепочку ... длинный клок - появится единица и на ДАТА... короткий клок - появится единица на ДАТА .. но это так ... фигня. (если чесно, то я думал, что можно два генератора запускать сразу - ошибся) 2 используйте возможность ВМЛАБа эмулировать несколько процов -- один из них пусть будет клавиатурой. 3 плюньте на эмуляцию клавы ... подключение клавиатуры - часть моего первого проект на контроллерах ... я клаву подключил за три дня ... на асме. Ничего там сложного - можно и руками подергать немного пины. Вы лучше писать начните ... чем эмуляцией заморачиваться ... тогда и вопросы толковые будут .. если будут. И ЕЩЕ ... <Xserial TTY(19200 8) PD0 PD2> -- это немного не то. Сейчас ВМЛАБ нет на компе .. вот выдрал с архива: P1 NRZ(600u) PD3 KEY_1 "111000010010101010101001001001001001001" + RESET "1" Это "типа передатчик ДУ SONY протокол SIRC" Попробуйте назначить на одну кнопку ДВА генератора на разные пины .. может пройдет .... тогда они будут запускаться одновременно - и получите то что хотите.
  3. PS2 keyboard

    Дык есть в ВМЛАБе "типа генератор любых последовательностей" ... Вы изучали его возможности?
  4. PS2 keyboard

    Чего подачи? после подачи питания клавиатура готова к работе ... я делал на at89c2051 вообще только прием данных -- даже кода для передачи в клаву небыло .. и работало всё.
  5. Позвольте разбавить тему немного ... упоминался здесь WAKE ... интересно узнать сколько места занимает его реализация в контроллере? Пробовал прицепить его к Tiny (своя реализация ... исходники на страничке протокола не компилил - юзаю CV)... получается, что только протоколом и заниматься ей -- маловато памяти (для кода) остается :-(
  6. Вопрос по WINAVR

    Почитал я ваши посты ... и поник ... как просто было с CV ... а тут :(
  7. Когда ключ -i стоял, то программа ругалась на ошибки в параметрах и не доходила до проверки драйвера. Программа ента (как и все консольные) будет просто моргать на экране ... если хочешь видеть, что программа на экране рисует - создай BAT-файл, в котором пропиши комманду вызова программы, а второй строкой поставь PAUSE -- тогда программа выполнится и окно не закроется -- сможете прочесть ошибки. У меня DLPORTIO ставится на машину частенько далеко не с первой попытки ... если проблемы с ним, то программа ругается именно на драйвер.
  8. Вопрос по WINAVR

    Хм! -mmcu вспоминается ... но почему ж тогда у меня ругается, что не определен контроллер ? Будем колупать дальше ... спасибо.
  9. Вопрос по WINAVR

    У меня релиз апреля(вроде) 2006 года ... таргет определяется в makefile ... но если в исходник не ставить хидер конкретного чипа, то комилятор ругается, что не определен тип микроконтроллера ... после добавления вышеуказанного куска в makefile мы добавляем define, по котрому io.h вставит нужный хидер нужного контроллера. Для многих это полная фигня, а для меня маленькая победа в освоении компилятора :-) вот и поделился радостью. А ключи ... да я имел ввиду описание опций вызова компилятора и линкера. То что они определяются в makefile - это здорово, но все же они упоминаются в "базовом" makefile.
  10. Вопрос по WINAVR

    повозился вчера с makefile от компилятора ... добавил в gcc -D__AVR_$(TARGET)__ -- теперь в коде можно вспоминать только хидер io.h , а "персональные" хидеры для контроллера теперь io.h вставит! Люди, а не поделится ли кто описанием ключей запуска на winavr на русском языке?
  11. Уже что-то ... :-) А кто что скажет, если определять "включеность" приемника и телека по уровню сигнала на их VIDEO-OUT ?? (и приемника тоже такой есть, вроде) ?? ___ P.S. Просто хочется сделать штуку без особой привязки к железу юзера -- воткнул пару проводков в телек да приемник и один пульт выбросил :-)
  12. Эх! Видать творили телек неприличные азиаты :) только IN/OUT video/audio на "тюльпанах". Может попробовать смотреть на напругу на видеовыходах и приемника и телека ... и если они разняться, то через некоторое время командами на телек приводить их в одинаковое состояние? Кто что про такой вариант скажет? На пультяшке приемника нет свободных кнопок... а если ловить ИК-команду выключения приемника и "дублировать" ее для телека ... можно запросто "разсинхронизироваться" - один выключается, а второй включается :-) обратная связь нужна! ... я так думаю.
  13. Не думаю, что универсальный пульт будет удобней оригинального ... и потом ... мне важен не только результат, но и процесс!
  14. Доброго времени суток. Закончил текущий проект - остался без "пищи для мозгов" ... и нашел следующую заморочку. Имеем телевизор (буржуйский, управляется пультяшкой) и спутниковый приемник на нем (тоже пультяшка имеется). Если хотим включить сие, то приходится брать ДВА пульта для включения телека и приемника, а затем используем только пульт приемника для ПОЛНОГО управления системой. Второй раз пультяшка телека нужна только для выключения ... я эту связку использовал только три дня (у тещи на пирогах), но и то успело задолбать ... вот и задачка: "нужно научить телевизор включаться и выключаться вместе с приемником." Дополнение:осмотр премника показал, что он имеем разъем DB-9 -- видать RS-232 ему не чужд. Пока в голову приходят варианты: найти "свободную" кнопку на пультяшке приемника и возле телевизора прицепить "ретранслятор", который перехватит сию кнопку и модифицирует ее в POWER телевизора. Минусов вижу несколько: "свободная" кнопка проблематична, запросто получаем "разсинхронизацию" от пролетающей мухи/ бегающего народа и т.д. В плюсы можно вставить полную отрешеность (гальваническую) от предметов управления. Второй вариант связать это всё в более тесную всязь. (вариаций здесь тьма - пока мало инфы "в деталях") И вот тут пошли вопросы: - пультяшка имеет одну кнопку POWER -> "инвертировать питания", а невстречаются ли, случаем, хитрые недокументированные команды POWER_ON & POWER_OFF ? - какой обычно сервис предоставляют "тарелочные приемники" через свой RS-232? Есть ли возможность им управлять или узнать его состояние? Не говорю модели устройств, ибо не знаю (пока) их ... и вопросы интересуют "в целом". Знаю только, что приемник обошелся с тарелкой около $200 Также интересны Ваши идеи.
  15. А как можно перелить ПО, не переливая константы. если они будут в проекте с ПО? Может разделить Вашу задачу на ТРИ части: загрузчик - залили и забыли константы - проект представляет из себя просто набор констант ПО - основная программа, в которой к константам обращаемся через указатели. Это я к чему .. просто порылся в CVAVR ... нашел параметр RESETVECTOR в файле проекта. Попробуйте сделать проект для меги16-загрузчик ... и посмотреть параметры в файле проекта ... может еще что найдете. А может вообще вынести константы с проекта и "набивать" их редактируя файл для прошивки? если константы должны изменятся юзерами ... может им простейшую программку-конфигуратор на комп надо? Если Ваш загрузчик пишет HEX файлы .. то этот конфигуратор может генерить небольшой HEX с нужными адресами ... или редактировать готовый файл ... конфигуратор получится элементарный ... в отдельном файле прописываем название параметра и адрес его в HEX. мало инфы ... давайте подробней о загрузчике и константах .. кто они и для кого.
  16. _____ P.S. Если вы возмущены, кто это недоделыш ... то спешу исправится ... он хорош ... для начала ... может я просто уже подрос немного .. вот он и кажется таким :) Загрузчик, видать, на своем месте ... константы ПЕРЕД загрузчиком.
  17. CVAVR недоделышь ... всё больше в этом убеждаюсь. Была заморочка ... делал так: В cvavr.exe заменяете avrasm2.exe на avrasm2.bat и рядом с ним кладете avrasm2.bat, в котором вызываете уже сам exe-файл ... этому батнику передается куча параметров ... Так вот. Из батника перед асмомо вызывал утилиту ... не помню названия, которая заменяла строки определенных коментов на нужные доп. асм-вставки ... получалось очень даже прикольно :) Но так я делал, ибо задачка была почти сделана и переписывать под другой компилятор было лень ... теперь вот WinAvr колупаю.
  18. :) начните текст warning-сообщения "MESSAGE..." -- большие буквы бросятся сразу в глаза и не насторожат :)
  19. Почитал я ветку ... и понял, что сейчас мне на орехи достанется :-) Меня в командировку сорвали - вот и не смог участвовать ... и кусок кода я с старой версии взял да поправил ... и предназначался он для ответа, "что такое делитель на 125" ... а с прерыванием протупил. Как тут писалось на форуме, тоже попался с "бит 3 & CTC" -> пришлось в даташит залазить. Для ясности приведу куски с рабочего проекта. Инициализация: TCCR0A=0x02; TCCR0B=0x04; TCNT0=0x00; OCR0A=0xF9; OCR0B=0x00; И само прерывание interrupt [TIM0_COMPA] void timer0_compa_isr(void) { times++; if (times < 125) goto tim0_ovf_ret; times = 0x00; realtime.s++; //--------------------------Секунда! new_second = 1; //конец новой секунды tim0_ovf_ret: } Почитав ветку, увидел такие точки зрения, которые мне бы и в голову никогда не пришли ... спасибо вам всем ... сейчас буду вчитываться, да пробовать. Прошу прощения за созданные неоднозначности.
  20. Спасибо всем за ответы. Вчера весь день был на объекте - не смог поучаствовать ... "Делитель на 125" ... это я про такой код: interrupt [TIM0_OVF] void timer0_ovf_isr(void){ //вызывается 125 Гц if (times < 125) goto tim0_ovf_ret; times = 0x00; realtime.s++; ... Вот сам теперь сижу и думаю, а правильно ли тут 125 стоит ... хотя тоже считал .. ошибка должна быть больше тогда... (хотя может наложилось это и кварц) И по Студии я не проверял работу делителя - точку останова ставил на прерывание, а не на строку после "делителя на 125" - у меня комп секунду эту гонять сутки будет. Кварц маркирован .... 8 000 кГц -- сам не помню откуда он. На счет конденсаторов идею подали -- поколупаю .. вот только бы знать в какую сторону ... может ссылка у кого есть? И опять я уезжаю на весь день -- завтра обязательно подключусь.
  21. Если есть $error, то можно предположить, что есть и #warning
  22. Tiny2313 нужна 1 сек. на таймер 0

    Доброго времени суток. Контроллер - Tiny2313 Частота - 8МГц Компилятор - CVAVR 1.25.2b1 Одна из функций устройства - подсчет текущего времени. Используется таймер 0 (второй уже недоступен). Прерывание по совпадению и автоматическая очистка счетчика при условии сравнения. С предделителем 256 получаю частоту прерыания ровно 125Гц (64000 тактов) И в прерывании делитель ставлю на 125. Вроде всё верно, но за 8,5 часов часики удрали на 4 секунды :( Устройство активно работает с внутренней EEPROM. Вот тут и начинаются вопросы ... - если прерывание таймера возникает при их глобальном запрещении, или выполнении "длинных" команд, то прерывание вызовется с задержкой ... сбивается ли при этом счетчик циклов в таймере? - кто что может посоветовать? _____ P.S. Запскал HEX в Студии ... ставлю точку останова на вектор прерывания ... прерывание вызывается каждые 64000 такта ... почти всегда, иногда выскакивает 64001 или 64002 - видать из-за длительных команд ... но потом всё выравнимается. Правда симуляцию я запускал максимум на секунду - на моем компе на это около 30 минут :-) А может это такая точность кварца? Слабо верится. Да! фузы верно настроены - проверял уже.
  23. первое не учитывать ... тогда ДО ОСНОВНОГО ЦИКЛА инициализируйте АЦП, запустите преобразование и забудьте о его результате ... а потом только запускайте на преобразование без инициализации. Мониторить синусоиду ... не вижу по коду как это происходит ... А!!! дошло! Проморгал идею постоянного преобразования в течении нескольких периодов. Ну .... тогда мой код нужно немного поправить, думаю справитесь, основная идея ... не используйте adc_data и adc_data_max ... считывайте значение в adc_data ... и сравнивайте с U , если adc_data больше U, то запишите в него adc_data .... и уже потом (при выводе) если нужно, то U умножайте. так избавитесь от лишних телодвижений с adc_data_max ЖДУ РЕЗУЛЬТАТ .... интересно :)
  24. Ну раз всего проекта нет, то давай по кускам .... расскажу, что я надумал .. а Вы уж проверяйте - Вы проект пишете, а я только на код смотрю. Повторюсь ... я не вникаю в алгоритм ... так-что смотрите внимательно. if (ACSR==0x4C) m++; if (ACSR==0x4F) { if (a==0) { TCCR0 = 0x02; //start timer, делитель на 8, 1 тик = 1 мкС a=1;//признак включенного таймера } else { TCCR0 = 0x00; //stop timer a=0;//признак выключенного таймера b=1;//признак завершения измерения периода }; }; Судя по коду ACSR принимает только два значения ... значит можно проверять только один бит байта, который принимает разные значения. if (ACSR & 0x01){}else{} вместо двух if. Выигрыш в проверки одного бита вместо двух сравнений чисел. Изм. периода. Идея ... насколько понял ... нач. условие: таймер выключен, счетчик сброшен, b==0. первое прерывание - запускаем таймер второе прерывание - останавливаем таймер и поднимаем флаг b Вопрос: "для чего вы в А дублируете состояние таймера? Проверяйте if(TCCR0 & 0x02 )" Второй вопрос: "зачем вам знать, включен он или нет" ... может вместо "если включен, то выключить, иначе включить" .. просто написать "изменить состояние" => TCCR0 ^ 0x02; ... если правильно поставить нач. условия, то всё отработает красиво. interrupt [ANA_COMP] void ana_comp_isr(void) { //а если ACSR=0x4C то считаем к-во прерываний //Если ACSR=0x4F то считаем период, if (ACSR & 0x01) // (ACSR==0x4F) { TCCR0 = TCCR0 ^ 0x02; // переключили таймер if (!(TCCR0 & 0x02)) //если таймер выключен - значит подсчет закончен b=1;//признак завершения измерения периода } else // (ACSR==0x4C) m++; } ЗАПОМНИЛИ .... в осн. цикле нужно инициализировать B, TCCR0, ACSR, TCNT0 // *** БЛОК ПРОВЕРКИ ПОСТОЯННОЕ-ПЕРЕМЕННОЕ *** // Interrupt on Output Toggle (прерываемся при любом изменении состояния компаратора) ACSR=0x4C; // Global enable interrupts #asm("sei") delay_ms(45); //время проведения измерения #asm("cli") //выключаем прерывания чтоб не отвлекать АЛУ if (m>=3) //если зарегистрировано 3 и больше перепадов за 45 мс, то считаем что //меряем переменку { ACDC=1; //устанавливаем признак переменки m=0; //обнуляем счетчик } else { ACDC=0; //устанавливаем признак постоянки m=0; //обнуляем счетчик }; Тут всё просто. // *** БЛОК ПРОВЕРКИ ПОСТОЯННОЕ-ПЕРЕМЕННОЕ *** ACSR=0x4C; //(прерываемся при любом изменении состояния компаратора) m = 0; //это дело обнулим одо его подсчета .. кстати .. зачем ДВА раза это писать. #asm("sei") delay_ms(45); //время проведения измерения #asm("cli") //выключаем прерывания чтоб не отвлекать АЛУ ACDC = 0; // такой вариант вместо if-else дает выигрыш в слово :) if (m>4) ACDC = 1; дальше ... ___ P.S. А как же ТВОРЧЕСТВО ?! :-) // *** БЛОК ИЗМЕРЕНИЯ ПЕРИОДА *** ACSR=0x4F; b = 0; TCNT0 = 0; #asm("sei") while (!b); //точно не помню, но CVAVR при ( ==0) умудряется ставить сравнение с константой #asm("cli") F=1/TCNT0*1000000; //вычисляем значение частоты ВОТ ЗДЕСЬ БОЛЬШАЯ ПОТЕРЯ!!! но это уже нужно алгоритм крутить. а не код оптимизировать ACSR.7=0; По блоку измерения напруги ... опишите словами .. зачем два измерения ... Вы так интересно закрутили флагами и переменными, не хочу въежать ... и потом ... зачем Вам здесь вообще прерывание? Всё равно Вы сидите delay_ms(50) -- ждете, пока отработают прерывания Можно в главном цикле просто мониторить флаг окончания преобразования ... какой выигрыш: нет процедуры прерывания, нет delay_ms(50) И еще ... в CVAVR по умолчанию сохраняет все регистры при переходе на прерывание ... уже не помню, посмотрите в справке. помойму он сохраняет регистры, которые и так не использует никогда - это тоже слов 20 даст размера. ну и с индикацией тоже не ясно, что используется и т.д. .. посему посоветовать ничего не могу. Пробуйте - поведаете насколько получилось сжать и сколько еще нужно :-) ____ P.S. Вариант с измерением напряжения без прерывания ADC ADMUX=ADC_VREF_TYPE; ADCSR=0xCE;//включить АЦП, начать преобразование while (пока не закончилось преобразование - флаг не помню) adc_data =ADCW; ADCSR.6=1; //запустить преобразование while (пока не закончилось преобразование - флаг не помню) U=ADCW; while (пока не закончилось преобразование - флаг не помню) if (adc_data > U) U = adc_data; if (ACDC==1) U = U/1.414; //!!!!!!!!!!!!!!!!!!!!! U -> целое!!! И что мы получим? // прерывание ADС, c, adc_data_max убрать за ненадобностью. ______ P.P.S U => точно надо с знаком INT ... может UNSIGNED CHAR подойдет? Проверьте типы переменных ... если не нужен знак - перейдите на беззнаковые переменные
  25. :-) Ну! сжать сишную прогу на пару десятков слов всегда можно ... теперь по каждой строке пробежаться, да мелочевку поправить. :-) Плюс выше приведенный пост ... поздравляю Вас с решением задачки. Ну а если не получится ужать - если можно, то код в студию ... ужмем коллективно :-)
×
×
  • Создать...