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

kool

Свой
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о kool

  • Звание
    Местный
    Местный
  • День рождения 02.12.1979

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Насколько я помню, в этих аппнотах (вернее, в реализации) была проблема с тем, что если вызвать 2 сеанса передачи последовательно один за другим, то программа генерирует старт-условие на линии не дожидаясь завершения формирования стопа от предыдущего сеанса. Связано это с тем, что прерывание по приему TWI co статусом "stop received" приходит сразу как только обнаружен фронт на SDA ( при SCL=1), а не после фронта + tимп. Поэтому нужно после событие стопа на линии подождать tимп, а затем пробывать начать новую передачу. (уже подзабыл, чему должно быть равно tимп - 1/2 или 1/4 такта) З.Ы. Извиняюсь за немного сумбурное объяснение Update: Извините, не сразу вник в суть проблемы. Вы говорите, что Но там кроме 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 клавиш. КАК вы будете их все различать даже если все это реализуете? Я подозреваю, что там же, где и клавиатуры. Хотя можно обойтись и одной. Такой , например :)
  4. Порылся еще в нете и нашел схожую тему 5-летней давности на нашем же форуме: ATmega timer2 в асинхронном режиме. После прочтения темы посмотрел эррату на мегу128 - проблема до сих пор существует для всех ревизий кристалла от F до М. Ниже выдержка из эрраты: В твоем коде воспользоваться данным воркэраундом не удастся (будет заметно подмигивание) Остается только посоветовать либо оставить все на 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. Вы, скорее всего, имели ввиду логическое И-НЕ. Вернее, 2И-НЕ Да уж. Здесь проще было бы взять камень побольше. В итоговом случае, возможно, все вышло бы дешевле, если разработка не серийная (учитывая стоимость места на ПП и затраченное время). Вы бы привели общую блок-схему устройства с кратким описанием. Может, совмесными усилиями и отвоевали бы пару-другую пинов для памяти. Или сами рассмотрите, например, возможность применения сдвиговых регистров с параллельным входом/выходом (74hc595, 74hc165, 74hc299...). а то, что это передергивание эквивалентно записи в память - не помешает?
  12. да, уменьшение выходного тока и, как следствие, снижение частоты/завалы фронтов при увеличении емкости нагрузки (количества подключенных входов)
  13. я про один транзистор и пару резисторов..
  14. Вот и я о том же.. Я уж думал, что есть простое решение на одном транзисторе. (А с парой - это мы умеем :disco: ) Про пару резисторов тоже интересно. Как? Я не язвлю, просто интересно.
  15. Тогда самый простой вариант, если есть место на плате, - это поставить в разрыв на шину данных буфера резисторы по 330..500 Ом. Насчет длительности коллизий. Вроде как для 74AC374 максимальное время " Output Disable Time" при 3,3В составляет ~14.5 нс, а не 8,5
×
×
  • Создать...