| Автор |
Съобщение |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
 Съобщение [306] ?
Правя една подпрограмка (за 16f8877), която върти последователно на диплея три температури, нещо такова :
За всяка температура по отделно работи, но за две или трите при Build ми изписва това:
Message[306] : Crossing page boundary -- ensure page bits are set.
за всчки goto и call в подпрограмата и тези водещи до нея. При работа микроконтролера прескача тази подпрогтама и продължава с другата след нея.
Търсих из сайта на майкрочип, разбрах какво значи самото съобщение, но нямам идея къде да търся проблема.
|
| Сря Ное 28, 2007 11:16 am |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Разгледай програмното пространство на контролера и в коя банка работиш,как се прехвърляш от банка в банка.Това ти е проблема 
|
| Сря Ное 28, 2007 11:59 am |
|
 |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
Абе гледах го, или нещо да не съм догледал
Обаче защо ако е така само, работи :
пак ще огледам банките 
|
| Сря Ное 28, 2007 12:11 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Защото програмния ти код е по-къс,събира се в една банка - най-вероятно в bank0 и нямаш безусловно преходи към други банки - bank1,bank2,bank3 или да викаш call програма от друга банка(както предполагам е в твоя случай си в bank1 и викаш подпрограма от bank0 без да си превключил банките  ). Адресното пространство на 877 не е линейно и превключването на банките се осъществява от 2 бита в регистър PCLATH -> 3 и 4
За това трябва да държиш сметка къде ти сочи програмноя брояч и в коя банка работиш.
|
| Сря Ное 28, 2007 12:30 pm |
|
 |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
Много ти благодаря, почна да ми се изяснява ситуацията 
|
| Сря Ное 28, 2007 12:51 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Ако можеш да събереш всички функции, които викаш с call в нулевата страница, ще си спестиш доста главоболия със смятането на преходи
@Ки4о, говориш за страниците всъщност, банките са в RAM-а, те са съвсем отделна бира 
|
| Сря Ное 28, 2007 3:56 pm |
|
 |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
Верно, прехвърлил съм page0 ( до сега не ми се е случвало  )
 Всеки път ли като ползвам подпрограма от page0 в pаgе1, трябва да променям бит 3 и 4 в PCLATH.
Б@@@@си ако е така ще ми се вземе акъла от писане  Няма ли някоя тънкост ?
|
| Сря Ное 28, 2007 4:25 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Виж бе чудо,ето ти пример:
Използваш макроси
bank0 MACRO
bcf PCLATH,3
bcf PCLATH,4
ENDM
bank1 MACRO
bsf PCLATH,3
bcf PCLATH,4
ENDM
bank2 MACRO
bcf PCLATH,3
bsf PCLATH,4
ENDM
bank3 MACRO
bsf PCLATH,3
bsf PCLATH,4
ENDM
И как го правиш(парче от работеща програма):
bcf FLAG_1,3 ; нулираш си някакъв бит в регистър
bank3 ;превключваш банката
CALL SCAN_KBD;подпрограмата за обработка на клавиатурата ти е в банка 3
bank0 ;минаваш си в банка 0
bsf FLAG_2,2 ;сетваш си някакъв бит в регистър
и така
|
| Сря Ное 28, 2007 5:17 pm |
|
 |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
Всеки път когато ти се налага да правиш GOTO Или CALL и преходите или подпрограмите ти се намират в различни страници от програмната памет, ще тгрябва да се коригира регистър PCLATH, за по-лесно можеш да ползваш директивата PAGESEL на асемблера в МПЛАБ, преди инструкцията която прави преход или извикване, но това не е валидно винаги и трябва да се ползва внимателно.
По удобния вариант е да пишеш на C.
|
| Сря Ное 28, 2007 5:19 pm |
|
 |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
Kи4о, мерси и аз се бях замислил за макроси. Но съм още "зелен" и рядко ги ползвам
За напред в програмата смятам така да го направя.
Но за сега реших да пробвам да сместя това което съм написал до сега в page0.
За тая цел обаче трябва да преместя две таблици които се намират на адреси 0х600 и 0х700
като стигам до тях с помоща на
За да влезе кода в page0 тези адреси трябва да станат 0х5АА и 0х631 пробвах да ги достигна с
не се получава, работи само когато таблиците се намират на на адреси 100, 200, 300.....
Къде греша пак 
|
| Сря Ное 28, 2007 5:46 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Това нещо не мога да го разбера ? HIGH_table1 ти е регистър а използващ команда за зареждане на w със константа? По-скоро трябва да
ти е: movf HIGH_table1, 0 .На всичкото отгоре HIGH table са 2 думи а трябва да е 1! Виж AN556 на Microchip как се прави
|
| Сря Ное 28, 2007 7:59 pm |
|
 |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
в тези редове код, грешка няма. Т.е. сами за себе си са правилни, грешка се получава в някоя друга част от програмата ти, най-добре си пусни симулатора в МПЛАБ-а и ще разбереш къде грешиш.
|
| Сря Ное 28, 2007 8:41 pm |
|
 |
|
IceBurn
Ранг: Минаващ
Регистриран на: Нед Яну 30, 2005 4:25 pm Мнения: 47
|
Аз ползвам това
И после се вика
Вече не помня от къде го бях взел (май някъде из тоя форум беше), но е много полезно и удобно.
|
| Сря Ное 28, 2007 9:48 pm |
|
 |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
Да две думи са  Тая идея я взех от PICDEM2 PLUS демо платката на майкрочип и аз се чудих как но работи без проблеми, когато таблиците се намират на 100,200,300,400 .... адреси 
|
| Чет Ное 29, 2007 9:10 am |
|
|