Отговори на тема  [ 14 мнения ] 
Съобщение [306] ? 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Яну 04, 2006 6:23 pm
Мнения: 43
Местоположение: Earth
Мнение Съобщение [306] ?
Правя една подпрограмка (за 16f8877), която върти последователно на диплея три температури, нещо такова :

Код:
working
      movlw   D'239'      ;изобразява текстов стринг
      movwf   Char_pos
      call   menu_char_1
      call   ADC_Init   
      
work_loop                   bcf   ADCON0,5
      movlw   LCD_Line2
      call   Send_command
      movlw   A'T'      
      call   Send_char
      movlw   A'1'      
      call   Send_char
      movlw   A'='      
      call   Send_char
      call   temp_start1
      movf   tempW1,w
      movwf   tempT1
      
      btfss   sett
      goto   menu_setup
      call   delay_1s      ;Закъснение
      btfss   sett
      goto   menu_setup
      call   delay_1s
      btfss   sett
      goto   menu_setup      
      
      bsf   ADCON0,3
      movlw   LCD_Line2
      call   Send_command
      movlw   A'T'      
      call   Send_char
      movlw   A'2'      
      call   Send_char
      movlw   A'='      
      call   Send_char
      call   temp_start1
      movf   tempW1,w
      movwf   tempT2
      
      btfss   sett
      goto   menu_setup
      call   delay_1s      ;Закъснение
      btfss   sett
      goto   menu_setup      
      call   delay_1s
      btfss   sett
      goto   menu_setup
            
      bcf   ADCON0,3
      bsf   ADCON0,5
      movlw   LCD_Line2
      call   Send_command
      movlw   A'T'      
      call   Send_char
      movlw   A'3'      
      call   Send_char
      movlw   A'='      
      call   Send_char
      call   temp_start1
      movf   tempW1,w
      movwf   tempT3
      
      btfss   sett
      goto   menu_setup
      call   delay_1s      ;Закъснение
      btfss   sett
      goto   menu_setup      
      call   delay_1s
      btfss   sett
      goto   menu_setup
                                ...........


За всяка температура по отделно работи, но за две или трите при Build ми изписва това:
Message[306] : Crossing page boundary -- ensure page bits are set.
за всчки goto и call в подпрограмата и тези водещи до нея. При работа микроконтролера прескача тази подпрогтама и продължава с другата след нея.
Търсих из сайта на майкрочип, разбрах какво значи самото съобщение, но нямам идея къде да търся проблема.


Сря Ное 28, 2007 11:16 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Разгледай програмното пространство на контролера и в коя банка работиш,как се прехвърляш от банка в банка.Това ти е проблема :wink:


Сря Ное 28, 2007 11:59 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Яну 04, 2006 6:23 pm
Мнения: 43
Местоположение: Earth
Мнение 
Абе гледах го, или нещо да не съм догледал :-k
Обаче защо ако е така само, работи :

Код:
working
                     movlw   D'239'      ;изобразява текстов стринг
                     movwf   Char_pos
                     call   menu_char_1
                     call   ADC_Init   
       
work_loop     bcf   ADCON0,5
                    movlw   LCD_Line2
                    call   Send_command
                    movlw   A'T'       
                    call   Send_char
                    movlw   A'1'       
                    call   Send_char
                    movlw   A'='       
                    call   Send_char
                    call   temp_start1
                    movf   tempW1,w
                    movwf   tempT1
       
                    btfss   sett
                    goto   menu_setup
                    call   delay_1s      ;Закъснение
                    btfss   sett
                    goto   menu_setup
                    call   delay_1s
                    btfss   sett
                    goto   menu_setup       


пак ще огледам банките 8-[


Сря Ное 28, 2007 12:11 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Защото програмния ти код е по-къс,събира се в една банка - най-вероятно в bank0 и нямаш безусловно преходи към други банки - bank1,bank2,bank3 или да викаш call програма от друга банка(както предполагам е в твоя случай си в bank1 и викаш подпрограма от bank0 без да си превключил банките :) ). Адресното пространство на 877 не е линейно и превключването на банките се осъществява от 2 бита в регистър PCLATH -> 3 и 4
За това трябва да държиш сметка къде ти сочи програмноя брояч и в коя банка работиш.


Сря Ное 28, 2007 12:30 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Яну 04, 2006 6:23 pm
Мнения: 43
Местоположение: Earth
Мнение 
Много ти благодаря, почна да ми се изяснява ситуацията \:D/


Сря Ное 28, 2007 12:51 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Ако можеш да събереш всички функции, които викаш с call в нулевата страница, ще си спестиш доста главоболия със смятането на преходи :twisted:

@Ки4о, говориш за страниците всъщност, банките са в RAM-а, те са съвсем отделна бира :roll:


Сря Ное 28, 2007 3:56 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Яну 04, 2006 6:23 pm
Мнения: 43
Местоположение: Earth
Мнение 
Верно, прехвърлил съм page0 ( до сега не ми се е случвало :? :D )
#-o Всеки път ли като ползвам подпрограма от page0 в pаgе1, трябва да променям бит 3 и 4 в PCLATH.
Б@@@@си ако е така ще ми се вземе акъла от писане :( Няма ли някоя тънкост ?


Сря Ное 28, 2007 4:25 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 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
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Яну 04, 2006 6:23 pm
Мнения: 43
Местоположение: Earth
Мнение 
Kи4о, мерси и аз се бях замислил за макроси. Но съм още "зелен" и рядко ги ползвам :oops:
За напред в програмата смятам така да го направя.
Но за сега реших да пробвам да сместя това което съм написал до сега в page0.
За тая цел обаче трябва да преместя две таблици които се намират на адреси 0х600 и 0х700
като стигам до тях с помоща на
Код:
movlw   D'6'    
movwf   PCLATH
call  table1

За да влезе кода в page0 тези адреси трябва да станат 0х5АА и 0х631
пробвах да ги достигна с
Код:
movlw     HIGH table1
movwf     PCLATH
call          table1


не се получава, работи само когато таблиците се намират на на адреси 100, 200, 300.....
Къде греша пак :cry:


Сря Ное 28, 2007 5:46 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Цитат:
movlw HIGH table1
movwf PCLATH
call table1

Това нещо не мога да го разбера ? HIGH_table1 ти е регистър а използващ команда за зареждане на w със константа? По-скоро трябва да
ти е: movf HIGH_table1, 0 .На всичкото отгоре HIGH table са 2 думи а трябва да е 1! Виж AN556 на Microchip как се прави


Сря Ное 28, 2007 7:59 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
MegatroniC написа:
Код:
movlw   D'6'    
movwf   PCLATH
call  table1

За да влезе кода в page0 тези адреси трябва да станат 0х5АА и 0х631
пробвах да ги достигна с
Код:
movlw     HIGH table1
movwf     PCLATH
call          table1


не се получава, работи само когато таблиците се намират на на адреси 100, 200, 300.....
Къде греша пак :cry:


в тези редове код, грешка няма. Т.е. сами за себе си са правилни, грешка се получава в някоя друга част от програмата ти, най-добре си пусни симулатора в МПЛАБ-а и ще разбереш къде грешиш.


Сря Ное 28, 2007 8:41 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 30, 2005 4:25 pm
Мнения: 47
Мнение 
Аз ползвам това

Код:
CALL_FAR MACRO Label           ;Позволява да не се съобразяваш с това в коя страница ти се намира процедурата
PAGESEL Label
call Label
PAGESEL $
ENDM


И после се вика

Код:
CALL_FAR етикет_на_функцията;


Вече не помня от къде го бях взел (май някъде из тоя форум беше), но е много полезно и удобно.


Сря Ное 28, 2007 9:48 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Яну 04, 2006 6:23 pm
Мнения: 43
Местоположение: Earth
Мнение 
Ки4о написа:
Това нещо не мога да го разбера ? HIGH_table1 ти е регистър а използващ команда за зареждане на w със константа? По-скоро трябва да
ти е: movf HIGH_table1, 0 .На всичкото отгоре HIGH table са 2 думи а трябва да е 1! Виж AN556 на Microchip как се прави


Да две думи са :) Тая идея я взех от PICDEM2 PLUS демо платката на майкрочип и аз се чудих как но работи без проблеми, когато таблиците се намират на 100,200,300,400 .... адреси :roll:


Чет Ное 29, 2007 9:10 am
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 14 мнения ] 

Кой е на линия

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


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

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