Отговори на тема  [ 20 мнения ]  Отиди на страница 1, 2  Следваща
PIC +C проблем 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение PIC +C проблем
Мъча един 16F88 и стигнах дотам че ми трябва масив от 256 байта с 2 указателя към него. CCS обаче не иска да ми отдели повече от 80-90 байта, дава че нямало достатъчно, макар тая гадинка да има 4 банки по 128, като във всяка най-отгоре са 10-20 байта за служебни регистри, а най долните 16 са "public" ... :x :twisted: дали заради тва "гениално" разпределение компилатора не може да ми отдели памет? Аз бих могъл да си адресирам масива през fsr индиректно като в асемблера и да ползвам първите 3 банки , но как да съм сигурен тогава, че компилатора няма да запише нищо там, смятайки че са свободни?
Все смятам, че трябва да има и по-лесен начин. Някой борил ли се е с нещо подобно?


Пет Фев 24, 2006 9:48 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
А задачката не е достатъчно сериозна че да си струва да се минава на 18F....


Пет Фев 24, 2006 9:49 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Вто Окт 25, 2005 10:54 am
Мнения: 896
Мнение 
nai tupoto reshenie koeto az izpolzwah wednuz w tozi sluchai e - defifnirash si dwa po malki masiwa i w zawisimost kolkoti e indeksa se obryshtash kym ediniq ili kum drugiq, t.e. emulirash si programno po golqm masiw... sorry za latinicata


Пет Фев 24, 2006 10:36 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Сря Дек 21, 2005 2:09 pm
Мнения: 145
Мнение 
Имах същия проблем преди време на PIC18. При тях рама е разделен на страници по 256 и масива с мсксимален брой елементи е <=256. Ако не се ползва директива за дефиниране на нова страница преди декларацията на масива, компилатора ще ти позволи създаване на на масив с доста по-малък брой елементи от 256, тъй като в страницата е заделено място и за др. променливи. Пример за декларация на масива би бил това:

#pragma udata inputbufferdata = 0x300
unsigned char input_buffer[256];

за съжаление аз използвам С18, но виж и в ССS трябва да има някакви директиви. Ако искаш да направиш кръгов буфер с два указателя за четене и запис в него бих могъл да ти дам няколко хватки


Пет Фев 24, 2006 11:03 am
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Пет Окт 21, 2005 8:45 am
Мнения: 499
Мнение 
Цитат:
има 4 банки по 128


Прочети внимателно дейташийта преди да обвиняваш компилатора си! Процесора има само 368 клетки RAM.

_________________
Простотията е Божи дар, но човек не бива да парадира с подаръците си!


Пет Фев 24, 2006 11:57 am
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Пон Яну 09, 2006 11:32 am
Мнения: 276
Местоположение: Kozloduy
Мнение 
Ето и от мен малко опит с 16f877 i miktoC, mikroPaskal
не може да дефинираш масив по голям ~ 80byte, т.е. колкото е свободното в 1 банка (тук се сещам за анкетата на Кольо ;) )
Така че 2 или 3 масива.


Пет Фев 24, 2006 12:13 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Цитат:
масива с мсксимален брой елементи е <=256

Тука си в грешка градски! Аз имам в момента 2 масива по 256 (точно) и един 2048 на 18F4620.


Пет Фев 24, 2006 1:29 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
аха за анкетата се сещам, много ми е актуално :D
благодаря за отговорите!
@evk, даташийтовете съм си ги изчел доста внимателно, но тя явно не си прочел внимателно поста ми.
4*128 - SFR's(0-0х1f) -3*16(адреси 0х7f-0х70)=368, но 368<256,остава си достатъчно място все пак

но явно моя компилатор не е достатъчно умен да се сети да задели памет в няколко банки,то това ми беше и въпроса всъщност.

ина4е ето така става номера в CCS:

int a1[80],a2[80],a3[96];
int *read,*write;
#locate a1=0x20
#locate a2=0xa0
#locate a3=0x110



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

някой ако знае по умен начин?

@Гого :
"Тука си в грешка градски! Аз имам в момента 2 масива по 256 (точно) и един 2048 на 18F4620."

и как става?

Не ми се е налагало досега да заделям големи масиви в малък PIC
:D


Пет Фев 24, 2006 2:21 pm
Профил ICQ
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Пет Окт 21, 2005 8:45 am
Мнения: 499
Мнение 
setoy написа:
но 368<256


:?: :!: :?: :!: :?:

Колкото и внимателно да го чета, все не го схващам!
Освен ако става въпрос за Неевклидова геометрия.

_________________
Простотията е Божи дар, но човек не бива да парадира с подаръците си!


Пет Фев 24, 2006 2:32 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
eee...PIC-a си има 368 RAM, a na men mi трябва 256 само,какво странно има? Първите 3 банки само за буфера, а всичко останалото наблъскано в 4-тата.


Пет Фев 24, 2006 3:03 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Цитат:
backson

Ако искаш да направиш кръгов буфер с два указателя за четене и запис в него бих могъл да ти дам няколко хватки


мда, точно това искам :)


Пет Фев 24, 2006 3:06 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Цитат:
@Гого :
"Тука си в грешка градски! Аз имам в момента 2 масива по 256 (точно) и един 2048 на 18F4620."

и как става?

Не ми се е налагало досега да заделям големи масиви в малък PIC

Ами 4620 не е много малък. Като ми потрябва С компилатор за 18-ка, ползвам майкрочипския. Там това с големите масиви не е особено голям проблем.


Пет Фев 24, 2006 4:25 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Сря Дек 21, 2005 2:09 pm
Мнения: 145
Мнение 
Я кажи градски как си декларирал масив 2048 байта на С18 без да ползваш няколко по 256, че и аз си блъскам главата тука :) пък ше черпа. Фърли и малко от кода на С


Пет Фев 24, 2006 5:42 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
@bakson, използвай CCS, там тия неща стават без проблем:
Код:
MPASM

CCS PCH C Compiler, Version 3.241, 28193               24-Ôåâðóàðè-06 18:31

               Filename: C:\myfile\prog\pic\c\ccsc\test\test.lst

               ROM used: 64 bytes (0%)
                         Largest free fragment is 65472
               RAM used: 2057 (52%) at main() level
                         2057 (52%) worst case
               Stack:    0 locations

00000 EF02 F000      00001 GOTO   0004
0000                00002 ....................
0000                00003 .................... #include <18F4620.h>
0000                00004 .................... //////// Standard Header file for the PIC18F4620 device ////////////////
0000                00005 .................... #device PIC18F4620
0000                00430 .................... #list
0000                00431 ....................
0000                00432 ....................
0000                00433 .................... void main()
00004 6AF8           00434 CLRF   FF8
00006 9ED0           00435 BCF    FD0.7
00008 6AEA           00436 CLRF   FEA
0000A 6AE9           00437 CLRF   FE9
0000C 50C1           00438 MOVF   FC1,W
0000E 0BC0           00439 ANDLW  C0
00010 090F           00440 IORLW  0F
00012 6EC1           00441 MOVWF  FC1
00014 0E07           00442 MOVLW  07
00016 6EB4           00443 MOVWF  FB4
0000                00444 .................... {
0000                00445 .................... int8 very_long_array_for_pic18f4620[2048];
0000                00446 .................... int16 Counter;
0000                00447 ....................    for( Counter = 0;
00018 0108           00448 MOVLB  8
0001A 6B07           00449 CLRF   x07
0001C 6B06           00450 CLRF   x06
0000                00451 ....................        Counter < sizeof(very_long_array_for_pic18f4620);
0001E 5107           00452 MOVF   x07,W
00020 0807           00453 SUBLW  07
00022 E30D           00454 BNC   003E
0000                00455 ....................        Counter++ ) {
0000                00456 ....................
0000                00457 ....................           very_long_array_for_pic18f4620[Counter] = (int8)(Counter + 1);
00024 0E06           00458 MOVLW  06
00026 2506           00459 ADDWF  x06,W
00028 6EE9           00460 MOVWF  FE9
0002A 0E00           00461 MOVLW  00
0002C 2107           00462 ADDWFC x07,W
0002E 6EEA           00463 MOVWF  FEA
00030 0E01           00464 MOVLW  01
00032 2506           00465 ADDWF  x06,W
00034 6EEF           00466 MOVWF  FEF
0000                00467 ....................        }
00036 2B06           00468 INCF   x06,F
00038 B4D8           00469 BTFSC  FD8.2
0003A 2B07           00470 INCF   x07,F
0003C D7F0           00471 BRA    001E
0000                00472 ....................
0000                00473 .................... }
0003E 0003           0474 SLEEP

SYMBOL TABLE
  LABEL                             VALUE

_RETURN_                          00000001
main.very_long_array_for_pic18f46 00000006
main.Counter                      00000806
PSP_DATA                          00000F83
C1OUT                             00000FB4
C2OUT                             00000FB4
CCP_2                             00000FBB
CCP_2_LOW                         00000FBB
CCP_2_HIGH                        00000FBC
CCP_1                             00000FBE
CCP_1_LOW                         00000FBE
CCP_1_HIGH                        00000FBF
main                              00000004

MEMORY USAGE


_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Фев 24, 2006 7:33 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение Re: PIC +C проблем
setoy написа:
Мъча един 16F88 и стигнах дотам че ми трябва масив от 256 байта с 2 указателя към него. CCS обаче не иска да ми отдели повече от 80-90 байта, дава че нямало достатъчно, макар тая гадинка да има 4 банки по 128, като във всяка най-отгоре са 10-20 байта за служебни регистри, а най долните 16 са "public" ... :x :twisted: дали заради тва "гениално" разпределение компилатора не може да ми отдели памет? Аз бих могъл да си адресирам масива през fsr индиректно като в асемблера и да ползвам първите 3 банки , но как да съм сигурен тогава, че компилатора няма да запише нищо там, смятайки че са свободни?
Все смятам, че трябва да има и по-лесен начин. Някой борил ли се е с нещо подобно?


@setoy, има начин това да го направиш, не се отчайвай така лесно. По подразбиране масивите при 16-ките в CCS се адресират с 8-битов адрес, така че затова не иска да ти отдели повече RAM. Напишо в началото на програмата следното:
Код:
#DEVICE *=16

и пак компилирай. Така ще ти задели нужната памет, стига наистина да я има. При 8-битова адресация ти заделя толкова, колкото е налична в най-празната банка RAM.
Успех !

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Фев 24, 2006 7:38 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 20 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

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


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

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