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

проблем на начинаещ с PIC18
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=2655
Страница 1 от 1

Автор:  Elmech [ Пет Юли 14, 2006 6:20 pm ]
Заглавие:  проблем на начинаещ с PIC18

table ADDWF PCL,f ; таблица за прекодиране на BCD в седемсегментен код
RETLW 0x7F ; 0 в седемсегментен код
RETLW 0x0C ; 1 в седемсегментен код
RETLW 0xB6 ; 2 в седемсегментен код
RETLW 0x9F ; 3 в седемсегментен код
RETLW 0xCC ; 4 в седемсегментен код
RETLW 0xDA ; 5 в седемсегментен код
RETLW 0xFA ; 6 в седемсегментен код
RETLW 0x0F ; 7 в седемсегментен код
RETLW 0xFF ; 8 в седемсегментен код
RETLW 0xDF ; 9 в седемсегментен код
RETLW 0x00 ; - в седемсегментен код
като тествам програмата в MPASM (Wreg примерно равен на 2 или 3), брояча на командите PCL се увеличава с 2, а реда на който е дебъгера остава същия - (таble), сякаш това не е команда за събиране.
какво съм пропуснал да прочета за PIC18F458 ?

Автор:  [ Пет Юли 14, 2006 8:41 pm ]
Заглавие: 

http://www.mcu-bg.com/mcu_site/viewtopi ... ght=pclath
Помисли върху думите на Bezmozachen.

Автор:  Elmech [ Пет Юли 14, 2006 9:10 pm ]
Заглавие: 

изпробвах и запис на старшия бит на таблицата директно на PCLATH, резултатът е пак отрицателен.
Направо не може да се промени стойността на PCL-пробвах да събирам в Wreg и после само да го запиша,пак не става/
Преди съм използвал тази конструкция няколко пъти на ПИк16 Ф877А и не съм имал проблеми.
Дали не е от MPASM - защото PCL го виждам как се увеличава с по 2, ( на прозореца с регисрите), а реда на изпълнение на командата от дебъгера направо не се мести, стои на същия ред.
Пробвах и компилация от различни адреси, както и на хулевата страница, без преход към старшия разряд......

Автор:  [ Пет Юли 14, 2006 9:39 pm ]
Заглавие: 

Коя версия използваш ? Сигурен ли си, че си задал на симулатора, че твоят процесор е F458 ?

Автор:  Predator_MF [ Пет Юли 14, 2006 9:51 pm ]
Заглавие: 

@Elmech, първата основна разлика между 16-ка и 18-ка е размера на FLASH, в 18-ките е 16-bit :wink:
Просто пишеш 2-пъти по голямо число в W при 18-ките - примерно искаш да скочиш на 3-ти ред, пишеш числото 6, искаш на 8-ми ред, пишеш 16 :)

Автор:  Elmech [ Пет Юли 14, 2006 10:26 pm ]
Заглавие: 

Predator_MF, като стигне до този ред с :
ADDWF PCL,f , просто умира, или стои там на същия ред( в дебъгера), или в някой вариант скачаше направо на 00

MPLAB v7.40, за F458 e сигурно, дори пробвах кода и с 16 f 877- същото е положението, но го пробвах набързо, утре повече...

Автор:  Predator_MF [ Съб Юли 15, 2006 12:42 am ]
Заглавие: 

При мен работи твоя код, само че за 18F452, я погледни какво става с PCH на тоя ред ADDWF PCL,f ...да не би да гази някъде в лопуша там, бях мернал, че при някой 18-ки трябва да тъпчеш и в PCH

ето какво пише за 18-ките, в графа PCL, PCLATH and PCLATHU
Цитат:
The PC addresses bytes in the program memory. To
prevent the PC from becoming misaligned with word
instructions, the LSB of PCL is fixed to a value of’0’.
The PC increments by 2 to address sequential instructions
in the program memory.


Btw, има доста по-добър начин за съхранение на данни в таблица, ползвай TBLPTR и ТABLAT за директно писане/четене на FLASH-а, така можеш да съхраниш 2 байта в една инструкция, за разлика от computed goto метода с таблиците, където съхраняваш само един, тъй като другия е зает от инструкцията RETLW.

Автор:  Gogo [ Съб Юли 15, 2006 12:36 pm ]
Заглавие: 

Ето едно примерче:
Код:
rd_segment:
   addlw   low table
   movwf   TBLPTRL
   clrf   WREG
   addlw   high table
   movwf   TBLPTRH
   clrf   TBLPTRU
   TBLRD*

table:
db   0x7f,0x0C,0xB6,0x9F,0xCC,0xDA,0xFA,0x0F,0xFF,0xDF,0x00

Прочетеното от таблицата е в ТABLAT.
Сега трябва да ти се е изяснило как и защо се ползва TBLPTR.
Друг вариант е да си направиш масива в RAM-а и да го четаш с някой FSR регистур с PLUSW инструкция.

Автор:  the_real_maniac [ Нед Юли 16, 2006 3:10 pm ]
Заглавие: 

Извинявай, но ми отбягва идеята

да изчистя WREG и да го събера с литерал :?

0 + х = х , защо направо не зареждаш литерала в WREG :-?

/съмнявам се някакъв бъг да се избягва, но със сигурност на мен ми бяга идеята :-)

Автор:  Gogo [ Нед Юли 16, 2006 7:40 pm ]
Заглавие: 

the_real_maniac написа:
защо направо не зареждаш литерала в WREG :-?

Така е, за да стане като ADDWF PCL,f (или поне да прилича;))
Например:18+9=? Като събереш 8 и 9, слагаш ли 1 на ум :lol:
Ако масива започва например от адрес 0x4FC, тогава трябва да се напише така, защото... сети се сам :D
Ако не преминава в другата "страница", тогава може директно да си заредиш адреса на масива, без тази "гимнастика" със събирането.
Дал съм така примера, защото е най-универсално (според мене).

Автор:  Bezmozachen [ Пон Юли 17, 2006 12:02 pm ]
Заглавие: 

Още едно примерче за "computed goto".
Код:
               
      rlncf   arg,W
      addlw   6
      addwf   PCL,W
      btfsc     STATUS,C               
      incf   PCLATH,F
      movwf   PCL

Третата инструкция обновява PCLATH и при нужда след това се коригира. Така този код работи навсякъде в памета.

Автор:  Elmech [ Пон Юли 17, 2006 4:47 pm ]
Заглавие:  ?

Благодаря за примерите, досега не съм работил с командите за таблица и ще ги разуча. Но това което ви написах досега винаги ми е работило (като се има напредвид и преноса за старшия байт на PC). Но чудното е че същата програма ,същия асемблерен код на другия ден работи без грешка, пробвах го няколко пъти, без промяна на никакви настройки в работното поле. Така както не работеше предния ден (дори след рестарт на MPASM) .Отдавам го на това, че пробвах да симулирам кода и схемата в Proteus 6.9,но не можах да го излъжа да тръгне. Въпреки че го затворих и продължих на асемблер, сигурно някой драйвер е останал в RAM на компа, и не се презарежда отново, а си го ползва същия. Но със сигурност като не вървеше затворих всички програми и ги рестартирах отново,(не и Windows)
Ако някой има работещо копие на Proteus6.... с PIC- симулации, моля да ми помогне да го пусна.

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