реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> AVR Studio ругается на порты F и G, mega128
Ydaloj
сообщение May 26 2015, 11:32
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 879
Регистрация: 20-06-11
Из: Карелия, Петрозаводск
Пользователь №: 65 799



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

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


--------------------
путь наименьшего сопротивления проходит по пути наитолстого провода (с)
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 26 2015, 12:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

2 На каком языке пишите программу? Если на ассемблере, то, надеюсь Вы в курсе, что команды IN/OUT для доступа к этим регистрам не применимы?
Go to the top of the page
 
+Quote Post
Ydaloj
сообщение May 26 2015, 12:58
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 879
Регистрация: 20-06-11
Из: Карелия, Петрозаводск
Пользователь №: 65 799



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


--------------------
путь наименьшего сопротивления проходит по пути наитолстого провода (с)
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 26 2015, 13:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Ydaloj @ May 26 2015, 16:58) *
Это только к ассемблеру относится?

Да, относится только к ассемблеру. Транслятор Си сам применит другие команды к регистрам портов F и G.
Go to the top of the page
 
+Quote Post
Xenia
сообщение May 26 2015, 13:05
Сообщение #5


Гуру
******

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



Цитата(Ydaloj @ May 26 2015, 15:32) *
Интернет говорит, что <где-то> установлен бит совместимости с мегой 103, и поэтому шиш тебе, а не порты Ф и Г


Бит совместимости с Мегой103 снимается в фузах (Bit 1 in Extended Fuse Byte), по умолчанию он установлен. Студия тут ни при чем.
Go to the top of the page
 
+Quote Post
Ydaloj
сообщение May 26 2015, 13:10
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 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

Прикрепленные изображения
Прикрепленное изображение
 


--------------------
путь наименьшего сопротивления проходит по пути наитолстого провода (с)
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 26 2015, 13:19
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Инженеры Atmel'а при проектировании микроконтроллеров AVR когда-то совершили стратегическую ошибку - отвели под область ввода-вывода слишком маленькое пространство адресов. Очень скоро количество регистров ввода-вывода в отдельных AVR стало превышать адресное пространство области ввода-вывода. Некоторые регистры ввода-вывода стали размещаться за пределами области ввода-вывода - команды IN/OUT для таких регистров применять нельзя. Если Вы посмотрите в документацию в раздел "Register Summary", то увидите, что регистры портов А,B,С и D находятся в области ввода-вывода, а регистры портов F и G лежат за пределами области ввода-вывода.
Go to the top of the page
 
+Quote Post
Ydaloj
сообщение May 26 2015, 13:24
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 879
Регистрация: 20-06-11
Из: Карелия, Петрозаводск
Пользователь №: 65 799



ясно, спасибо


--------------------
путь наименьшего сопротивления проходит по пути наитолстого провода (с)
Go to the top of the page
 
+Quote Post
Xenia
сообщение May 26 2015, 14:12
Сообщение #9


Гуру
******

Группа: Модератор 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 такт, чем и замогилила sm.gif 51-ю архитектуру.

Кстати, раз уж разговор об этом зашел, замечу, что у Х-Мег (у которых разных регистров видимо-невидимо) есть, так называемый, "виртуальный порт". Это что-то вроде окошка, накладываемого на любой из портов, внутри которого действуют команды IN и OUT. Т.е. идея тут такова, что если требуется настолько быстрый ввод-вывод, что становится существенным, за сколько тактов он выполяется, то используемый порт совмещают с виртуальным, а дальше работают на вируальном порте однотактовыми командами IN и OUT.
Go to the top of the page
 
+Quote Post
alexunder
сообщение May 26 2015, 15:36
Сообщение #10


unexpected token
****

Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987



bb-offtopic.gif
Цитата(Палыч @ May 26 2015, 15:19) *
Инженеры Atmel'а при проектировании микроконтроллеров AVR когда-то совершили стратегическую ошибку - отвели под область ввода-вывода слишком маленькое пространство адресов.

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


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
RA9YSS
сообщение May 28 2015, 09:39
Сообщение #11


Участник
*

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



А никто не подскажет мануальчик, как работать с портом G на Си, проблема таже что и у Ydaloj, студия 4.19 sad.gif
Go to the top of the page
 
+Quote Post
Xenia
сообщение May 28 2015, 09:48
Сообщение #12


Гуру
******

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



Цитата(RA9YSS @ May 28 2015, 12:39) *
А никто не подскажет мануальчик, как работать с портом G на Си, проблема таже что и у Ydaloj, студия 4.19 sad.gif


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

А если компилятор старый и PORTG не понимает, то доопределите его по образу и подобию других портов. Адресок порта G найдете в даташите.
Go to the top of the page
 
+Quote Post
Владивольт
сообщение May 28 2015, 09:59
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 14-02-10
Пользователь №: 55 490



Цитата(RA9YSS @ May 28 2015, 13:39) *
А никто не подскажет мануальчик, как работать с портом G на Си, проблема таже что и у Ydaloj, студия 4.19 sad.gif


Компилятор знает об отличиях портов, смотрите:
Код
#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))
Go to the top of the page
 
+Quote Post
RA9YSS
сообщение May 28 2015, 11:42
Сообщение #14


Участник
*

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



И в правду всё норм. Извините, перепаниковал(((
Просто я весьма и весьма начинающий. На половину готовый проект, который пробовал на отладке с 32ой мегой собрался переносить на плату и решил взять мегу128 ( и в наличии есть, и памяти впрок) и вот случайно наткнулся на эту тему. Плату то уже развел.
Еще раз прошу прощения sad.gif
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jun 2 2015, 21:21
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 3 2015, 05:30
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ILYAUL @ Jun 3 2015, 01:21) *
Охренеть можно , как Си "пахабит" благороднейший asm

Это Вы ещё не видели код, сгенерированный с выключенной оптимизацией.
Go to the top of the page
 
+Quote Post
ae_
сообщение Jun 3 2015, 05:59
Сообщение #17


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(ILYAUL @ Jun 3 2015, 06:21) *
Охренеть можно , как Си "пахабит" благороднейший 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

Такое решение уже для двух портов будет и короче, и быстрее.
Если я не ошибаюсь, компиляторы умеют такое делать самостоятельно, если адреса/переменные расположены рядом.
Go to the top of the page
 
+Quote Post
Ydaloj
сообщение Jun 17 2015, 14:34
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 879
Регистрация: 20-06-11
Из: Карелия, Петрозаводск
Пользователь №: 65 799



вот теперь у меня проблема с таймером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 - Jun 17 2015, 14:35


--------------------
путь наименьшего сопротивления проходит по пути наитолстого провода (с)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 17 2015, 14:40
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Ydaloj @ Jun 17 2015, 17:34) *
Код
    
    pop tmp
    out SREG,sreg_tmp
reti
А в основной программе регистр sreg_tmp не используется?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Ydaloj
сообщение Jun 19 2015, 13:47
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 879
Регистрация: 20-06-11
Из: Карелия, Петрозаводск
Пользователь №: 65 799



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

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

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

Ну да ладно.

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

Как лечить?

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

Сообщение отредактировал Ydaloj - Jun 19 2015, 14:01


--------------------
путь наименьшего сопротивления проходит по пути наитолстого провода (с)
Go to the top of the page
 
+Quote Post
mcheb
сообщение Jun 19 2015, 14:00
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Цитата(Ydaloj @ Jun 19 2015, 17:47) *
Как лечить?

Мегу 128 на ассемблере программировать гиблое дело. Возьмите WinAvr или ещё чего и будет Вам счастье
Go to the top of the page
 
+Quote Post
zombi
сообщение Jun 23 2015, 22:29
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(mcheb @ Jun 19 2015, 17:00) *
Мегу 128 на ассемблере программировать гиблое дело.

Глупость Вы написали!
Go to the top of the page
 
+Quote Post
Александр1
сообщение Jun 24 2015, 08:28
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 465
Регистрация: 13-05-15
Из: Запорожье
Пользователь №: 86 663



Цитата(mcheb @ Jun 19 2015, 17:00)
Мегу 128 на ассемблере программировать гиблое дело.
Цитата(zombi @ Jun 24 2015, 01:29) *
Глупость Вы написали!

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

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 10:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01598 секунд с 7
ELECTRONIX ©2004-2016