Микроконтролери и електроника
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), която върти последователно на диплея три температури, нещо такова :

Код:
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 в подпрограмата и тези водещи до нея. При работа микроконтролера прескача тази подпрогтама и продължава с другата след нея.
Търсих из сайта на майкрочип, разбрах какво значи самото съобщение, но нямам идея къде да търся проблема.

Автор:  Ки4о [ Сря Ное 28, 2007 11:59 am ]
Заглавие: 

Разгледай програмното пространство на контролера и в коя банка работиш,как се прехвърляш от банка в банка.Това ти е проблема :wink:

Автор:  MegatroniC [ Сря Ное 28, 2007 12:11 pm ]
Заглавие: 

Абе гледах го, или нещо да не съм догледал :-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-[

Автор:  Ки4о [ Сря Ное 28, 2007 12:30 pm ]
Заглавие: 

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

Автор:  MegatroniC [ Сря Ное 28, 2007 12:51 pm ]
Заглавие: 

Много ти благодаря, почна да ми се изяснява ситуацията \:D/

Автор:  setoy [ Сря Ное 28, 2007 3:56 pm ]
Заглавие: 

Ако можеш да събереш всички функции, които викаш с call в нулевата страница, ще си спестиш доста главоболия със смятането на преходи :twisted:

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

Автор:  MegatroniC [ Сря Ное 28, 2007 4:25 pm ]
Заглавие: 

Верно, прехвърлил съм page0 ( до сега не ми се е случвало :? :D )
#-o Всеки път ли като ползвам подпрограма от 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о, мерси и аз се бях замислил за макроси. Но съм още "зелен" и рядко ги ползвам :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:

Автор:  Ки4о [ Сря Ное 28, 2007 7:59 pm ]
Заглавие: 

Цитат:
movlw HIGH table1
movwf PCLATH
call table1

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

Автор:  Ники [ Сря Ное 28, 2007 8:41 pm ]
Заглавие: 

MegatroniC написа:
Код:
movlw   D'6'    
movwf   PCLATH
call  table1

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


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


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

Автор:  IceBurn [ Сря Ное 28, 2007 9:48 pm ]
Заглавие: 

Аз ползвам това

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


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

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


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

Автор:  MegatroniC [ Чет Ное 29, 2007 9:10 am ]
Заглавие: 

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


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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/