| Автор |
Съобщение |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Ама там има хардуерен буфер за UART-a ?????!!!!!!
|
| Пон Апр 18, 2005 11:30 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
...
Последна промяна ¶ на Пон Яну 30, 2012 4:18 am, променена общо 1 път
|
| Пон Апр 18, 2005 12:10 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Е тогава е нормално да ти се препълва буфера. Пика няма как да знае че данните са валидни или не. Но това не му дава право да се успива и да не може да възобнови комуникацията след това. Аз поне до сега не съм успял да lock-на UART -a досега по тоя начин.
За това с прекъсванията, живо ме интересува. Ако е има наистина такъв бъг, то той трябва да е описан. Иначе има бъгове по контролера за прекъсванията, на определени пикове, на определени модули, при обределени условия. Но генерален проблем от типа който описваш (при всички пикове) досега не съм виждал.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пон Апр 18, 2005 1:19 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Не няма. Т.е има два байта буфер и приема трети. Не е без хич, но си е нищо.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пон Апр 18, 2005 1:21 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Да, пак е нещо. AVR-а си има само 1 регистър - изпуснеш ли момента, целия пакет заминава. 
|
| Пон Апр 18, 2005 1:47 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
То и в пикльовците е един, ама е FIFO...пълни се като пълнител на пистолет (много ми харесва това обяснение  ) Та проблема с прекъсванията го имах при използване на UART, I2C, писане/четене на флаша и след събуждане на процесора...Не го казвам просто така, доста време загубих там, като го написах с do-while се оправи работата...
|
| Пон Апр 18, 2005 6:46 pm |
|
 |
|
Lino
Ранг: Минаващ
Регистриран на: Чет Мар 10, 2005 11:43 am Мнения: 58
|
 PIC GIE
Цецо:
Как го правите това, да не се нулира коректно? Бита със сигурност мърда коректно според мен.
Изглежда не съм се изразил ясно.
Разбира се,че бита се нулира след bcf INTCON,GIE . Но не може да блокира прекъсване активирано по време на изпълнение на самата инструкция. БЛОКИРАТ СЕ САМО ПРЕКЪСВАНИЯ ПОСТЪПИЛИ СЛЕД УСТАНОВЯВАНЕТО НА GIE В 0. Когато постъпи прекъсване по време на изпълнение на bcf INTCON,GIE ( GIE е все още 1) прекъсването се активира. При самото активиране на прекъсването GIE става 0. Cледва изход oт прекъсване с инструкция RETFIE. ТАЗИ ИНСТРУКЦИЯ ВДИГА БИТ GIE В 1.
Резултата в тази ситуация е: GIF=1 за инструкцията следваща
bcf INTCON,GIE. Неблокираното прекъсване установява GIE В 1 чрез RETFIE.
Ясно е, че колкото по-вече са прекъсванията толкова по вероятно е да се получи тази ситуация.
Цецо:
Но тогава и вашия while цикъл не е 100% решение.
Това е 100% решение. Този цикъл не прави нищо друго освен
изчакване на момента когато при изпълнението на някоя от инструкциите bcf INTCON,GIE няма заявка за прекъсване и съответно GIE се установява в 0 за следващата инструкция( няма RETFIE от неблокирано прекъсване да обърне GIE в 1 и той остава в 0).
Това не е BUG, a начин на работа (независимо дали ни харесва или не)!
Имаше някакъв PDF c диаграми от които се виждаше целия процес но нe си спомням вече...
|
| Пон Апр 18, 2005 11:51 pm |
|
 |
|
Wise
Ранг: Форумен бог
Регистриран на: Нед Дек 19, 2004 6:26 pm Мнения: 1628 Местоположение: Сливен
|
Може да изглежда тъпичко, но аз си слагах винаги една след друга 2 инструкции bcf INTCON,GIE
Ако възникне IRQ на първата, то при излизането ще се изпълни поне една инструкция преди да се обработят другите заявки. Не съм имал проблем с нежелани прекъсвания
|
| Вто Апр 19, 2005 10:41 am |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Дайте да го видя тоя документ де. Всичко друго е наизуст.
Опс намерих го. AN576.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Вто Апр 19, 2005 10:56 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
...
Последна промяна ¶ на Пон Яну 30, 2012 4:18 am, променена общо 1 път
|
| Вто Апр 19, 2005 11:21 am |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Абе ако е БЪГ трябва да го пише в ератата, а не в дата шеета.
По принцип говориш малко наизуст (не се обиждай). Забраната на прекъсванията не става за време 0. На никой процесор. Теоретически погледнато всеки процесор който забранява прекъсванията е уязвим в момента на изпълнение на инструкцията за забрана. Винаги може да пристигне прекъсване в средата на инструкцията. Прекъсването ще се изпълни. Това не е страшното. Друг е въпроса защо след излизане от прекъсването флага не става 0 (което прави прекъсната инструкция), а автоматически разрешава прекъсването. Вероятно е защото инструкцията се изпълнява преди да се влезе в прекъсването. Но това значи че просто след излизане от прекъсването не трябва да се вдига в флага автоматично в "1", а просто да не се пипа. Според мен това си е недоизмислица в ядрото, а не бъг. Както и да е, сега проучвам проблема, но ако е вярно наистина е тъпо.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Вто Апр 19, 2005 11:29 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
...
Последна промяна ¶ на Пон Яну 30, 2012 4:19 am, променена общо 1 път
|
| Вто Апр 19, 2005 11:41 am |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Що в началото на INT вектора да изпълняваш GIE=0? Това пък за какво? То си се прави само. Веднъж намъкнал се в прекъсването, няма кой да те прекъсне. Затова и проблема според мен не е вътре в прекъсването. Проблема ще дойде после когато се окаже че инструкцията GIE = 0, всъщност не е свършила нищо, и програмата прекъсне някъде където това е опасно.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Вто Апр 19, 2005 11:48 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
...
Последна промяна ¶ на Пон Яну 30, 2012 4:19 am, променена общо 1 път
|
| Вто Апр 19, 2005 11:52 am |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Прекъсваш - прекъсване? На PIC? Не бих посмял. Това е PIC? Най многото което си позволявам е да използвам приоритети при PIC18. Ама да прекъсвам прекъсвания от еднакъв преоритет - звучи ми опасно. Май е време да смениш ядрото. Микрочип не е за теб.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Вто Апр 19, 2005 12:04 pm |
|
|