| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| PIC16F627A http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=793 |
Страница 1 от 1 |
| Автор: | Nikola Kirov [ Сря Юни 22, 2005 5:05 am ] |
| Заглавие: | PIC16F627A |
Странен проблем имах с този пик. Проблема се получи в декодер на IR протокол. Значи програмата представлява непрекъснат цикъл в които се прави обработката и освен това имам активно прекъсване от TIMER2 в което не правя нищо,просто установявам един флаг които ползвам в тялото на програмата. Проблема се получава върху 16 битови променливива върху която често прилагам << и доколкото успях да локализирам проблема е че точно тези операции << и >> дават понякога неверен резултат. Реших проблема като пак ползвам таимера но не ползвам прекъсване като проверявам флага като не съм променил почти нищо. Но ми стана интересно в защо точно се получава така. Някой сблъсквал ли се е с подобен бъг в тоя пик? |
|
| Автор: | ¶ [ Сря Юни 22, 2005 9:49 am ] |
| Заглавие: | |
Най-добре е да постнеш кода, в който мислиш че се получава грешката от шифтването. Досега не съм забелязал проблем в такава проста операция. |
|
| Автор: | bateAz [ Сря Юни 22, 2005 10:18 am ] |
| Заглавие: | |
Mного е важно и с кой компилер се получава. Ако може, пусни и дизасемблерен листинг |
|
| Автор: | Nikola Kirov [ Сря Юни 22, 2005 11:56 am ] |
| Заглавие: | |
Анализирах асемблер листинга няколко пъти. Вчера поне 10 часа го гоних тоя проблем но не намерих няква грешка в кода. Проследих асемблер листинга дали някъде дето не трябва се пише в тая променлива но няма. Не го запазих оня вариант, оттогава претърпя доста корекции. Сега на свежа глава като помислих върху наблиуденията си вчера мога да кажа и точно кога става със сигурност. ============================================= Mask = Mask << 1 ; 000371 1003 BCF 0x3, 0 000372 DAA RLF 0x2a, F 000373 DAB RLF 0x2b, F ============================================= Ако прекъсването стане точно след BCF 0x3, 0 след връщане от прекъсването флага за препълване се получава че е 1. Вероятно същия е ефекта и след 2рата команда но това не води до объркване логиката на работа на програмата. а кода на прекъсването ========================================== void interrupt tc_int(void) 110: { 111: if ( TMR2IF ) 000008 183 CLRF 0x3 000009 1C8C BTFSS 0xc, 0x1 00000A 280D GOTO 0xd 112: { 113: Reset_flag = 1; 00000B 14A6 BSF 0x26, 0x1 114: TMR2IF = 0; 00000C 108C BCF 0xc, 0x1 115: } 116: } ========================================== По идеята ми в началото трябваше да инвертира и един друг флаг в прекъсването и затова го направих с прекъсване. Проблема изчезна като махнах прекъсването и ползвах TMR2IF вместо Reset_flag[/code] |
|
| Автор: | ¶ [ Сря Юни 22, 2005 2:42 pm ] |
| Заглавие: | |
Да не бъркаш някъде в прекъсванията, т.е. дай листинга на кода с който запазваш служебните регистри на процесора при възникване на прекъсване ( WREG, FSR, STATUS & PCLATH ). При PIC16F627A има някаква недомислица в процесора, уж е почти същия като PIC16F627, обаче не е точно така. Не издържа на допир с пръст по MCLR, програмната памет се сгомнясва много бързо и то на някои места, уж се записва, но при втора верификация се четат 0, EEPROM-а за данни също се държи по сходен начин. |
|
| Автор: | Nikola Kirov [ Сря Юни 22, 2005 2:56 pm ] |
| Заглавие: | |
Само едно прекъсване се позваше и то е точно това дето съм го дал. Там не се пипа както виждам флага за препълване А това с програмната памет сериозно ли го говориш. Не съм чувал такова нещо пък и преди бях питал тук в форума за надежноста на флаш пиковете и никои тогава не каза да има проблеми. |
|
| Автор: | ¶ [ Сря Юни 22, 2005 3:24 pm ] |
| Заглавие: | |
Сериозно говоря, тия светофарните брочи по София и страната, съм ги правил с такъв професор, в началото бяха PIC16F627/628, по едно време Комет имаха само с буква А и почнахме от тях да ползваме. Докато да разбера какво става изпонатръшках 10-тина броя. Не съм се задълбавал да изследвам по-сериозно с буква А, но при мен така се получи, може и партидата да е била дефектна. По сходен начин се държат и PIC16F8xxA процесорите, някъде ги коментирахме преди време. |
|
| Автор: | Wise [ Сря Юни 22, 2005 3:32 pm ] |
| Заглавие: | |
pirev Дано наистина се шегуваш - не вярвам да има такива "дребни" своеволия тоя чип. Да не иска ресет чип (външен) или някакви екстри подобни? Кондензатори навсякъде и т.н. |
|
| Автор: | Nikola Kirov [ Сря Юни 22, 2005 4:47 pm ] |
| Заглавие: | |
Не било бъг на процесора. Сега добавих още код в програмата и като съхраних СТАТУС-а се сетих че проблема е че не съм си съхранил сатуса в въпросното прекъсване Малко поработих на ИАР и придобих вреден навик, ИАР сам се грижи за съхраняването на контекста. |
|
| Автор: | ¶ [ Сря Юни 22, 2005 4:59 pm ] |
| Заглавие: | |
Кой компилатор използваш ? |
|
| Автор: | Nikola Kirov [ Сря Юни 22, 2005 5:06 pm ] |
| Заглавие: | |
Това беше на Hi-Tech,това съм го почнал миналата година че затова. А напоследък гледам всичко да си го правя s IAR. Има си го за всякакви процесори и има много глезотии. Особенно пълното му C++ си е голямо предимство; |
|
| Автор: | Lino [ Чет Юни 23, 2005 8:13 am ] |
| Заглавие: | |
@pirev По сходен начин се държат и PIC16F8xxA процесорите. В програмите си за тези процесори записваш ли в FLASH program memory, защото ако записваш, процесорите PIC16F8xxA и PIC16F8xx не са съвместими в тази си част. User Writes to FLASH Write to FLASH program memory in 4-word blocks(с буква А), instead of 1-word blocks(без буква A) Може да се погледне за инфо в DS39591A(и на други места) PIC16F87X → PIC16F87XA Migration . Не съм имал проблеми с FLASH на PIC16F8xxA( като се внимава с разликите). |
|
| Автор: | ¶ [ Чет Юни 23, 2005 9:06 am ] |
| Заглавие: | |
Проблема с въпросните професори, не е когато от програмата си презаписвам програмната памет ( имах си аз да не знам, че се записва на блокове от 4 думи |
|
| Автор: | Dimitar [ Чет Юни 23, 2005 9:52 am ] |
| Заглавие: | |
Баси - това е единствения пик, който ползвам в производство. Влагам го от както е излезнал и досега несъм имал никакви проблеми с него. Освен, че командата му за изтриване на програмната памет е различна от тази на версията без А |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|