Отговори на тема  [ 12 мнения ] 
проблем на начинаещ с PIC18 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Юни 06, 2006 11:33 pm
Мнения: 13
Мнение проблем на начинаещ с 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 6:20 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
http://www.mcu-bg.com/mcu_site/viewtopi ... ght=pclath
Помисли върху думите на Bezmozachen.

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


Пет Юли 14, 2006 8:41 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

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


Пет Юли 14, 2006 9:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Коя версия използваш ? Сигурен ли си, че си задал на симулатора, че твоят процесор е F458 ?

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


Пет Юли 14, 2006 9:39 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
@Elmech, първата основна разлика между 16-ка и 18-ка е размера на FLASH, в 18-ките е 16-bit :wink:
Просто пишеш 2-пъти по голямо число в W при 18-ките - примерно искаш да скочиш на 3-ти ред, пишеш числото 6, искаш на 8-ми ред, пишеш 16 :)


Пет Юли 14, 2006 9:51 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Юни 06, 2006 11:33 pm
Мнения: 13
Мнение 
Predator_MF, като стигне до този ред с :
ADDWF PCL,f , просто умира, или стои там на същия ред( в дебъгера), или в някой вариант скачаше направо на 00

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


Пет Юли 14, 2006 10:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
При мен работи твоя код, само че за 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.


Съб Юли 15, 2006 12:42 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Ето едно примерче:
Код:
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 инструкция.


Съб Юли 15, 2006 12:36 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
Извинявай, но ми отбягва идеята

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

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

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

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Нед Юли 16, 2006 3:10 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
the_real_maniac написа:
защо направо не зареждаш литерала в WREG :-?

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


Нед Юли 16, 2006 7:40 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Апр 27, 2005 2:47 pm
Мнения: 349
Местоположение: Varna
Мнение 
Още едно примерче за "computed goto".
Код:
               
      rlncf   arg,W
      addlw   6
      addwf   PCL,W
      btfsc     STATUS,C               
      incf   PCLATH,F
      movwf   PCL

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


Пон Юли 17, 2006 12:02 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

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


Пон Юли 17, 2006 4:47 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

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


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

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