Палыч 6 3 июня, 2015 Опубликовано 3 июня, 2015 · Жалоба Охренеть можно , как Си "пахабит" благороднейший asm Это Вы ещё не видели код, сгенерированный с выключенной оптимизацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ae_ 2 3 июня, 2015 Опубликовано 3 июня, 2015 · Жалоба Охренеть можно , как Си "пахабит" благороднейший asm lds R16,PORTG ori R16,0x01 sts PORTG,R16 ldi r30, 0x65; 101 ldi r31, 0x00; 0 ld r24, Z ori r24, 0x01; 1 st Z, r24 Лишь 3 строчки вместо 5, вроде бы компактнее, быстрее… но в памяти занимает те же 5 слов, выполнение — 5 тактов и там, и там. Минус — в дополнительном использовании Z регистра, но если работать не только с одним портом, но и +63 соседними адресами тоже, то минус становится плюсом: в Z единожды загружаем базовый адрес, а при обращении к соседним адресам используется смещение Z+n .equ base=0x60 .def temp=R16 ldi ZL, low(base) ldi ZH, high(base) ldd temp, Z+(PORTF-base) ori temp, 0x01; PORTF |= 1 std Z+(PORTF-base), temp ldd temp, Z+(PORTG-base) ori temp, 0x03; PORTG |= 3 std Z+(PORTG-base), temp Такое решение уже для двух портов будет и короче, и быстрее. Если я не ошибаюсь, компиляторы умеют такое делать самостоятельно, если адреса/переменные расположены рядом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ydaloj 0 17 июня, 2015 Опубликовано 17 июня, 2015 (изменено) · Жалоба вот теперь у меня проблема с таймером0 мне надо, чтобы 10 раз в секунду у него вызывалось прерывание ldi tmp,0 out ASSR,tmp out TCNT0,tmp ldi tmp,0x60 out OCR0,tmp ldi tmp,0x0F out TCCR0,tmp ldi tmp,0x02 out TIMSK,tmp ldi tmp,high(RamEnd) out SPH,tmp ldi tmp,low(RamEnd) out SPL,tmp sei соответственно, в его обработчике лежит TIMER0_COMP: in sreg_tmp,SREG push tmp бла-бла-бла некоторые действия pop tmp out SREG,sreg_tmp reti И вот эти действия в обработчике выполняются через ж. Вернее, не выполняются. В портах - ересь. Эти же действия, выполненные в теле программы, работают без ошибок. Значит, у меня подозрение на настройку таймера или его компаратора. Что можно (или нужно) сделать? Изменено 17 июня, 2015 пользователем Ydaloj Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 17 июня, 2015 Опубликовано 17 июня, 2015 · Жалоба pop tmp out SREG,sreg_tmp reti А в основной программе регистр sreg_tmp не используется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ydaloj 0 19 июня, 2015 Опубликовано 19 июня, 2015 (изменено) · Жалоба Сергей Борщ, sreg нигде больше не используется. sreg_tmp тоже. --- мне сложно объяснять причину таких вещей. я нутром-то чую, что это наверное я сам что-то делаю не так, но... проблема решилась наистраннейшим образом в разделе .dseg был объявлен десяток переменных в ОЗУ с выделением байта под каждую. я одну из переменных в этом списке перенёс в конец списка. и всё. заработало. тут наверное вспышки на солнце виноваты. Ну да ладно. Следующая проблема. У меня их много - я дуб в микроконтроллерах, а работать надо. Итак. Есть основной цикл, в нём эти переменные крутятся-вертятся, обрабатываются. 10 раз в секунду вызывается разносчик пиццы обработчик прерывания таймера, который собирает все эти переменные и толкает их по портам. Это всё работало, до вчера. Программа пишется под мегу128. Пришлось (по некоторым причинам) заменить её на мегу128А. И теперь, каждый раз после обработки прерывания, ВСЕ переменные обнуляются. Как лечить? УРА, решил - при прошивке отключил Watchdog Изменено 19 июня, 2015 пользователем Ydaloj Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 19 июня, 2015 Опубликовано 19 июня, 2015 · Жалоба Как лечить? Мегу 128 на ассемблере программировать гиблое дело. Возьмите WinAvr или ещё чего и будет Вам счастье Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 23 июня, 2015 Опубликовано 23 июня, 2015 · Жалоба Мегу 128 на ассемблере программировать гиблое дело. Глупость Вы написали! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
АлександрК 0 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба Цитата(mcheb @ Jun 19 2015, 17:00) Мегу 128 на ассемблере программировать гиблое дело. Глупость Вы написали! Согласен. Я для своих задач использую ассемблер: просто и понятно. А может у меня задачи такие? . В AVRStudio можно прогнать и посмотреть где программа сворачивает не туда. А если проганять прогр на С или др языке, то как узнать какими командами расписана та или иная функция? И туда ли свернула программа? А чужие библиотеки! Кто и как их писал и как они работают? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться