Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

PIC24-C30 адрес на SFR регистър като константа в #define?
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=6150
Страница 1 от 1

Автор:  Ники [ Нед Окт 05, 2008 6:44 pm ]
Заглавие:  PIC24-C30 адрес на SFR регистър като константа в #define?

дефинирам си следното:

#define PIN (PORTB<<4+15)

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

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

Автор:  TheWizard [ Вто Окт 07, 2008 10:23 am ]
Заглавие: 

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

Автор:  ps66 [ Вто Окт 07, 2008 11:22 am ]
Заглавие:  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)

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

Автор:  zmej [ Вто Окт 07, 2008 5:30 pm ]
Заглавие: 

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

Автор:  Ники [ Сря Окт 08, 2008 1:21 am ]
Заглавие: 

Цитат:
TheWizard


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

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

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

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

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

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

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

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

Цитат:
zmej


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


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


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

Автор:  ps66 [ Сря Окт 08, 2008 7:55 am ]
Заглавие: 

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


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

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

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

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

Автор:  Ники [ Сря Окт 08, 2008 10:11 am ]
Заглавие: 

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

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

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

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


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

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

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

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

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/