Отговори на тема  [ 7 мнения ] 
PIC24-C30 адрес на SFR регистър като константа в #define? 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение PIC24-C30 адрес на SFR регистър като константа в #define?
дефинирам си следното:

#define PIN (PORTB<<4+15)

и в резултат вместо готова константа сметната от препроцесора, се получава код с аритметичните операции използвани в директивата #define.
При AVR-GCC за да се избегне генерирането на код просто се използва спецификатор _SFR_IO_ADDR(portname), който указва на компилатора да не използва порта в операции, а само адреса му като константа, но в C30-GCC този спецификатор не е същия или липсва, или до момента не успях да го открия.

Какви предложения имате вие, за да използвам адреса на регистър PORTB, като константа, а не като дефиниран порт на процесора, така че PIN да се получи сметната от компилатора константа?


Нед Окт 05, 2008 6:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
Пробвай да сложиш няколко щпации след PIN....

_________________
main[-1u]={1};


Вто Окт 07, 2008 10:23 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: PIC24-C30 адрес на SFR регистър като константа в #define
Ники написа:
дефинирам си следното:

#define PIN (PORTB<<4+15)

и в резултат вместо готова константа сметната от препроцесора, се получава код с аритметичните операции използвани в директивата #define.
При AVR-GCC за да се избегне генерирането на код просто се използва спецификатор _SFR_IO_ADDR(portname), който указва на компилатора да не използва порта в операции, а само адреса му като константа, но в C30-GCC този спецификатор не е същия или липсва, или до момента не успях да го открия.

Какви предложения имате вие, за да използвам адреса на регистър PORTB, като константа, а не като дефиниран порт на процесора, така че PIN да се получи сметната от компилатора константа?


зависи как ти е дефиниран PORTB ... (не си му дал декларацията!)

иначе по C стандарт:
адреса е: (&(PORTB))

може да пробваш нещо от рода на:

#define PIN (((int)(&(PORTB)))<<4+15)

ама зависи от много неща :)

_________________
путинофили: "иди н***й"


Вто Окт 07, 2008 11:22 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Нед Ное 28, 2004 10:02 pm
Мнения: 141
Местоположение: София
Мнение 
Само да вметна, че приоритетът на аритметичното събиране и изваждане е по-висок от този на побитовото изместване, така че (х)<<4+15 е еднакво с (х)<<19.


Вто Окт 07, 2008 5:30 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
Цитат:
TheWizard


Пробвай да сложиш няколко щпации след PIN

това не го разбрах, каква е идеята?

Цитат:
ps66
зависи как ти е дефиниран PORTB ... (не си му дал декларацията!)

иначе по C стандарт:
адреса е: (&(PORTB))

може да пробваш нещо от рода на:

#define PIN (((int)(&(PORTB)))<<4+15)

ама зависи от много неща Smile

PORTB е дефиниран в хедър файла на дадения процесор, конкретно за ПИК24 като структура от битове.
Предварително ми изглеждаше странно '&' и 'int' да са валидни при използване в #define, но опитах и нищо не се получи.

Цитат:
zmej


Само да вметна, че приоритетът на аритметичното събиране и изваждане е по-висок от този на побитовото изместване, така че (х)<<4+15 е еднакво с (х)<<19.


Прав си, но пишейки примера, не копирах а само илюстрирах идеята, такива грешки от неправилно зададени приоритети не остават скрити :)


В крайна сметка един ден отиде в лутане по разните документи и примери, в които естествено решение на моята ситуация няма, предефинирах си най юнашки няколкото порта на процесора, и всичко си дойде на място, евала на разчупените модерни компилатори :)


Сря Окт 08, 2008 1:21 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
Ники написа:
.... PORTB е дефиниран в хедър файла на дадения процесор, конкретно за ПИК24 като структура от битове.
Предварително ми изглеждаше странно '&' и 'int' да са валидни при използване в #define, но опитах и нищо не се получи.
...


то е ясно че PORTB е дефиниран някъде ... !

само май не ти е ясно че освен PIC има и много (ама много) други MCU-та

да беше постнал декларацията на PORTB
да беше написал колко ти смята компилатора за PIN ...

a това че &, int ти се виждат "странни" ... показва колко разбираш C !

_________________
путинофили: "иди н***й"


Сря Окт 08, 2008 7:55 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
Цитат:
то е ясно че PORTB е дефиниран някъде ... !

само май не ти е ясно че освен PIC има и много (ама много) други MCU-та

да беше постнал декларацията на PORTB
да беше написал колко ти смята компилатора за PIN ...

a това че &, int ти се виждат "странни" ... показва колко разбираш C !


сега като пиша отговора от компютъра който ползвам за интернет нямам инсталация на този компилатор за да копна дефиницията на PortB, но както писах по горе, не е дефиниран като константа, а като структура от битове! И в линкер скрипта му се присъединява физическия адрес!

Обяснявайки проблема в началото на темата, писах че компилатора не смята PIN, а на мястото в програмата където използвам PIN генерира асемблерски код с асемблерски аритметични инструкции :) , според действията които съм използвал в #define (в момента нямам и този файл под ръка за да го копна, какво си е измислял). Въобще ако смяташе нещо компилатора за PIN, тази тема щеше да липсва...

Въпроса ми е свързан конкретно с 'великия' процесор ПИК, направил неизвестни толкова други. Шегувам се! И да знам дали има други процесори или не, в конкретния случай знанията от други процесори невинаги помагат, защото конкретно за този компилатор някой друг е решил да му ореже удобните опции които ти знаеш, и на каквито се радват хубавите процесори от други фирми!

Колко разбирам С...има доста теми във форума, които са показателни за разбирането ми, и никъде не се изявавам като дългогодишен и с опит "програмист". Уча се!

Проблема си го реших, Благодаря за съдействието![/quote]


Сря Окт 08, 2008 10:11 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 7 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни