| Автор |
Съобщение |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 PIC16F627A
Странен проблем имах с този пик.
Проблема се получи в декодер на IR протокол.
Значи програмата представлява непрекъснат цикъл в които се прави обработката и освен това имам активно прекъсване от TIMER2 в което не правя нищо,просто установявам един флаг които ползвам в тялото на програмата.
Проблема се получава върху 16 битови променливива върху която често прилагам << и доколкото успях да локализирам проблема е че точно тези операции << и >> дават понякога неверен резултат.
Реших проблема като пак ползвам таимера но не ползвам прекъсване като проверявам флага като не съм променил почти нищо. Но ми стана интересно в защо точно се получава така. Някой сблъсквал ли се е с подобен бъг в тоя пик?
|
| Сря Юни 22, 2005 5:05 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Най-добре е да постнеш кода, в който мислиш че се получава грешката от шифтването. Досега не съм забелязал проблем в такава проста операция.
|
| Сря Юни 22, 2005 9:49 am |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Mного е важно и с кой компилер се получава. Ако може, пусни и дизасемблерен листинг 
|
| Сря Юни 22, 2005 10:18 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Анализирах асемблер листинга няколко пъти. Вчера поне 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 11:56 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Да не бъркаш някъде в прекъсванията, т.е. дай листинга на кода с който запазваш служебните регистри на процесора при възникване на прекъсване ( WREG, FSR, STATUS & PCLATH ). При PIC16F627A има някаква недомислица в процесора, уж е почти същия като PIC16F627, обаче не е точно така. Не издържа на допир с пръст по MCLR, програмната памет се сгомнясва много бързо и то на някои места, уж се записва, но при втора верификация се четат 0, EEPROM-а за данни също се държи по сходен начин.
|
| Сря Юни 22, 2005 2:42 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Само едно прекъсване се позваше и то е точно това дето съм го дал.
Там не се пипа както виждам флага за препълване  .
А това с програмната памет сериозно ли го говориш. Не съм чувал такова нещо пък и преди бях питал тук в форума за надежноста на флаш пиковете и никои тогава не каза да има проблеми.
|
| Сря Юни 22, 2005 2:56 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Сериозно говоря, тия светофарните брочи по София и страната, съм ги правил с такъв професор, в началото бяха PIC16F627/628, по едно време Комет имаха само с буква А и почнахме от тях да ползваме. Докато да разбера какво става изпонатръшках 10-тина броя. Не съм се задълбавал да изследвам по-сериозно с буква А, но при мен така се получи, може и партидата да е била дефектна. По сходен начин се държат и PIC16F8xxA процесорите, някъде ги коментирахме преди време.
|
| Сря Юни 22, 2005 3:24 pm |
|
 |
|
Wise
Ранг: Форумен бог
Регистриран на: Нед Дек 19, 2004 6:26 pm Мнения: 1628 Местоположение: Сливен
|
pirev
Дано наистина се шегуваш - не вярвам да има такива "дребни" своеволия тоя чип. Да не иска ресет чип (външен) или някакви екстри подобни?
Кондензатори навсякъде и т.н.
|
| Сря Юни 22, 2005 3:32 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Не било бъг на процесора.
Сега добавих още код в програмата и като съхраних СТАТУС-а се сетих че проблема е че не съм си съхранил сатуса в въпросното прекъсване
Малко поработих на ИАР и придобих вреден навик, ИАР сам се грижи за съхраняването на контекста.
|
| Сря Юни 22, 2005 4:47 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Кой компилатор използваш ?
|
| Сря Юни 22, 2005 4:59 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Това беше на Hi-Tech,това съм го почнал миналата година че затова.
А напоследък гледам всичко да си го правя s IAR.
Има си го за всякакви процесори и има много глезотии. Особенно пълното му C++ си е голямо предимство;
|
| Сря Юни 22, 2005 5:06 pm |
|
 |
|
Lino
Ранг: Минаващ
Регистриран на: Чет Мар 10, 2005 11:43 am Мнения: 58
|
@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 8:13 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Проблема с въпросните професори, не е когато от програмата си презаписвам програмната памет ( имах си аз да не знам, че се записва на блокове от 4 думи  ), а когато ги записвам с програматор. Примерно вземам нов процесор, правят се няколко презаписа, пипна MCLR по време на работа и дотам, произволни блокове от програмната и паметта за данни отказват !
|
| Чет Юни 23, 2005 9:06 am |
|
 |
|
Dimitar
Ранг: Форумен бог
Регистриран на: Пет Ное 12, 2004 3:38 pm Мнения: 9103 Местоположение: Chicago, IL
|
Баси - това е единствения пик, който ползвам в производство. Влагам го от както е излезнал и досега несъм имал никакви проблеми с него. Освен, че командата му за изтриване на програмната памет е различна от тази на версията без А  .
|
| Чет Юни 23, 2005 9:52 am |
|
|