| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Обикновен повторител (atMega) http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=18078 |
Страница 1 от 2 |
| Автор: | Реконструктор [ Нед Окт 31, 2021 1:16 pm ] | ||||||||||||||||||
| Заглавие: | Обикновен повторител (atMega) | ||||||||||||||||||
Опитвам се да направя обикновен повторител на цифров сигнал, базиран на външно прекъсване. Сигнала влиза на INT0 пина и излиза на пин 0 на PORTC. Ето кода:
Резултата е ето този:
Ако, обаче, инвертирам сигнала, тоест този код: ISR(INT0_vect) { if (edge_trigger == EDGE_FALLING) { edge_trigger = EDGE_RISING; PORTC = 1; } else { edge_trigger = EDGE_FALLING; PORTC = 0; } EICRA = edge_trigger; } Всичко работи идеално: Някой в състояние ли е да обясни какво се случва? |
|||||||||||||||||||
| Автор: | slav4o.com [ Нед Окт 31, 2021 1:27 pm ] |
| Заглавие: | Re: Обикновен повторител (atMega) |
Не трябва ли да е PORTCbits.LATC0 или нещо от сорта ? Ако има нещо друго на PORTC може да се обърква такова сетване. ( Така е при PIC-овете) предполагам и при атмегите е подобно. INT0 не е ли само по активно състояние, т.е. не е по смяна на състояние (по фронт) ? След като обработиш прекъсването, изчистваш ли му флага ? |
|
| Автор: | ToHu [ Нед Окт 31, 2021 5:10 pm ] |
| Заглавие: | Re: Обикновен повторител (atMega) |
Това PORTC освен ако не е дефинирно от теб като бит, е целия порт. Обаче, пише че тоя порт INT0 може да има едновременно прекъсване по фронт и по ниско ниво, които се генерират асинхронно.. Ако си оставил прекъсването по ниво активно, в момента в който влезеш в прекъсване по заден фронт ти сваляш изхода и променяш флага за фронт. След това обаче влизаш още веднъж по ниво виждаш че си бил на заден фронт и пак вдигаш изхода. Нещо такова. Имаш регистър за типът прекъсване , по-добре използвай него а не твой флаг. p.s. ако не е това дай да видим как са ти сетнати регистрите за прекъсвания и и/о, изобщо дай целия код. |
|
| Автор: | Реконструктор [ Нед Окт 31, 2021 5:19 pm ] |
| Заглавие: | Re: Обикновен повторител (atMega) |
Ами не, INT0 е на PORTD, а клатя PORTC. Знам, че ако клатя порта, който слушам, може да има аномалии. Обаче проблема изглежда хардуерен, тоест фронтовете не са чисти и INT0 се тригърва по повече от един път за един фронт. Защото като добавих един delay 1 ms, нещата се поизчистиха. Обаче е много дълъг тоя дилей, не ме устройва. Май ще мисля друг начин някъв. |
|
| Автор: | ToHu [ Нед Окт 31, 2021 5:22 pm ] |
| Заглавие: | Re: Обикновен повторител (atMega) |
Прочете ли какво ти написах, инт0 може да генерира две прекъсвания асинхронно, по фронт и по ниво, конкретно по ниско ниво, виж дали си го забранил. |
|
| Автор: | nobodyshadow [ Нед Окт 31, 2021 9:47 pm ] | |||||||||
| Заглавие: | Re: Обикновен повторител (atMega) | |||||||||
Пробвай с този код. Гледал съм мега328 за EICRA регистъра. На изхода резистор към захранване ли има, махни го.
|
||||||||||
| Автор: | ToHu [ Нед Окт 31, 2021 10:47 pm ] |
| Заглавие: | Re: Обикновен повторител (atMega) |
ами не четете май пдф-а, пише че ако сменяш ISCn0/1 трябва да забраняваш прекъсването защото промяната им генерира прекъсване. Та най-вероятно имаш второ прекъсване. |
|
| Автор: | Реконструктор [ Пон Ное 01, 2021 11:35 pm ] | |||||||||
| Заглавие: | Re: Обикновен повторител (atMega) | |||||||||
Това не обяснява защо простата размяна на присвояването, нещата работят, макар и инвертирано. Както и да е, направих го с просто полиране, чиста работа |
||||||||||
| Автор: | slav4o.com [ Пон Ное 01, 2021 11:58 pm ] |
| Заглавие: | Re: Обикновен повторител (atMega) |
Да не би да има нещо друго на порта ? Някой хардуерен модул прикачен ? Може да сетнеш порта в ниско ниво при запускане на контролера и да видиш дали няма нещо да го вдигне в 1-ца. Разбира се изключваш присвояванията в прекъсването. п.с. сега се сещам, че на PIC-овете сетването на порта в 0 е една инструкция clrf докато за някаква друга стойност имаш 2 инструкции movlv и movwf , на atMegaта сигурно пак е така, може да сложиш и един nop преди или след PORTC=0 |
|
| Автор: | ToHu [ Вто Ное 02, 2021 5:05 am ] |
| Заглавие: | Re: Обикновен повторител (atMega) |
Ще зачета утре пак дейташита, първия път като го гледах ми се стори, че видях да пише че може да се генерират прекъсвания едновременно по ниво нува и по фронт, на второто четене гледах регистрите и не го видях и реших че ми се е привидяло. Ако ако обаче е така, то това каточе ли обеснява поведението, защото получаваш прекъсване само при преминаване в от 1 в 0. Полирнето е малко куца работа, особенно в по-сложен код и къси импулси, я полирш на време я не. |
|
| Автор: | Реконструктор [ Сря Ное 03, 2021 8:10 pm ] |
| Заглавие: | Re: Обикновен повторител (atMega) |
Всъщност, тоя код беше да тествам дали работи устойчиво и предвидимо прекъсването. |
|
| Автор: | ToHu [ Сря Ное 03, 2021 8:20 pm ] |
| Заглавие: | Re: Обикновен повторител (atMega) |
Ами от моя опит досега, никога съм нямал проблем с прекъсване, но полиране се изтърва. Прекъсванията са една от най-предвидимите и устойчиви системи в един микроконтролер. Единият проблем е че мениш настройката на прекъсването без да си забранил самото прекъсване, а това е изрично указано. Не всички контролери са така, това си е някаква специфика на тая мега, то аз чета за меа 16 де, не знам твоята такава ли е Външните прекъсвания са изцяло хардуерни, от тов апо-надеждно и предвидимо здраве му кажи, това са тригери и ЛЕ, нищо друго. Въпроса е че те се тактуват по някакъв клок, не съм влизал в детайли на атмегата как става. При PIC ако не се лъжа на Q1 се четеше вхда а на Q3 се сетва прекъсването, ама може и да ме лъже паметта, когато нещата опрат до това в кой цикъл се генерир апрекъсването просто си отварям дейта шийта и гледам семата Ако не искаш да влизаш в самото прекъсване спокойно може да полираш флага му, но да полираш самият вход си е едно от най-ненадеждните решения. |
|
| Автор: | slav4o.com [ Сря Ное 03, 2021 10:29 pm ] | |||||||||
| Заглавие: | Re: Обикновен повторител (atMega) | |||||||||
Ами с delay() казваш, че работи. Това PORTC = 0; работи една инструкция по-бързо от PORTC = 1; Може би if else блоковете се изпълняват различно бързо. Та затова като им смениш местата на сетванията и спира да работи. Един nop или ако напишеш два пъти PORTA = 0; ще се оправи според мен А защо ти трябва закъснение от една инструкция сигурно както Тони писа, е свързано с повторно влизане в прекъсване. |
||||||||||
| Автор: | nobodyshadow [ Чет Ное 04, 2021 10:00 pm ] | |||||||||
| Заглавие: | Re: Обикновен повторител (atMega) | |||||||||
Ц, виж SREG. |
||||||||||
| Автор: | Реконструктор [ Чет Ное 04, 2021 10:49 pm ] | |||||||||
| Заглавие: | Re: Обикновен повторител (atMega) | |||||||||
Абе винаги, когато съм се опитвал да ги ползвам съм стигал до някви аномалии. Компаратора работи по-добре в тия случаи. А ако обърнеш внимание на мащаба, един импулс ти е към 1 ms, тоест говорим за доста нискочестотен сигнал, нищо не изпуска полиранието. |
||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|