roboforum.ru

Технический форум по робототехнике.
Текущее время: 21 май 2025, 08:04

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Указатель на порт
СообщениеДобавлено: 10 дек 2010, 09:29 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 996
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
Нужно мне хранить указатель на порт. Как это делается?
банальное
Код:
unsigned char *r_port;
r_port = &PORTA;

*r_port = 0xff;


не работает, подскажите как правильно сделать подобную вещь, перерыл кучу документации, не понял, есть ли вообще такая возможность.
МК АТмега32, если это важно, компилятор CVAVR

пока как временное решение приходится городить switch на 4 порта, передавая порт как символ 'A'(В,С,D), но это долго и некрасиво.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 10 дек 2010, 10:24 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2008, 21:15
Сообщения: 4130
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич
avr-gcc:

Код:
#include <avr/io.h>
#include <inttypes.h>

void set_port(uint8_t *addr, uint8_t value)
{
   *addr = value;
}

int main(void)
{
   uint8_t* port = (uint8_t*)&PORTA;
   set_port(port, 0xFF);
   for(;;);
}


Любой компилятор:
Код:
#include <blahblahblah>
void set_port(uint8_t *addr, uint8_t value)
{
   *addr = value;
}

int main(void)
{
   uint8_t* port = (uint8_t*)(0x3B); // адрес порта A
   set_port(port, 0xFF);
   for(;;);
}

_________________
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 10 дек 2010, 12:18 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
А вот странно - почему код HarryStar не работает? Вроде навскидку ровно то же самое, что и у blindman'а, только без красивостей. &PORTA это ж адрес порта в пространстве ОЗУ, все вроде корректно, компилятору вообще должно быть все равно что там - реальная ячейка ОЗУ или SFR.
HarryStar, а оно не работает или не компилится?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 10 дек 2010, 13:22 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2008, 21:15
Сообщения: 4130
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич
Это код под avr-gcc, там PORTA разворачивается в (*(volatile uint8_t *)((0x1B) + 0x20)), а как в cvavr PORTA определен - фиг его знает.

_________________
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 10 дек 2010, 14:34 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Вот так в CVAVR скомпилилось.


Код:
void set_port(char *addr, char value)
{
   *addr = value;
}

void main(void)
{
   char* port = (char*)(0x3B); // адрес порта A
   set_port(port, 0xFF);
   for(;;);
}

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 10 дек 2010, 17:57 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
Да вот я потому и уточнил - мне кажется HarryStar нас обманул неточно выразился, и у него именно не компилится, потому что если код
Код:
r_port = &PORTA
скомпилился, то я не могу представить, во что он мог скомпилиться, кроме
Код:
r_port = (char*)(0x3B)

avr123, у вас CV есть - что оно на такой код говорит?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 10 дек 2010, 18:39 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2008, 21:15
Сообщения: 4130
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич
CVAVR - это не тру си :)

Регистры там определяются примерно вот так:

sfrb PORTA = 0x1B;

Хотя могли бы и догадаться сделать оператор взятия адреса применимым к ним.

_________________
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 10 дек 2010, 19:02 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
boez писал(а):
avr123, у вас CV есть - что оно на такой код говорит?


Вот так компилится:

Код:
    char* r_port;

        r_port = (char*)(0x3B);

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 11 дек 2010, 07:39 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 996
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
Ну да, мой пример именно не компилится, я не так выразился, говорит, что SFRB нельзя преобразовать к *uns char.
Спасибо за помощь!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 05 янв 2013, 19:26 
Не в сети
Аватара пользователя

Зарегистрирован: 29 сен 2012, 14:41
Сообщения: 40
прог. языки: C\C++, AutoIt, PHP
Всем привет. Возникла такая же необходимость (делаю класс, в котором можно настроить ноги). Компилятор AVR-GCC (WinAVR).
Написанная выше функция set_port() работает как-то странно - при первом вызове все правильно отрабатывает, а дальше - весь порт выключается. Причем если потом дернуть любую ногу через PORTx - все включается правильно. Как эту проблему можно решить?

И еще вопросик - как считать значение порта по указателю?

P.S: пардон за некропост, думаю это лучше чем создавать новую тему...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 05 янв 2013, 19:39 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
должно быть не char *addr, так как это не указатель на чар, а просто char addr.

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 05 янв 2013, 19:47 
Не в сети
Аватара пользователя

Зарегистрирован: 29 сен 2012, 14:41
Сообщения: 40
прог. языки: C\C++, AutoIt, PHP
Спасибо за быстрый ответ.

Так?
Код:
void set_port(char addr, char value)
{
   *addr = value;
}

Вышибает ошибку invalid type argument of 'unary *' (have 'int').

Нашел в поиске:
Код:
//Допустим регистр данных порта расположен по адресу 0x16
unsigned char Port;
Port = 0x16;
*Port = 0xFF; //Записали в порт соответствующий регистру расположенному по адресу 0x16 число 255

Та же ошибка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 06 янв 2013, 00:37 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2009, 13:37
Сообщения: 750
Откуда: Porto Franco "Odessa"
обращение к портам ввода вывода идет не операциями доступа к памяти , а операциями ввода вывода out & in и есть спец инициализация в кодовиджине sfrb PORTA = 0x1B;

_________________
die Wahrheit ist irgendwo da draußen


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 06 янв 2013, 07:06 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2008, 21:15
Сообщения: 4130
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич
Romikgy писал(а):
обращение к портам ввода вывода идет не операциями доступа к памяти , а операциями ввода вывода

Неа. Обращение к любым портам ввода вывода возможно операциями доступа к памяти , а к некоторым - еще и операциями ввода вывода

_________________
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на порт
СообщениеДобавлено: 06 янв 2013, 13:04 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
http://www.avrfreaks.net/index.php?name ... 74&start=0
http://www.avrfreaks.net/index.php?name ... 44&start=0

В общем, пишут то же самое. Теоретически в некоторых случаях это может сработать, но не для всех операций и не во всех компиляторах.

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO