|
AVR Studio ругается на порты F и G, mega128 |
|
|
|
May 26 2015, 12:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 879
Регистрация: 20-06-11
Из: Карелия, Петрозаводск
Пользователь №: 65 799

|
Цитата Если на ассемблере, то, надеюсь Вы в курсе, что команды IN/OUT для доступа к этим регистрам не применимы Это только к ассемблеру относится?
--------------------
путь наименьшего сопротивления проходит по пути наитолстого провода (с)
|
|
|
|
|
May 26 2015, 13:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 879
Регистрация: 20-06-11
Из: Карелия, Петрозаводск
Пользователь №: 65 799

|
Upd: проект на Mega128 с компилятором AVR GCC тоже не позволяет работать с портами F и G командами I/O с портами А...Е такой фигни нет - сразу определены адреса и доступ есть Xenia, я до фузов не дошёл ещё - у меня пустой лист, даже без программы. А доступа уже нет. При попытке настроить порты, А...Е настраиваются, а про F и G компилятор ругается \\_PROGRAM\AVRStudio\MAIN.asm(71): error: Operand 1 out of range: 0x61
Прикрепленные изображения
--------------------
путь наименьшего сопротивления проходит по пути наитолстого провода (с)
|
|
|
|
|
May 26 2015, 14:12
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(Палыч @ May 26 2015, 17:19)  Инженеры Atmel'а при проектировании микроконтроллеров AVR когда-то совершили стратегическую ошибку - отвели под область ввода-вывода слишком маленькое пространство адресов. Очень скоро количество регистров ввода-вывода в отдельных AVR стало превышать адресное пространство области ввода-вывода. Некоторые регистры ввода-вывода стали размещаться за пределами области ввода-вывода - команды IN/OUT для таких регистров применять нельзя. В командах IN и OUT для адреса/номера регистра ввода-вывода есть всего лишь 6 бит. Именно потому эти команды не могут охватить более 64 регистров. К остальным же приходится обращаться (читать или писать), как к памяти, а не через инструкции IN и OUT. Ругать инженеров Atmel'а за непредусмотрительность глупо, т.к. в одном слове больше места не выкроишь. Ведь там же еще и номер регистра общего назначения находится, в который IN читает, а OUT пишет. Т.е. проблема тут отнюдь не в том, что памяти отвели мало, а в том, что в 16-разрядную инструкцию (тогда еще 32-разрядных не было) длинное число не засунешь. Тогда как для инструкций IN и OUT таких чисел надо сразу два. Делать инструкции IN и OUT двубайтными "инженеры" остереглись, т.к. тогда бы и выполнялась такая инструкция за два такта, а не за один. А это могло стать очень существенной потерей для архитектуры AVR, т.к. свое место под солнцем она отвоевала именно благодаря выполнению большинства инструкций за 1 такт, чем и замогилила  51-ю архитектуру. Кстати, раз уж разговор об этом зашел, замечу, что у Х-Мег (у которых разных регистров видимо-невидимо) есть, так называемый, "виртуальный порт". Это что-то вроде окошка, накладываемого на любой из портов, внутри которого действуют команды IN и OUT. Т.е. идея тут такова, что если требуется настолько быстрый ввод-вывод, что становится существенным, за сколько тактов он выполяется, то используемый порт совмещают с виртуальным, а дальше работают на вируальном порте однотактовыми командами IN и OUT.
|
|
|
|
|
May 28 2015, 09:59
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 14-02-10
Пользователь №: 55 490

|
Цитата(RA9YSS @ May 28 2015, 13:39)  А никто не подскажет мануальчик, как работать с портом G на Си, проблема таже что и у Ydaloj, студия 4.19  Компилятор знает об отличиях портов, смотрите: Код #include <avr/io.h>
int main ( void ) { PORTA |= 0x01; PORTG |= 0x01; } превращается в Код int main ( void ) { PORTA |= 0x01; be: d8 9a sbi 0x1b, 0; 27 PORTG |= 0x01; c0: e5 e6 ldi r30, 0x65; 101 c2: f0 e0 ldi r31, 0x00; 0 c4: 80 81 ld r24, Z c6: 81 60 ori r24, 0x01; 1 c8: 80 83 st Z, r24 }
--------------------
#define TRUE (4==(2*2))
|
|
|
|
|
May 28 2015, 11:42
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 12-05-12
Из: Барнаул
Пользователь №: 71 809

|
И в правду всё норм. Извините, перепаниковал((( Просто я весьма и весьма начинающий. На половину готовый проект, который пробовал на отладке с 32ой мегой собрался переносить на плату и решил взять мегу128 ( и в наличии есть, и памяти впрок) и вот случайно наткнулся на эту тему. Плату то уже развел. Еще раз прошу прощения
|
|
|
|
|
Jun 2 2015, 21:21
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Владивольт @ May 28 2015, 12:59)  Компилятор знает об отличиях портов, смотрите: Код #include <avr/io.h>
int main ( void ) { PORTA |= 0x01; PORTG |= 0x01; } превращается в Код int main ( void ) { PORTA |= 0x01; be: d8 9a sbi 0x1b, 0; 27 PORTG |= 0x01; c0: e5 e6 ldi r30, 0x65; 101 c2: f0 e0 ldi r31, 0x00; 0 c4: 80 81 ld r24, Z c6: 81 60 ori r24, 0x01; 1 c8: 80 83 st Z, r24 } Охренеть можно , как Си "пахабит" благороднейший asm Код lds R16,PORTG ori R16,0x01 sts PORTG,R16
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|