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

AVR Studio ругается на порты F и G, mega128

Охренеть можно , как Си "пахабит" благороднейший asm

Это Вы ещё не видели код, сгенерированный с выключенной оптимизацией.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Охренеть можно , как Си "пахабит" благороднейший 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

Такое решение уже для двух портов будет и короче, и быстрее.

Если я не ошибаюсь, компиляторы умеют такое делать самостоятельно, если адреса/переменные расположены рядом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот теперь у меня проблема с таймером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

И вот эти действия в обработчике выполняются через ж. Вернее, не выполняются. В портах - ересь.

Эти же действия, выполненные в теле программы, работают без ошибок. Значит, у меня подозрение на настройку таймера или его компаратора.

Что можно (или нужно) сделать?

Изменено пользователем Ydaloj

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    
    pop tmp
    out SREG,sreg_tmp
reti

А в основной программе регистр sreg_tmp не используется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей Борщ, sreg нигде больше не используется. sreg_tmp тоже.

 

---

мне сложно объяснять причину таких вещей. я нутром-то чую, что это наверное я сам что-то делаю не так, но...

 

проблема решилась наистраннейшим образом

в разделе .dseg был объявлен десяток переменных в ОЗУ с выделением байта под каждую.

я одну из переменных в этом списке перенёс в конец списка. и всё. заработало.

тут наверное вспышки на солнце виноваты.

 

Ну да ладно.

 

Следующая проблема. У меня их много - я дуб в микроконтроллерах, а работать надо.

Итак. Есть основной цикл, в нём эти переменные крутятся-вертятся, обрабатываются. 10 раз в секунду вызывается разносчик пиццы обработчик прерывания таймера, который собирает все эти переменные и толкает их по портам. Это всё работало, до вчера.

Программа пишется под мегу128. Пришлось (по некоторым причинам) заменить её на мегу128А. И теперь, каждый раз после обработки прерывания, ВСЕ переменные обнуляются.

 

Как лечить?

 

УРА, решил - при прошивке отключил Watchdog

Изменено пользователем Ydaloj

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как лечить?

Мегу 128 на ассемблере программировать гиблое дело. Возьмите WinAvr или ещё чего и будет Вам счастье

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата(mcheb @ Jun 19 2015, 17:00)

Мегу 128 на ассемблере программировать гиблое дело.

Глупость Вы написали!

Согласен. Я для своих задач использую ассемблер: просто и понятно. А может у меня задачи такие? :biggrin:. В AVRStudio можно прогнать и посмотреть где программа сворачивает не туда. А если проганять прогр на С или др языке, то как узнать какими командами расписана та или иная функция? И туда ли свернула программа? А чужие библиотеки! Кто и как их писал и как они работают?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...