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

Представляем новую линейку продуктов, поставляемых ООО "Микро-Чип":
Источники питания

Блоки  питания


 

Помогите новичку по C HiTech

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

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

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

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

 Помогите новичку по C HiTech
Автор: nic (---.interstar.net.ua)
Дата:   30/05/2005 14:24

Как можно организовать указатель на лонговую константу во флешь,находящуюся по фиксированному адр
есу(напримет 0х40)?

chip PIC16F630.


 
 const long *YourPtr = 0x40;(-)
Автор: Entuziast (---.broadband.actcom.net.il)
Дата:   30/05/2005 14:37

(-)

Sapienti sat


 
 Чёт не то...
Автор: nic (---.interstar.net.ua)
Дата:   30/05/2005 14:56

Делаю так:
<pre>
const long *ttt = 0x40;

ulong *ptr;
ptr = ttt;
y = *ptr;
в листинге получаю
59: y = *ptr;
00026F 084 MOVWF 0x4
000270 800 MOVF 0, W
000271 0A6 MOVWF 0x26

</pre>

Где я напутал?


 
 My compilation results
Автор: Entuziast (---.broadband.actcom.net.il)
Дата:   30/05/2005 15:36

nic писал(а):

> Делаю так:
> <pre>
> const long *ttt = 0x40;
>
> ulong *ptr;
> ptr = ttt;
> y = *ptr;
> в листинге получаю
> 59: y = *ptr;
> 00026F 084 MOVWF 0x4
> 000270 800 MOVF 0, W
> 000271 0A6 MOVWF 0x26
>
> </pre>
>
> Где я напутал?




//Tst
94: const long *ttt = 0x40;
000E16 0E40 MOVLW 0x40
95: unsigned char y;
96: unsigned long *ptr;
97: ptr = ttt;
000E1C 0E40 MOVLW 0x40
000E1E 6EE9 MOVWF 0xfe9, ACCESS
000E20 6AEA CLRF 0xfea, ACCESS
98: y = *ptr;
000E22 C040 MOVFF 0x40, 0xfd9
000E24 FFD9 NOP
имхо всё сходится

Sapienti sat


 
 И ещё
Автор: Entuziast (---.broadband.actcom.net.il)
Дата:   30/05/2005 15:45

здесь это к счастью не важно но вообще указатели д.б. на один тип

>const long *ttt = 0x40;
> ulong *ptr;

ulong надо полагать unsigned long ? тогда const unsigned long *ttt = 0x40;

а ваша проблема скорее всего в том что у вас int y.

Sapienti sat


 
 Re: My compilation results
Автор: nic (---.interstar.net.ua)
Дата:   30/05/2005 16:31

А это для какого проца?У меня movff нет в pic16f630...
И что,в строке е22 одной командой прочитался long?Не верю.


 
 Sorry PIC18
Автор: Entuziast (---.broadband.actcom.net.il)
Дата:   30/05/2005 17:06

но всё равно проверь как у тебя объявлена переменная куда ты считываешь значение из флеши. я
подозреваю что оно у тебя интеджер. Для пик16 будет что-то вроде такого в асме
MOVF 0x40,W
MOVW Yaddres,F
если всё как у - unsigned char
И вообще сто раз подумай прежде чем применять интеджер на пиках и прочих 8-битниках -
раздувается размер кода и снижается быстродействие.

Sapienti sat


 
 а разве мало для указателя с размером ОЗУ в камне с гулькин....
Автор: IgorV (---.mplik.ru)
Дата:   30/05/2005 17:16

-


 
 всей ветки не читал, но
Автор: Vova (82.140.73.---)
Дата:   30/05/2005 17:27

неоднократно постилось на форуме (если я правильно понял о чем речь %)

const long * const qwe;

qwe - указатель на лонг в ПЗУ, сам указатель находится в ПЗУ.

все описано в мануале.


http://www.microchip.ru/phorum/read.php?f=2&i=76684&t=76680


 
 Re: всей ветки не читал, но
Автор: nic (---.interstar.net.ua)
Дата:   30/05/2005 18:09

А так начал выдавать ошибку симуляции
CORE-E0001: Stack over flow error occurred from instruction at 0x000043


 
 и чего?
Автор: Vova (82.140.73.---)
Дата:   30/05/2005 18:23

причем тут ошибка симуляции?


 
 Лучше я Вам покажу как я делаю.
Автор: nic (---.interstar.net.ua)
Дата:   30/05/2005 18:36

const long * const ttt = 0x90;
//адрес константы = 0х90

long ReceivLong;

ReceivLong = *ttt;

После выполнения этой строки в ReceivLong - 0х58565452,а в памяти в окресности 0х90 сиддят 0х
3fff.

59: ReceivLong = *ttt;
000290 1283 BCF 0x3, 0x5
000291 1CB CLRF 0x4b
000292 3090 MOVLW 0x90
000293 2039 CALL 0x39
000294 0BE MOVWF 0x3e
000295 203B CALL 0x3b
000296 0BF MOVWF 0x3f
000297 203B CALL 0x3b
000298 0C0 MOVWF 0x40
000299 203B CALL 0x3b
00029A 0C1 MOVWF 0x41
00029B 83E MOVF 0x3e, W
00029C 0AB MOVWF 0x2b
00029D 83F MOVF 0x3f, W
00029E 0AC MOVWF 0x2c
00029F 840 MOVF 0x40, W
0002A0 0AD MOVWF 0x2d
0002A1 841 MOVF 0x41, W
0002A2 0AE MOVWF 0x2e


 
 Re: Лучше я Вам покажу как я делаю.
Автор: nic (---.interstar.net.ua)
Дата:   30/05/2005 18:38

Блин,кажись дошло:-(((


 
 Не,не получилось.
Автор: nic (---.interstar.net.ua)
Дата:   30/05/2005 18:43

У Вас по ссылке иниацилизированная константа по неизвестному адресу,а мне нужно прочитать неиници
лизированную константу по известному адресу:-(((


 
 Энтузиаст уже все рассказал (-)
Автор: Vova (82.140.73.---)
Дата:   30/05/2005 18:48

Энтузиаст уже все рассказал (-)


 
 Но я же типы указал явно,везде long.(-)
Автор: nic (---.interstar.net.ua)
Дата:   30/05/2005 18:56

:-(((


 
 давай так
Автор: Vova (82.140.73.---)
Дата:   30/05/2005 19:35

еще раз полностью исходник (только урежь его по максимуму), версию компилятора, строку запуска.


 
 Мой дизассемблинг для лонгов
Автор: Entuziast (---.broadband.actcom.net.il)
Дата:   30/05/2005 19:51

const unsigned long *ttt = 0x90;
000E16 0E90 MOVLW 0x90
94:
95: unsigned long ReceivLong;
96:
97: ReceivLong = *ttt;
000E1C 0E90 MOVLW 0x90
000E1E 6EF6 MOVWF 0xff6, ACCESS
000E20 6AF7 CLRF 0xff7, ACCESS
000E22 0E05 MOVLW 0x5
000E24 64F7 CPFSGT 0xff7, ACCESS
000E26 D011 BRA 0xe4a
000E28 0009 TBLRD*+
000E2A FFFF NOP
000E2C CFF5 MOVFF 0xff5, 0
000E2E F000 NOP
000E30 0009 TBLRD*+
000E32 FFFF NOP
000E34 CFF5 MOVFF 0xff5, 0x1
000E36 F001 NOP
000E38 0009 TBLRD*+
000E3A FFFF NOP
000E3C CFF5 MOVFF 0xff5, 0x2
000E3E F002 NOP
000E40 0009 TBLRD*+
000E42 FFFF NOP
000E44 CFF5 MOVFF 0xff5, 0x3
000E46 F003 NOP
000E48 D00C BRA 0xe62
000E4A CFF6 MOVFF 0xff6, 0xfe9
000E4C FFE9 NOP
000E4E CFF7 MOVFF 0xff7, 0xfea
000E50 FFEA NOP
000E52 CFEE MOVFF 0xfee, 0
000E54 F000 NOP
000E56 CFEE MOVFF 0xfee, 0x1
000E58 F001 NOP
000E5A CFEE MOVFF 0xfee, 0x2
000E5C F002 NOP
000E5E CFEE MOVFF 0xfee, 0x3
000E60 F003 NOP
У тебя вместо MOVFF должны быть пары MOVF - MOVWF ,F. Если этого нет то что-то неверно в
настройках проекта и\или симулятора.И ещё проверь чтоб правильный файл LKR был подключён в
проект

Sapienti sat

Отправка отредактированного (30/05/2005 20:11)


 
 Re: давай так
Автор: nic (---.interstar.net.ua)
Дата:   31/05/2005 10:05

<pre>
const long *ttt = 0x90;

void main(void)
{
long dat;
dat = *ttt;
}
</pre>

Ужал до минимума:-))После симуляции в dat находится 0х3a383634
Компилятор 805PL2


 
 Re: Мой дизассемблинг для лонгов
Автор: nic (---.interstar.net.ua)
Дата:   31/05/2005 10:43

<pre>
58: dat = *ttt;
00020B 83B MOVF 0x3b, W
00020C 0C9 MOVWF 0x49
00020D 83A MOVF 0x3a, W
00020E 204B CALL 0x4b
00020F 0BC MOVWF 0x3c
000210 204D CALL 0x4d
000211 0BD MOVWF 0x3d
000212 204D CALL 0x4d
000213 0BE MOVWF 0x3e
000214 204D CALL 0x4d
000215 0BF MOVWF 0x3f
000216 83C MOVF 0x3c, W
000217 0B6 MOVWF 0x36
000218 83D MOVF 0x3d, W
000219 0B7 MOVWF 0x37
00021A 83E MOVF 0x3e, W
00021B 0B8 MOVWF 0x38
00021C 83F MOVF 0x3f, W
00021D 0B9 MOVWF 0x39
</pre>


 
 проверь чтоб правильный файл LKR был подключён в проект(-)
Автор: Entuziast (---.broadband.actcom.net.il)
Дата:   31/05/2005 10:55

-

Sapienti sat


 
 А что такое LKR?(-)
Автор: nic (---.interstar.net.ua)
Дата:   31/05/2005 11:29

???


 
 это про другой компилятор
Автор: Vova (82.140.73.---)
Дата:   31/05/2005 12:40

на счет

const long *ttt = 0x90;
void main(void) { long dat; dat = *ttt; }

теперь вопрос, чего ты ожидаешь?
в dat записалось то, что находится по адресу 0x90 в ПЗУ, а там есть что-то? причем там не просто что-то должно быть, а таблица retlw'ов (!!) (ну, почти), если ее там нет, то ты и будешь получать переполнение стека и прочее, потому как будет переход (гляди дизассемблированный hex или в листинге ищи, но там вряд ли, не помню) хрен знает куда, может на ф-цию, может еще на чтонить, если на не используемую область, то когда дошагает до конца памяти, то опять начнет с нуля, а там твоя прога и опять - до переполнения стека.

вот тут читай (хотя должен был читать мануал !!):
http://www.microchip.ru/phorum/read.php?f=2&i=56389&t=50928&v=t


 
 не туда ссылку дал, но близко
Автор: Vova (82.140.73.---)
Дата:   31/05/2005 12:43

ключевые слова - констовый указатель у пикси 16-битный, о его формате пару слов сказано, детальнее ищи в
мануале.


 
 Интересная штука получается
Автор: nic (---.interstar.net.ua)
Дата:   31/05/2005 13:05

По адресу 0x20e стоит call 0x4b,а там стоит запись в PCL адреса 0x90.Вроде всё правильно,если
бы по адресу 0x90 была команда RETLW X.А там находится массив из 0x3fff.Во дела...


 
 Нету там RETLW,см.ниже(-)
Автор: nic (---.interstar.net.ua)
Дата:   31/05/2005 13:10

----


 
 а надо чтобы была
Автор: Greg (---.ntt.ru)
Дата:   31/05/2005 13:23

вы сами и должны там что-то разместить.


 
 неинтересно уже
Автор: Vova (82.140.73.---)
Дата:   31/05/2005 13:30

чего хочу в итоге-то получить?? инфы налили достаточно, в чем трабл?


 
 Re: а надо чтобы была
Автор: Greg (---.ntt.ru)
Дата:   31/05/2005 13:32

Greg писал(а):

> вы сами и должны там что-то разместить.

просто обьявить указатель - этого мало.
Вернее, откуда нам знать, что там у вас...


 
 ok, немного иначе
Автор: Vova (82.140.73.---)
Дата:   31/05/2005 13:42

nic, расскажите нам, что хочется получить в итоге?


 
 ok'
Автор: nic (---.interstar.net.ua)
Дата:   31/05/2005 13:48

Мне нужно прочитать лонговую константу находящуюся по фиксированному адресу.При компиляции я эту
константу не знаю,она будет вноситься непосредственно в hex-файл(установка серийного номера).Вот
для чего всё это нужно.


 
 Как разместить?
Автор: nic (---.interstar.net.ua)
Дата:   31/05/2005 14:06

const long *ttt = 0x90;//обьявили указатель
Как в ячейку 0х90 разместить нужный код?


 
 Блин,ну надо же...
Автор: nic (---.interstar.net.ua)
Дата:   31/05/2005 14:10

Если используется RETLW то компилятор действительно должен знать константу:-(((А тогда я не пол
учу того чего хотел:-(((Надо ж так лохануться...Извините ребята за отнятое время,задача не разре
шима.


 
 блин, #pragma location или @
Автор: pal (---.sovintel.ru)
Дата:   31/05/2005 14:11

.


 
 тут идеи посмотрите
Автор: Greg (---.ntt.ru)
Дата:   31/05/2005 14:29

http://www.microchip.ru/phorum/read.php?f=2&i=90385&t=90312


 
 nic'у
Автор: Vova (82.140.73.---)
Дата:   31/05/2005 14:36

1. пиши константу в виде retlw (прога, которая hex правит).
2. читай из памяти программ сам
FLASH_READ() макрос и ф-ция в хайтековских компилерах.

ну и ветку, что Greg показал почитать бы


 
 про размещение
Автор: Vova (82.140.73.---)
Дата:   31/05/2005 14:37

оттолкнуться можно от ссылки
http://www.microchip.ru/phorum/read.php?f=2&i=56388&t=50928&v=t


 
 Re: Помогите новичку по C HiTech
Автор: GRR (81.4.252.---)
Дата:   31/05/2005 14:50

Всю ветку не стал читать, но, _если правильно понял_, нужно что-то вот такое:

unsigned long num;

*((char*)(&num)) = flash_read(addr0);
*((char*)(&num)+1) = flash_read(addr1);
*((char*)(&num)+2) = flash_read(addr2);
*((char*)(&num)+3) = flash_read(addr3);


 
 Спасибо!Всё понял.(-)
Автор: nic (---.interstar.net.ua)
Дата:   31/05/2005 14:54

---


 
 Спасибо,я уже разобрался.(-)
Автор: nic (---.interstar.net.ua)
Дата:   31/05/2005 16:28

---


 
 г@@@а пирога - победили красные...
Автор: patton (195.208.69.---)
Дата:   31/05/2005 23:50

не надо туда по фиксированному адресу пихать, раместил конст из конста
прочитал
const long var = 1234567890;
всё
long copy = var;


 
 и еще две ссылки
Автор: Vova (82.140.73.---)
Дата:   01/06/2005 14:56


http://www.htsoft.com/forum/all/showflat.php?Cat=0&Board=projects&Number=14440
http://www.htsoft.com/forum/all/showflat.php?Cat=0&Board=projects&Number=13734





Горячие темы на нашем форуме:
Отдел продаж: тел. (495) 223-2339 sales@microchip.ru   Skype:microchip-moscow
Rambler's Top100