|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 5:15 pm
|
Страница 1 от 1
|
[ 12 мнения ] |
|
проблем на начинаещ с PIC18
| Автор |
Съобщение |
|
Elmech
Ранг: Минаващ
Регистриран на: Вто Юни 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
|
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пет Юли 14, 2006 8:41 pm |
|
 |
|
Elmech
Ранг: Минаващ
Регистриран на: Вто Юни 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 |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
@Elmech, първата основна разлика между 16-ка и 18-ка е размера на FLASH, в 18-ките е 16-bit
Просто пишеш 2-пъти по голямо число в W при 18-ките - примерно искаш да скочиш на 3-ти ред, пишеш числото 6, искаш на 8-ми ред, пишеш 16 
|
| Пет Юли 14, 2006 9:51 pm |
|
 |
|
Elmech
Ранг: Минаващ
Регистриран на: Вто Юни 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 |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
При мен работи твоя код, само че за 18F452, я погледни какво става с PCH на тоя ред ADDWF PCL,f ...да не би да гази някъде в лопуша там, бях мернал, че при някой 18-ки трябва да тъпчеш и в PCH
ето какво пише за 18-ките, в графа PCL, PCLATH and PCLATHU
Btw, има доста по-добър начин за съхранение на данни в таблица, ползвай TBLPTR и ТABLAT за директно писане/четене на FLASH-а, така можеш да съхраниш 2 байта в една инструкция, за разлика от computed goto метода с таблиците, където съхраняваш само един, тъй като другия е зает от инструкцията RETLW.
|
| Съб Юли 15, 2006 12:42 am |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 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 |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
Извинявай, но ми отбягва идеята
да изчистя WREG и да го събера с литерал
0 + х = х , защо направо не зареждаш литерала в WREG
/съмнявам се някакъв бъг да се избягва, но със сигурност на мен ми бяга идеята 
|
| Нед Юли 16, 2006 3:10 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
Така е, за да стане като ADDWF PCL,f (или поне да прилича;))
Например:18+9=? Като събереш 8 и 9, слагаш ли 1 на ум
Ако масива започва например от адрес 0x4FC, тогава трябва да се напише така, защото... сети се сам
Ако не преминава в другата "страница", тогава може директно да си заредиш адреса на масива, без тази "гимнастика" със събирането.
Дал съм така примера, защото е най-универсално (според мене).
|
| Нед Юли 16, 2006 7:40 pm |
|
 |
|
Bezmozachen
Ранг: Популярен
Регистриран на: Сря Апр 27, 2005 2:47 pm Мнения: 349 Местоположение: Varna
|
Още едно примерче за "computed goto".
Третата инструкция обновява PCLATH и при нужда след това се коригира. Така този код работи навсякъде в памета.
|
| Пон Юли 17, 2006 12:02 pm |
|
 |
|
Elmech
Ранг: Минаващ
Регистриран на: Вто Юни 06, 2006 11:33 pm Мнения: 13
|
 ?
Благодаря за примерите, досега не съм работил с командите за таблица и ще ги разуча. Но това което ви написах досега винаги ми е работило (като се има напредвид и преноса за старшия байт на PC). Но чудното е че същата програма ,същия асемблерен код на другия ден работи без грешка, пробвах го няколко пъти, без промяна на никакви настройки в работното поле. Така както не работеше предния ден (дори след рестарт на MPASM) .Отдавам го на това, че пробвах да симулирам кода и схемата в Proteus 6.9,но не можах да го излъжа да тръгне. Въпреки че го затворих и продължих на асемблер, сигурно някой драйвер е останал в RAM на компа, и не се презарежда отново, а си го ползва същия. Но със сигурност като не вървеше затворих всички програми и ги рестартирах отново,(не и Windows)
Ако някой има работещо копие на Proteus6.... с PIC- симулации, моля да ми помогне да го пусна.
|
| Пон Юли 17, 2006 4:47 pm |
|
|
|
Страница 1 от 1
|
[ 12 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|