| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Съобщение [306] ? http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=5139 |
Страница 1 от 1 |
| Автор: | MegatroniC [ Сря Ное 28, 2007 11:16 am ] | |||||||||
| Заглавие: | Съобщение [306] ? | |||||||||
Правя една подпрограмка (за 16f8877), която върти последователно на диплея три температури, нещо такова :
За всяка температура по отделно работи, но за две или трите при Build ми изписва това: Message[306] : Crossing page boundary -- ensure page bits are set. за всчки goto и call в подпрограмата и тези водещи до нея. При работа микроконтролера прескача тази подпрогтама и продължава с другата след нея. Търсих из сайта на майкрочип, разбрах какво значи самото съобщение, но нямам идея къде да търся проблема. |
||||||||||
| Автор: | Ки4о [ Сря Ное 28, 2007 11:59 am ] |
| Заглавие: | |
Разгледай програмното пространство на контролера и в коя банка работиш,как се прехвърляш от банка в банка.Това ти е проблема |
|
| Автор: | MegatroniC [ Сря Ное 28, 2007 12:11 pm ] | |||||||||
| Заглавие: | ||||||||||
Абе гледах го, или нещо да не съм догледал
Обаче защо ако е така само, работи :
пак ще огледам банките
|
||||||||||
| Автор: | Ки4о [ Сря Ное 28, 2007 12:30 pm ] |
| Заглавие: | |
Защото програмния ти код е по-къс,събира се в една банка - най-вероятно в bank0 и нямаш безусловно преходи към други банки - bank1,bank2,bank3 или да викаш call програма от друга банка(както предполагам е в твоя случай си в bank1 и викаш подпрограма от bank0 без да си превключил банките За това трябва да държиш сметка къде ти сочи програмноя брояч и в коя банка работиш. |
|
| Автор: | MegatroniC [ Сря Ное 28, 2007 12:51 pm ] |
| Заглавие: | |
Много ти благодаря, почна да ми се изяснява ситуацията
|
|
| Автор: | setoy [ Сря Ное 28, 2007 3:56 pm ] |
| Заглавие: | |
Ако можеш да събереш всички функции, които викаш с call в нулевата страница, ще си спестиш доста главоболия със смятането на преходи @Ки4о, говориш за страниците всъщност, банките са в RAM-а, те са съвсем отделна бира |
|
| Автор: | MegatroniC [ Сря Ное 28, 2007 4:25 pm ] |
| Заглавие: | |
Верно, прехвърлил съм page0 ( до сега не ми се е случвало Всеки път ли като ползвам подпрограма от page0 в pаgе1, трябва да променям бит 3 и 4 в PCLATH.
Б@@@@си ако е така ще ми се вземе акъла от писане |
|
| Автор: | Ки4о [ Сря Ное 28, 2007 5:17 pm ] |
| Заглавие: | |
Виж бе чудо,ето ти пример: Използваш макроси 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:19 pm ] |
| Заглавие: | |
Всеки път когато ти се налага да правиш GOTO Или CALL и преходите или подпрограмите ти се намират в различни страници от програмната памет, ще тгрябва да се коригира регистър PCLATH, за по-лесно можеш да ползваш директивата PAGESEL на асемблера в МПЛАБ, преди инструкцията която прави преход или извикване, но това не е валидно винаги и трябва да се ползва внимателно. По удобния вариант е да пишеш на C. |
|
| Автор: | MegatroniC [ Сря Ное 28, 2007 5:46 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Kи4о, мерси и аз се бях замислил за макроси. Но съм още "зелен" и рядко ги ползвам За напред в програмата смятам така да го направя. Но за сега реших да пробвам да сместя това което съм написал до сега в page0. За тая цел обаче трябва да преместя две таблици които се намират на адреси 0х600 и 0х700 като стигам до тях с помоща на
За да влезе кода в page0 тези адреси трябва да станат 0х5АА и 0х631 пробвах да ги достигна с
не се получава, работи само когато таблиците се намират на на адреси 100, 200, 300..... Къде греша пак |
|||||||||||||||||||
| Автор: | Ки4о [ Сря Ное 28, 2007 7:59 pm ] | |||||||||
| Заглавие: | ||||||||||
Това нещо не мога да го разбера ? HIGH_table1 ти е регистър а използващ команда за зареждане на w със константа? По-скоро трябва да ти е: movf HIGH_table1, 0 .На всичкото отгоре HIGH table са 2 думи а трябва да е 1! Виж AN556 на Microchip как се прави |
||||||||||
| Автор: | Ники [ Сря Ное 28, 2007 8:41 pm ] | |||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||
в тези редове код, грешка няма. Т.е. сами за себе си са правилни, грешка се получава в някоя друга част от програмата ти, най-добре си пусни симулатора в МПЛАБ-а и ще разбереш къде грешиш. |
||||||||||||||||||||||||||||
| Автор: | IceBurn [ Сря Ное 28, 2007 9:48 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Аз ползвам това
И после се вика
Вече не помня от къде го бях взел (май някъде из тоя форум беше), но е много полезно и удобно. |
|||||||||||||||||||
| Автор: | MegatroniC [ Чет Ное 29, 2007 9:10 am ] | |||||||||
| Заглавие: | ||||||||||
Да две думи са |
||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|