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

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

Интернет говорит, что <где-то> установлен бит совместимости с мегой 103, и поэтому шиш тебе, а не порты Ф и Г

 

я только пишу программу, никакой меги нет и программаторов тоже

Чёж авр студио тогда ругается? и как мне убрать этот косяк?

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


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

1 Как именно ругается? Приведите текст сообщения об ошибке и текст строки программы, на которую студия ругается.

 

2 На каком языке пишите программу? Если на ассемблере, то, надеюсь Вы в курсе, что команды IN/OUT для доступа к этим регистрам не применимы?

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


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

Если на ассемблере, то, надеюсь Вы в курсе, что команды IN/OUT для доступа к этим регистрам не применимы
Это только к ассемблеру относится?

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


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

Это только к ассемблеру относится?

Да, относится только к ассемблеру. Транслятор Си сам применит другие команды к регистрам портов F и G.

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


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

Интернет говорит, что <где-то> установлен бит совместимости с мегой 103, и поэтому шиш тебе, а не порты Ф и Г

 

Бит совместимости с Мегой103 снимается в фузах (Bit 1 in Extended Fuse Byte), по умолчанию он установлен. Студия тут ни при чем.

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


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

Upd: проект на Mega128 с компилятором AVR GCC тоже не позволяет работать с портами F и G командами I/O

 

с портами А...Е такой фигни нет - сразу определены адреса и доступ есть

 

Xenia, я до фузов не дошёл ещё - у меня пустой лист, даже без программы. А доступа уже нет.

 

При попытке настроить порты, А...Е настраиваются, а про F и G компилятор ругается

\\_PROGRAM\AVRStudio\MAIN.asm(71): error: Operand 1 out of range: 0x61

post-65799-1432645580.png

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


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

Инженеры Atmel'а при проектировании микроконтроллеров AVR когда-то совершили стратегическую ошибку - отвели под область ввода-вывода слишком маленькое пространство адресов. Очень скоро количество регистров ввода-вывода в отдельных AVR стало превышать адресное пространство области ввода-вывода. Некоторые регистры ввода-вывода стали размещаться за пределами области ввода-вывода - команды IN/OUT для таких регистров применять нельзя. Если Вы посмотрите в документацию в раздел "Register Summary", то увидите, что регистры портов А,B,С и D находятся в области ввода-вывода, а регистры портов F и G лежат за пределами области ввода-вывода.

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


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

Инженеры 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.

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


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

:bb-offtopic:

Инженеры Atmel'а при проектировании микроконтроллеров AVR когда-то совершили стратегическую ошибку - отвели под область ввода-вывода слишком маленькое пространство адресов.

Вот потому, дорогой Ydaloj, я тебе и советовал брать 51, но не послушал ты старого товарища...

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


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

А никто не подскажет мануальчик, как работать с портом G на Си, проблема таже что и у Ydaloj, студия 4.19 :(

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


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

А никто не подскажет мануальчик, как работать с портом G на Си, проблема таже что и у Ydaloj, студия 4.19 :(

 

Он, наверное, как PORTG и называется. Чему тут учиться? :)

 

А если компилятор старый и PORTG не понимает, то доопределите его по образу и подобию других портов. Адресок порта G найдете в даташите.

 

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


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

А никто не подскажет мануальчик, как работать с портом 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
}

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


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

И в правду всё норм. Извините, перепаниковал(((

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

Еще раз прошу прощения :(

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


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

Компилятор знает об отличиях портов, смотрите:

#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

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


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

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

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

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

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

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

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

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

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

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