Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с C18 компилатора на microchip.
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=7184
Страница 1 от 1

Автор:  edi [ Съб Окт 03, 2009 12:09 am ]
Заглавие:  Проблем с 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, зарежда тази стойност в Стека, но след връщане от прекъсване зарежда някаква тотално различна стойност в РС!

Прикачени файлове:
problem2.JPG
problem2.JPG [ 62.68 KiB | Прегледано 2221 пъти ]

Автор:  Цецо [ Съб Окт 03, 2009 10:04 am ]
Заглавие: 

кой процесор е това?

Автор:  edi [ Съб Окт 03, 2009 10:20 am ]
Заглавие: 

Цецо написа:
кой процесор е това?

Дам забравих го това 18F452.

Автор:  Цецо [ Съб Окт 03, 2009 5:08 pm ]
Заглавие: 

да не е някой от сбърканите ревижъни? Прочети му внимателно ератата. А и точно това поколение ядра имаха яд с бързите прекъсвания.

Автор:  Edesign [ Съб Окт 03, 2009 7:52 pm ]
Заглавие: 

Как правиш симулацията с дебъгера или софтуерно с мплаба?

Ако е софтуерно как го правиш? Използваш Set PC at cursor или стартираш програмата отначало и чакаш да спре на брейк поинта?
Ако използваш Set PC at cursor то трябва да го сложиш на най-горния ред иначе променливите няма да са конфигурирани и ще имат случайна стойност и оттам може би идва проблема ти.

Автор:  relsys [ Съб Окт 03, 2009 11:23 pm ]
Заглавие: 

В sonsivri.com има последната версия.

Автор:  Цецо [ Нед Окт 04, 2009 10:32 am ]
Заглавие: 

Точно с по старите версии на ядрото 452 съм имал подобни проблеми. И в ератата си го пишеше, но при мен май се случваше като мина във втората половина на паметта и направя TBL инструкция. Процесора хващаше нанякъде самоволно и айде у киреча. Но после го оправиха точно тоя бъг, ама знам ли ти на кой кристал си попаднал.

Затова ти казвам, виж си ревизията и внимателно изчети ератата. Имаха някакви ядове тия ядра, затова и ги спряха. Щото както го описваш, не ми мяза да е софтуерно. Другия вариант е в самото прекъсване да си помазваш стека, но предполагам това си го проверил.

Автор:  fan [ Нед Окт 04, 2009 1:48 pm ]
Заглавие: 

Цецо, вие тука групичката да не сте случайно шамани? Ами то почти нищо освен въпрос - нито сорс нито разяснение относно това дали е хардуерен дебъг или симулация и пускане парче по парче на подробности?! Само ще продължите да си изстисквате от пръстите кой каквото се сети и я стане така я не! Дано юнака се сети и даде всичко необходимо щото само приказки...

Автор:  Цецо [ Нед Окт 04, 2009 2:00 pm ]
Заглавие: 

Абе вярно, аз сега се загледах, че има сложени два брекпоинта. А 452 през ICD2 мисля че не позволяваше повече от един активен. Може вярно да е в симулатора. Е ако е така - 99% става въпрос за програмистка грешка :)

Ама аз там по-добре да не се бъркам, щото симулатора на МПЛАБ, ползвам единствено и само за мерене на времена... :)

Автор:  edi [ Нед Окт 04, 2009 11:31 pm ]
Заглавие: 

Правя симулацията софтуерно в MPLAB + PROTEUS VSM 7.3 .Всеки път стартирам от начало програмата и чакам да спре на бреик поинта.
Когато спра прекъсванията преди if(newrpg!=oldrpg) и ги пусна след това всичко е ОК, но при условие, че трябва да генерирам ШИМ сигнал на няколко изхода е невъзможно така да се работи.
Все си мисля, че когато настъпи прекъсване след изпълението на if(newrpg!=oldrpg) в Стека се записва адреса на следващата инстукция извлечена по време на ifa(т.е. тази която трябва да се изпълни ако не настъпи прекъсване), а съответно ако тя е необходимо да се прескочи на база резултат от сравнението се получава пободно нещо, поне аз така си го обяснявам, т.к. в С един ред не е един ред в асемблер.
Така или иначе ще започна отначало да мисля целия алгоритъм.Устройството трябва да генерира ШИМ с 25 степени на коефицента на запълване, честота 1KHz, в същото време да се управлява с RPG и да се визуализира инфо за всеки управляван канал на LCD с HD44780.
Ако премахна приоритета на прекъсванията дали нещо ще се промени според вас?

Автор:  [ Пон Окт 05, 2009 6:02 pm ]
Заглавие: 

Ами най-простото е да изпробваш симулацията само в MPLAB, отделно можеш да пробваш да смениш процесора, за да провериш дали не е проблема в симулацията само на този процесор, можеш и да дадеш View/Dissambly Listing и да погледнеш около реда който те интересува какво точно се случва. Като компилираш задай на компилатора да не оптимизира нещата, т.е. задай debug опцията. Ако променливите които сравняваш са 8-битови можеш и да имаш проблеми, ако опцията enable integer promotion не е активна ( прочети хелпа за тази опция, там е обяснено в детайли какво се случва )

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