Jump to content

    

kool

Свой
  • Content Count

    256
  • Joined

  • Last visited

Community Reputation

0 Обычный

About kool

  • Rank
    Местный
  • Birthday 12/02/1979

Контакты

  • Сайт
    http://
  • ICQ
    275707581

Информация

  • Город
    Украина, г. Винница
  1. Насколько я помню, в этих аппнотах (вернее, в реализации) была проблема с тем, что если вызвать 2 сеанса передачи последовательно один за другим, то программа генерирует старт-условие на линии не дожидаясь завершения формирования стопа от предыдущего сеанса. Связано это с тем, что прерывание по приему TWI co статусом "stop received" приходит сразу как только обнаружен фронт на SDA ( при SCL=1), а не после фронта + tимп. Поэтому нужно после событие стопа на линии подождать tимп, а затем пробывать начать новую передачу. (уже подзабыл, чему должно быть равно tимп - 1/2 или 1/4 такта) З.Ы. Извиняюсь за немного сумбурное объяснение Update: Извините, не сразу вник в суть проблемы. Вы говорите, что Цитатарегистр r24, участвующий в операции сравнения меняется где-то в TWI-функциях (побочный эффект). Но там кроме r24 есть еще и Y+50. Может, у Вас просто память где-то портится.
  2. Цитатавосемь часов ожидания будут выглядить так... или так: Кодfor(int h = 0; h<8; h++) __delay_cycles(3600000000); Если контроллер других функций не выполняет, то при данном алгоритме абсолютно все равно, на чем делать задержки. Но для корректной работы Вашего алгоритма нужно передергивать питание почти каждый раз после изменения положения s1 (Для примера, рассмотрите ситуацию: ставим s1 на 7 ногу, включаем питание, и, скажем, через секунду, переводим s1 на 9ю ногу. Через 16 часов реле выключится на 8 часов, хотя при этом положение s1 показывает на "включено постоянно") Так что, как мне кажется, алгоритм придется все-таки поменять (хотя, может, все именно так и задуманно). По поводу схемы. Для корректной работы в железе придется либо притянуть ноги 7,8,9 резисторами к земле для обеспечения "0" на неподключенном выводе. Но, на мой взгляд, проще на этих выводах разрешить pull-up резисторы (DDR = 0, PORT = 1), а переключателем s1 коммутировать выводы на "землю". При этом на выбранном выводе будет лог. "0", на остальных - лог. "1". Соответственно, нужно подкорректировать условия ветвления в алгоритме.
  3. Сначала определитесь, чего конкретно хотите. А то изначально было 24 клавиши (вместо одного энкодера) которые нажимаются последовательно только одной головой. Потом появилось еще 40 энкодеров. А это уже около 960 клавиш. КАК вы будете их все различать даже если все это реализуете? ЦитатаДля справки: на каждую руку робота нужно не менее 7 энкодеров. Где столько мышей взять? Я подозреваю, что там же, где и клавиатуры. Хотя можно обойтись и одной. Такой , например
  4. Секундомер

    Порылся еще в нете и нашел схожую тему 5-летней давности на нашем же форуме: ATmega timer2 в асинхронном режиме. После прочтения темы посмотрел эррату на мегу128 - проблема до сих пор существует для всех ревизий кристалла от F до М. Ниже выдержка из эрраты: Цитата2. Interrupts may be lost when writing the timer registers in the asynchronous timer The interrupt will be lost if a timer register that is synchronous timer clock is written when the asynchronous Timer/Counter register (TCNTx) is 0x00. Problem Fix/Workaround Always check that the asynchronous Timer/Counter register neither have the value 0xFF nor 0x00 before writing to the asynchronous Timer Control Register (TCCRx), asynchronous Timer Counter Register (TCNTx), or asynchronous Output Compare Register (OCRx). В твоем коде воспользоваться данным воркэраундом не удастся (будет заметно подмигивание) Остается только посоветовать либо оставить все на 85Гц, либо отказаться от периодического изменения OCR: 1. настроить прескалер таймера на 1 2. Настроить таймер на режим CTC (автосброс при срабатывании output compare, WGM01 = 1, WGM00 = 0 ), в OCR занести значение (64-1). Таким образом, у нас прерывание про сравнению будет срабатывать с частотой 32768/64 == 512Гц. При каждом третьем входе в это прерывание выставлять флаг fl_Display (частота развертки 512/3/3==57Гц), а при каджом 512 входе - флаг fl_Second. 3. понятное дело, убрать обновление OCR0 из OUT_TIMER и отключить прерывание по переполнению. ЗЫ реинициализацию регистра count (если он останется после переделки) лучше осуществлять в самом прерывании. Это, конечно, +1 такт к прерыванию, но читабельность программы существенно улучшится.
  5. Секундомер

    Здравствуй, Илья С регистрами там вроде все нормально, а вот с работой с асинхронным таймером - на первый взгляд вроде как непорядок. После записи в любой из асинхронных регистров полагается подождать очитски соответствующего флога в ASSR. У тебя же она отсутствует после записи в OCR0. Но, с другой стороны, в OCR ты пишешь редко (реже, чем 2 такта часового кварца), поэтому с этим проблем быть не должно. Но поправить все же не мешало бы. КодOUT_TIMER:                 lsl    temp         outr    PORTC,temp         ld    temp,-Y         outr    PORTA,temp         inr    temp,TCNT0         subi    temp,-1; !!!! Если здесь поставить 2 - секундомер врёт         outr    OCR0,temp         rjmp    MAIN Остается только грешить на атмеловцев (хотя маловероятно) - на то, что при записи OCR странным образом сбивается прескалер таймера. Или на разводку платы - возможно, смена чатосты развертки изменила характер наводок на кварц и он начал нестабильно работать. Или же превышены допустимые токи по ногам питания/массы/не все ноги припаянны. А может, стоит попробывать сделать развертку на отдельном таймере? благо, у 128меги их еще есть.
  6. Между P и В подключается pекуперационный резистор, который будет задействован при подаче напряжения на 12 VinDB. Соответственно, напряжение подавать когда хотим затормозить двигатель после снятия всех других напряжений (VinX,Y,Z,U,V,W). Для защиты от выбросов между P и N (чем поближе) подключите снаббер из низкоиндуктивного пленочного конденсатора 0,1-1 мкФ с достаточным запасом по напряжению. Или другой тип снаббера. подробнее - тыц тыц
  7. адрес вектора TIMER0_COMPA_vect правильно указан? У таймера 0 вроде нет модулей сравнения А и В., он только один
  8. Посмотрите здесь. Там был похожий вопрос. Я уже отвечал на него (пост №11)
  9. ucGoZilla

    микросхема одна и та же, корпуса одинаковые. Производители только разные. Корпуса смотрите в документации производителя.
  10. USI I2C выбор частоты

    Вы хотя бы код проложили к сообщению. А то гадать "почему не работает" сложно. Хотя в модуле мастера TWI есть один подводный камень: Перед очередной посылкой условия "старт" нужно проверять, завершилось ли формирование на шине предыдущего условия "стоп", т.е. проверять бит TWSTO на равность "0". Так как контроллер устанавливает флаг TWINT сразу после того, как на шине началось формирование условия "стоп", не дожидаясь его завершения.
  11. ЦитатаНа вход /OE буфера будет подаваться логическое "НЕ И" из /CS и /WE Вы, скорее всего, имели ввиду логическое И-НЕ. Вернее, 2И-НЕ ЦитатаСтолько мучений, чтобы отвоевать у МК свободный пин Да уж. Здесь проще было бы взять камень побольше. В итоговом случае, возможно, все вышло бы дешевле, если разработка не серийная (учитывая стоимость места на ПП и затраченное время). Вы бы привели общую блок-схему устройства с кратким описанием. Может, совмесными усилиями и отвоевали бы пару-другую пинов для памяти. Или сами рассмотрите, например, возможность применения сдвиговых регистров с параллельным входом/выходом (74hc595, 74hc165, 74hc299...). Цитатапри чтении все-таки придется дергать /CS-ом, но синхронно с /WE а то, что это передергивание эквивалентно записи в память - не помешает?
  12. да, уменьшение выходного тока и, как следствие, снижение частоты/завалы фронтов при увеличении емкости нагрузки (количества подключенных входов)
  13. PWM для кулера

    я про один транзистор и пару резисторов..
  14. PWM для кулера

    ЦитатаОпять пару? ))) Вот и я о том же.. Я уж думал, что есть простое решение на одном транзисторе. (А с парой - это мы умеем ) Про пару резисторов тоже интересно. Как? Я не язвлю, просто интересно.
  15. Тогда самый простой вариант, если есть место на плате, - это поставить в разрыв на шину данных буфера резисторы по 330..500 Ом. Насчет длительности коллизий. Вроде как для 74AC374 максимальное время " Output Disable Time" при 3,3В составляет ~14.5 нс, а не 8,5