| Автор |
Съобщение |
|
edi
Ранг: Минаващ
Регистриран на: Чет Окт 12, 2006 3:52 pm Мнения: 21 Местоположение: Varna
|
 Проблем с C18 компилатора на microchip.
Здравейте.
Пиша една програмка за работа с ротационен енкодер, но тъпия C18 ми къса нервите.
Имам следния код - от прикачената картинка.
Когато сложа бреакпоинт на реда if(newrpg!=oldrpg), при стойности на newrpg=0x06 oldrpg=0x06, не изпълнява if частта, но в момента в който премахна бреик поинта от споменатия ред а оставя само в тялото на if-а се изпълнява if(newrpg!=oldrpg) при newrpg=0x06 oldrpg=0x06!!!
Аз ли греша нещо или тъпия компилатор си прави каквото си и иска???
Ползвам 3.01 на С18 и MPLAB 8.36.С18 е стара версия, защото само такава намерих пълна, т.е. да не е student edition.
EDIT:До някъде видях къде е проблема.След като преди прекъсване РС=0xF8, зарежда тази стойност в Стека, но след връщане от прекъсване зарежда някаква тотално различна стойност в РС!
|
| Съб Окт 03, 2009 12:09 am |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
кой процесор е това?
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Съб Окт 03, 2009 10:04 am |
|
 |
|
edi
Ранг: Минаващ
Регистриран на: Чет Окт 12, 2006 3:52 pm Мнения: 21 Местоположение: Varna
|
Дам забравих го това 18F452.
|
| Съб Окт 03, 2009 10:20 am |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
да не е някой от сбърканите ревижъни? Прочети му внимателно ератата. А и точно това поколение ядра имаха яд с бързите прекъсвания.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Съб Окт 03, 2009 5:08 pm |
|
 |
|
Edesign
Ранг: Форумен бог
Регистриран на: Сря Авг 31, 2005 1:57 pm Мнения: 1103
|
Как правиш симулацията с дебъгера или софтуерно с мплаба?
Ако е софтуерно как го правиш? Използваш Set PC at cursor или стартираш програмата отначало и чакаш да спре на брейк поинта?
Ако използваш Set PC at cursor то трябва да го сложиш на най-горния ред иначе променливите няма да са конфигурирани и ще имат случайна стойност и оттам може би идва проблема ти.
|
| Съб Окт 03, 2009 7:52 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
В sonsivri.com има последната версия.
|
| Съб Окт 03, 2009 11:23 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Точно с по старите версии на ядрото 452 съм имал подобни проблеми. И в ератата си го пишеше, но при мен май се случваше като мина във втората половина на паметта и направя TBL инструкция. Процесора хващаше нанякъде самоволно и айде у киреча. Но после го оправиха точно тоя бъг, ама знам ли ти на кой кристал си попаднал.
Затова ти казвам, виж си ревизията и внимателно изчети ератата. Имаха някакви ядове тия ядра, затова и ги спряха. Щото както го описваш, не ми мяза да е софтуерно. Другия вариант е в самото прекъсване да си помазваш стека, но предполагам това си го проверил.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Нед Окт 04, 2009 10:32 am |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
Цецо, вие тука групичката да не сте случайно шамани? Ами то почти нищо освен въпрос - нито сорс нито разяснение относно това дали е хардуерен дебъг или симулация и пускане парче по парче на подробности?! Само ще продължите да си изстисквате от пръстите кой каквото се сети и я стане така я не! Дано юнака се сети и даде всичко необходимо щото само приказки...
Последна промяна fan на Нед Окт 04, 2009 2:05 pm, променена общо 1 път
|
| Нед Окт 04, 2009 1:48 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Абе вярно, аз сега се загледах, че има сложени два брекпоинта. А 452 през ICD2 мисля че не позволяваше повече от един активен. Може вярно да е в симулатора. Е ако е така - 99% става въпрос за програмистка грешка
Ама аз там по-добре да не се бъркам, щото симулатора на МПЛАБ, ползвам единствено и само за мерене на времена... 
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Нед Окт 04, 2009 2:00 pm |
|
 |
|
edi
Ранг: Минаващ
Регистриран на: Чет Окт 12, 2006 3:52 pm Мнения: 21 Местоположение: Varna
|
Правя симулацията софтуерно в MPLAB + PROTEUS VSM 7.3 .Всеки път стартирам от начало програмата и чакам да спре на бреик поинта.
Когато спра прекъсванията преди if(newrpg!=oldrpg) и ги пусна след това всичко е ОК, но при условие, че трябва да генерирам ШИМ сигнал на няколко изхода е невъзможно така да се работи.
Все си мисля, че когато настъпи прекъсване след изпълението на if(newrpg!=oldrpg) в Стека се записва адреса на следващата инстукция извлечена по време на ifa(т.е. тази която трябва да се изпълни ако не настъпи прекъсване), а съответно ако тя е необходимо да се прескочи на база резултат от сравнението се получава пободно нещо, поне аз така си го обяснявам, т.к. в С един ред не е един ред в асемблер.
Така или иначе ще започна отначало да мисля целия алгоритъм.Устройството трябва да генерира ШИМ с 25 степени на коефицента на запълване, честота 1KHz, в същото време да се управлява с RPG и да се визуализира инфо за всеки управляван канал на LCD с HD44780.
Ако премахна приоритета на прекъсванията дали нещо ще се промени според вас?
|
| Нед Окт 04, 2009 11:31 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Ами най-простото е да изпробваш симулацията само в MPLAB, отделно можеш да пробваш да смениш процесора, за да провериш дали не е проблема в симулацията само на този процесор, можеш и да дадеш View/Dissambly Listing и да погледнеш около реда който те интересува какво точно се случва. Като компилираш задай на компилатора да не оптимизира нещата, т.е. задай debug опцията. Ако променливите които сравняваш са 8-битови можеш и да имаш проблеми, ако опцията enable integer promotion не е активна ( прочети хелпа за тази опция, там е обяснено в детайли какво се случва )
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пон Окт 05, 2009 6:02 pm |
|
|