MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

а можно и вот так

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 Тонкости Hi-TECH
Автор: L.A. ()
Дата:   03/02/2004 23:10

В макросе

__EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF);

можно задать начальный адрес для размещения этих данных?
Что то в доке я не нашел ответа.


 
 Re: Тонкости Hi-TECH
Автор: SergeyTL ()
Дата:   04/02/2004 01:52

Я делаю так:
#asm
     psect	eedata,class=EEDATA,delta=1
     db 0       // что-то для примера
     db 0xF1    //и еще что-то
     org 0x0f   //следующие данные с нового адреса
     db 0x5a
#endasm

Для PIC18 параметр delta можно не определять, но для PIC16 он должен быть равен 2.




 
 Спасибо, попробую
Автор: L.A. ()
Дата:   04/02/2004 10:11

может получится поудобней


 
 а можно и вот так
Автор: Vova ()
Дата:   04/02/2004 10:42

если для midrange, то берешь из pic.h этот макрос и чуть правишь его:
(для 18-ых по аналогии, только адрес еепромины другой)
#define __EEPROM_DATA(offs, a, b, c, d, e, f, g, h) \
    asm("\tpsect eeprom_data,class=EEDATA,delta=2"); \
    asm("\torg "#offs);\
    asm("\tdb\t" ___mkstr(a) "," ___mkstr(b) "," ___mkstr(c) "," ___mkstr(d) "," \
                 ___mkstr(e) "," ___mkstr(f) "," ___mkstr(g) "," ___mkstr(h))

// расположить по смещению 0x10 от начала еепромины
__EEPROM_DATA( 0x10, 1, 2, 3, 4, 5, 6, 7, 8 );


а можно чтонить такое забабахать:
#define __EEPROM_FILL(w)        asm("\tpsect eedata,delta=2,abs,ovrld");\
                                asm("\torg 2100h");\
                                asm("\trept 128"); \  // здесь размер еепромины
                                asm("\tdb " #w); \
                                asm("\tendm")

#define __EEPROM_STRING(offs,w) asm("\tpsect eedata,delta=2,abs,ovrld");\
                                asm("\torg 2100h+"#offs);\
                                asm("\tirpc\t__arg, "#w); \
                                asm("\tdb '__arg'"); \
                                asm("\tendm")

// зачистили всю еепромину
__EEPROM_FILL( 0 );

// по смещению 0x20 оставили послание
__EEPROM_STRING( 0x20, privetstvie_lomatelyam );


подобное можно и для программной памяти сделать
вот что-то вроде примера:
#define __ROM_STRING(offs,w)    asm("\tpsect codedata,delta=2,abs,ovrld");\
                                asm("\torg "#offs);\
                                asm("\tirpc\t__arg, "#w); \
                                asm("\tdb '__arg'"); \
                                asm("\tendm")

__ROM_STRING( 0x300, a_vot_takie_mi_eprst );

только нужно иметь ввиду, что линкер легко может разместить прогу поверх этой
строки (так мы определили psect - ovrld)

вариации на тему ограничены лишь фантазией.

asm("\tpsect eedata,delta=2,abs,ovrld");

если описывать psect вот так, то точно указывать где находится еепромина (для mid-
range она начинается по адресу 0x2100, для 18-ых - 0x0F00000)

asm("\tpsect eeprom_data,class=EEDATA,delta=2");
а вот так вроде и не надо знать, но со старыми версиями компилера может и не
работать - класса EEDATA скорее всего нет (например, класс IDLOC появился лишь в
версии 8.02, по-моему).



Отправка отредактированного (04/02/2004 12:28)


 
 Попробовал вариант SergeyTL
Автор: L.A. ()
Дата:   04/02/2004 11:23

и думаю, что у него наиболее удобный и компактный . Так и оставлю.

Кстати

// расположить по смещению 0x10 от начала еепромины
__EEPROM_DATA( 0x10, 1, 2, 3, 4, 5, 6, 7, 8 );


НЕ РАБОТАЕТ, точнее данные размещаются все равно с адреса 0х00.




 
 ГЫ-ГЫ, ты ж не по уши деревянный ;)
Автор: patton ()
Дата:   04/02/2004 11:29

А хедерок кто править будет, ещё раз внимательно посмотри, что Vova написал ;) И сравни с pic.h


 
 Ваще то, у него в примере ошибочка
Автор: L.A. ()
Дата:   04/02/2004 12:10

С его поправкой не компилилось,
поэтому методом тыка нашел правильное решение


#define __EEPROM_DATA(offs,a, b, c, d, e, f, g, h) \
	         asm("\tpsect eeprom_data,class=EEDATA,delta=2"); \

                     asm("\torg "#offs);\ 






 
 перепутал и не заметил
Автор: Vova ()
Дата:   04/02/2004 12:21

asm("\tpsect eeprom_data,class=EEDATA,delta=2"); \

asm("\tpsect
eedata,delta=2,abs,ovrld");\


исходное сообщение подправил



Отправка отредактированного (04/02/2004 12:38)


 
 Коллеги, всем спасибо за помощь
Автор: L.A. ()
Дата:   04/02/2004 12:34

сабж




 
 спасибо тебе за уточнение(-)
Автор: patton ()
Дата:   04/02/2004 12:41

!