Помогите. никак немогу разобраться с банками данных т.к объем перевалил за 2кб. В коде большое к-во табличных данных при компиляции выдает code crosses boundary @ 800h. pic16f877a. читание мануалов по работе так и не помогло кусок кода
define osc 20 input portb.0 imp var word obor var word perem var word yoz var word grad var word takt var word i var byte zad var word B4 var byte DEFINE LCD_DREG PORTd DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTd DEFINE LCD_RSBIT 2 DEFINE LCD_EREG PORTd DEFINE LCD_EBIT 3 DEFINE LCD_BITS 4 DEFINE LCD_LINES 4 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50
clear start: clear for i = 0 to 3 pulsin portb.0,0,imp 'замер длительности импульса на датчике равный 1/8 оборота рв perem=perem+imp next i ' получаю длительность четверти оборота рв (1/2 об кв) imp=perem takt=imp*2 'получаю микросек/(1/2)об perem=imp/20 obor=57300/perem*13 'ВЫЧИСЛЯЮ ОБ/МИН подобрано подбором grad=takt/18 'значение одного градуса *10
'таблица УОЗ для центробежного регулятора if takt<30000 then yoz=takt-grad*0/100 if takt<29268 then yoz=takt-grad*18/100 if takt<28571 then yoz=takt-grad*36/100 if takt<27907 then yoz=takt-grad*54/100 if takt<27273 then yoz=takt-grad*72/100 if takt<26667 then yoz=takt-grad*90/100 if takt<26087 then yoz=takt-grad*108/100 if takt<25532 then yoz=takt-grad*126/100 if takt<25000 then yoz=takt-grad*144/100 if takt<24490 then yoz=takt-grad*162/100 if takt<24000 then yoz=takt-grad*180/100 if takt<23529 then yoz=takt-grad*198/100 if takt<23077 then yoz=takt-grad*216/100 if takt<22642 then yoz=takt-grad*234/100 if takt<22222 then yoz=takt-grad*252/100 if takt<21818 then yoz=takt-grad*270/100 if takt<21429 then yoz=takt-grad*288/100 if takt<21053 then yoz=takt-grad*306/100 if takt<20690 then yoz=takt-grad*324/100 if takt<20339 then yoz=takt-grad*342/100 if takt<20000 then yoz=takt-grad*360/100 if takt<19672 then yoz=takt-grad*378/100 if takt<19355 then yoz=takt-grad*396/100 if takt<19048 then yoz=takt-grad*414/100 if takt<18750 then yoz=takt-grad*432/100 if takt<18462 then yoz=takt-grad*450/100 if takt<18182 then yoz=takt-grad*468/100 if takt<17910 then yoz=takt-grad*486/100 if takt<17647 then yoz=takt-grad*504/100 if takt<17391 then yoz=takt-grad*522/100 if takt<17143 then yoz=takt-grad*540/100 if takt<16901 then yoz=takt-grad*558/100 if takt<16667 then yoz=takt-grad*576/100 if takt<16438 then yoz=takt-grad*594/100 if takt<16216 then yoz=takt-grad*612/100 if takt<16000 then yoz=takt-grad*630/100 if takt<15789 then yoz=takt-grad*648/100 if takt<15584 then yoz=takt-grad*666/100 if takt<15385 then yoz=takt-grad*684/100 if takt<15190 then yoz=takt-grad*702/100 if takt<15000 then yoz=takt-grad*720/100 if takt<14815 then yoz=takt-grad*738/100 if takt<14634 then yoz=takt-grad*756/100 if takt<14458 then yoz=takt-grad*774/100 if takt<14286 then yoz=takt-grad*792/100 if takt<14118 then yoz=takt-grad*810/100 if takt<13953 then yoz=takt-grad*828/100 if takt<13793 then yoz=takt-grad*846/100 if takt<13636 then yoz=takt-grad*864/100 if takt<13483 then yoz=takt-grad*882/100 if takt<13333 then yoz=takt-grad*900/100 if takt<13187 then yoz=takt-grad*918/100 if takt<13043 then yoz=takt-grad*936/100 if takt<12903 then yoz=takt-grad*954/100 if takt<12766 then yoz=takt-grad*972/100 if takt<12632 then yoz=takt-grad*990/100 if takt<12500 then yoz=takt-grad*1008/100 if takt<12371 then yoz=takt-grad*1026/100 if takt<12245 then yoz=takt-grad*1044/100 if takt<12121 then yoz=takt-grad*1062/100 if takt<12000 then yoz=takt-grad*1080/100 if takt<11881 then yoz=takt-grad*1098/100 if takt<11765 then yoz=takt-grad*1116/100 if takt<11650 then yoz=takt-grad*1134/100 if takt<11538 then yoz=takt-grad*1152/100 if takt<11429 then yoz=takt-grad*1170/100 if takt<11321 then yoz=takt-grad*1188/100 if takt<11215 then yoz=takt-grad*1206/100 if takt<11111 then yoz=takt-grad*1224/100 if takt<11009 then yoz=takt-grad*1242/100 if takt<10909 then yoz=takt-grad*1260/100 if takt<10811 then yoz=takt-grad*1278/100 if takt<10714 then yoz=takt-grad*1296/100
LCDOUT $FE, 1,dec imp lcdout $FE, $C0,dec obor," ",dec grad lcdout $FE, $94,dec takt," ",dec yoz pause 500 goto start END
Сообщение отредактировал
evgta - Вс, 12.12.2010, 23:17
Схожая тема затрагивалась. По моемУ опыту (на Протоне) у вас декларированно под ряд очень много переменных word типа. Попробуйте попробовать всунуть надуманные переменные между ними типа byte и желательно не по одному. Если даст бог и такой приём поможет, то потом пробуйте эти чужаки по одному вычеркивать. Удачи!
Спасибо. В Протоне с таким рядом проблем нет также как и в PICsimulator. Но с протоном пока еще неразобрался толком, а PICsimulator недостаточен . Щас буду пытаться пробовать делать вставки.
Втавки непомогают
Сообщение отредактировал
evgta - Пн, 13.12.2010, 16:04
у вас декларированно под ряд очень много переменных word типа
Да не много 7 word и 1 bit. Итого 15 бит для переменных. Косяк кроется только лишь в постоянном пересчете одой и той же формулы, но с разными значениями углов. Достаточно просто добавить еще одну переменную типа Word в которую по условию будет заноситься значения углов, а в конце уже вставить формулу. UGOL var word ...... if takt<30000 then UGOL=0 так же исправить для всех условий ...... yoz=takt-grad*UGOL/100 вставить перед LCDOUT $FE, 1,dec imp
Жаль. Пробуйте уменьшить число этих word. Прикинте все свои wordы под byte - если так идёт, пробуйте менять по одному на word пока не вылезет неприятность. Удачи
Перевел. Да. памяти конечно прилично сэкономило. Но проблему не решило т.к это был только кусок кода и при добавлении новых строк компилить больше 2килослов нехочет
Quote (retas)
Пробуйте уменьшить число этих word
Проверил все переменныею непонятки с переменной takt съедает больше 1.5 кб при ее переводе с BYTE на WORD и при переходе за 2кб прога снова не компилится
define osc 20 input portb.0 imp var word obor var word perem var word yoz var word grad var word takt var word tak var word i var byte ugol var word DEFINE LCD_DREG PORTd DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTd DEFINE LCD_RSBIT 2 DEFINE LCD_EREG PORTd DEFINE LCD_EBIT 3 DEFINE LCD_BITS 4 DEFINE LCD_LINES 4 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50 clear start: clear for i = 0 to 3 pulsin portb.0,0,imp 'замер длительности импульса на датчике равный 1/8 оборота рв perem=perem+imp next i ' получаю длительность четверти оборота рв (1/2 об кв) imp=perem takt=imp*2 'получаю микросек/(1/2)об perem=imp/20 obor=57300/perem*13 'ВЫЧИСЛЯЮ ОБ/МИН подобрано подбором grad=takt/18 'значение одного градуса *10
gosub razchet
LCDOUT $FE, 1,dec imp lcdout $FE, $C0,dec obor," ",dec grad lcdout $FE, $94,dec takt," ",dec yoz pause 500 goto start END razchet: 'таблица УОЗ для центробежного регулятора if takt< 30000 then ugol= 0 if takt< 29268 then ugol= 18 if takt< 28571 then ugol= 36 if takt< 27907 then ugol= 54 if takt< 27273 then ugol= 72 if takt< 26667 then ugol= 90 if takt< 26087 then ugol= 108 if takt< 25532 then ugol= 126 if takt< 25000 then ugol= 144 if takt< 24490 then ugol= 162 if takt< 24000 then ugol= 180 if takt< 23529 then ugol= 198 if takt< 23077 then ugol= 216 if takt< 22642 then ugol= 234 if takt< 22222 then ugol= 252 if takt< 21818 then ugol= 270 if takt< 21429 then ugol= 288 if takt< 21053 then ugol= 306 if takt< 20690 then ugol= 324 if takt< 20339 then ugol= 342 if takt< 20000 then ugol= 360 if takt< 19672 then ugol= 378 if takt< 19355 then ugol= 396 if takt< 19048 then ugol= 414 if takt< 18750 then ugol= 432 if takt< 18462 then ugol= 450 if takt< 18182 then ugol= 468 if takt< 17910 then ugol= 486 if takt< 17647 then ugol= 504 if takt< 17391 then ugol= 522 if takt< 17143 then ugol= 540 if takt< 16901 then ugol= 558 if takt< 16667 then ugol= 576 if takt< 16438 then ugol= 594 if takt< 16216 then ugol= 612 if takt< 16000 then ugol= 630 if takt< 15789 then ugol= 648 if takt< 15584 then ugol= 666 if takt< 15385 then ugol= 684 if takt< 15190 then ugol= 702 if takt< 15000 then ugol= 720 if takt< 14815 then ugol= 738 if takt< 14634 then ugol= 756 if takt< 14458 then ugol= 774 if takt< 14286 then ugol= 792 if takt< 14118 then ugol= 810 if takt< 13953 then ugol= 828 if takt< 13793 then ugol= 846 if takt< 13636 then ugol= 864 if takt< 13483 then ugol= 882 if takt< 13333 then ugol= 900 if takt< 13187 then ugol= 918 if takt< 13043 then ugol= 936 if takt< 12903 then ugol= 954 if takt< 12766 then ugol= 972 if takt< 12632 then ugol= 990 if takt< 12500 then ugol= 1008 if takt< 12371 then ugol= 1026 if takt< 12245 then ugol= 1044 if takt< 12121 then ugol= 1062 if takt< 12000 then ugol= 1080 if takt< 11881 then ugol= 1098 if takt< 11765 then ugol= 1116 if takt< 11650 then ugol= 1134 if takt< 11538 then ugol= 1152 if takt< 11429 then ugol= 1170 if takt< 11321 then ugol= 1188 if takt< 11215 then ugol= 1206 if takt< 11111 then ugol= 1224 if takt< 11009 then ugol= 1242 if takt< 10909 then ugol= 1260 if takt< 10811 then ugol= 1278 if takt< 10714 then ugol= 1296 if takt< 10526 then ugol= 1300 if takt< 10345 then ugol= 1324 if takt< 10169 then ugol= 1348 if takt< 10000 then ugol= 1372 if takt< 9836 then ugol= 1396 if takt< 9677 then ugol= 1420 if takt< 9524 then ugol= 1444 if takt< 9375 then ugol= 1468 if takt< 9231 then ugol= 1492 if takt< 9091 then ugol= 1516 if takt< 8955 then ugol= 1540 if takt< 8824 then ugol= 1564 if takt< 8696 then ugol= 1588 if takt< 8571 then ugol= 1612 if takt< 8451 then ugol= 1636 if takt< 8333 then ugol= 1660 if takt< 8219 then ugol= 1684 if takt< 8108 then ugol= 1708 if takt< 8000 then ugol= 1732 if takt< 7895 then ugol= 1756 if takt< 7792 then ugol= 1780 if takt< 7692 then ugol= 1804 if takt< 7595 then ugol= 1828 if takt< 7500 then ugol= 1852 if takt< 7407 then ugol= 1876 if takt< 7317 then ugol= 1900 if takt< 7229 then ugol= 1924 if takt< 7143 then ugol= 1948 if takt< 7059 then ugol= 1972 if takt< 6977 then ugol= 1996 if takt< 6897 then ugol= 2020 if takt< 6818 then ugol= 2044 if takt< 6742 then ugol= 2068 if takt< 6667 then ugol= 2092 if takt< 6593 then ugol= 2116 if takt< 6522 then ugol= 2140 if takt< 6452 then ugol= 2164 if takt< 6383 then ugol= 2188 if takt< 6316 then ugol= 2212 if takt< 6250 then ugol= 2236 if takt< 6186 then ugol= 2260 if takt< 6122 then ugol= 2284 if takt< 6061 then ugol= 2308 if takt< 6000 then ugol= 2332 if takt< 5941 then ugol= 2356 if takt< 5882 then ugol= 2380 yoz=takt-grad*ugol/100 return
Сообщение отредактировал
evgta - Пн, 13.12.2010, 20:55
непонятки с переменной takt съедает больше 1.5 кб при ее переводе с BYTE на WORD и при переходе за 2кб прога снова не компилится
Это как понять ???? Хотя есть предположение почему это все происходит. Нужно АСМ файл посмотреть. А через MPLAB прогнать не пробывал ???? Или Протеусом ???? Скинь все архивом. Интересно стало. А вот слова
Quote (evgta)
при добавлении новых строк компилить больше 2килослов нехочет
наводит на единственную мысль что не доломан PBP из за этого и гюки Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Забавно. С памятью все прекрасно. 40 байт. Сейчас сольем PBP и поколдуем. Отпишусь Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Попробовал Это не ошибка а предупреждение. оператор GOTO может неправильно работать. На сайте это уже гтето обсуждалось. Сама прога должна нормально работать у Вас не ипользован оператор GOTO. P.S. Когдато я писал проги почти на всю память 876проца вискакивали такиеже предупреждения и в место GOTO использовал BRANCHL. Все работало на ура. Переходите на протон там таких проблем нету.
Попробуй всё и вся... может быть пол...
Сообщение отредактировал
demanik - Пн, 13.12.2010, 23:42
После танцев с бубнами вокруг PBP пришлось подтягивать высшие силы в лице demanik, за что ему плюс. Спс Николай. От ошибки
Quote (evgta)
code crosses boundary @ 800h
удалось избавиться указав напрямую MCS путь к MPASM. Но после этого уже MPASM стал выдавать предупреждение о переходе через 2 Кб предел. Перестановка местами кусков кода не привело к положительным результатам. При смещении п.программы razchet: на вторую страницу (@ org 0x900) все равно дает предупреждение(но уже одно). Забавная штука этот PBP.
Quote (demanik)
Переходите на протон там таких проблем нету.
Либо на 18 линейку. Там эта проблема уже аппаратно решена. Успехов Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)