Микроконтролери и електроника
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 = 0;
   }
   else {
      edge_trigger = EDGE_FALLING;
      PORTC = 1;
   }

   EICRA = edge_trigger;
}


Резултата е ето този:

Прикачени файлове:
2021-10-31 12_08_36.png
2021-10-31 12_08_36.png [ 58.39 KiB | Прегледано 5001 пъти ]


Ако, обаче, инвертирам сигнала, тоест този код:

ISR(INT0_vect) {
if (edge_trigger == EDGE_FALLING) {
edge_trigger = EDGE_RISING;
PORTC = 1;
}
else {
edge_trigger = EDGE_FALLING;
PORTC = 0;
}

EICRA = edge_trigger;
}

Всичко работи идеално:

Прикачени файлове:
2021-10-31 12_14_43.png
2021-10-31 12_14_43.png [ 58.83 KiB | Прегледано 5001 пъти ]


Някой в състояние ли е да обясни какво се случва?

Автор:  slav4o.com [ Нед Окт 31, 2021 1:27 pm ]
Заглавие:  Re: Обикновен повторител (atMega)

Не трябва ли да е PORTCbits.LATC0 или нещо от сорта ? Ако има нещо друго на PORTC може да се обърква такова сетване. ( Така е при PIC-овете) предполагам и при атмегите е подобно. :roll:
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 регистъра.
На изхода резистор към захранване ли има, махни го.
Код:
DDRC=(1<<0);
EICRA = (1<<1)|(1<<0);


ISR(INT0_vect) {
   
EICRA^=(1<<0);
PINC=(1<<0);
   
}

Автор:  ToHu [ Нед Окт 31, 2021 10:47 pm ]
Заглавие:  Re: Обикновен повторител (atMega)

ами не четете май пдф-а, пише че ако сменяш ISCn0/1 трябва да забраняваш прекъсването защото промяната им генерира прекъсване. Та най-вероятно имаш второ прекъсване.

Автор:  Реконструктор [ Пон Ное 01, 2021 11:35 pm ]
Заглавие:  Re: Обикновен повторител (atMega)

ToHu написа:
ами не четете май пдф-а, пише че ако сменяш ISCn0/1 трябва да забраняваш прекъсването защото промяната им генерира прекъсване. Та най-вероятно имаш второ прекъсване.


Това не обяснява защо простата размяна на присвояването, нещата работят, макар и инвертирано. :)
Както и да е, направих го с просто полиране, чиста работа :D

Автор:  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; ще се оправи според мен :roll: Това е защо не работи като смениш местата на 0 и 1
А защо ти трябва закъснение от една инструкция сигурно както Тони писа, е свързано с повторно влизане в прекъсване.

Автор:  nobodyshadow [ Чет Ное 04, 2021 10:00 pm ]
Заглавие:  Re: Обикновен повторител (atMega)

ToHu написа:
..Единият проблем е че мениш настройката на прекъсването без да си забранил самото прекъсване...

Ц, виж SREG.

Автор:  Реконструктор [ Чет Ное 04, 2021 10:49 pm ]
Заглавие:  Re: Обикновен повторител (atMega)

ToHu написа:
Ами от моя опит досега, никога съм нямал проблем с прекъсване, но полиране се изтърва. Прекъсванията са една от най-предвидимите и устойчиви системи в един микроконтролер. Единият проблем е че мениш настройката на прекъсването без да си забранил самото прекъсване, а това е изрично указано. Не всички контролери са така, това си е някаква специфика на тая мега, то аз чета за меа 16 де, не знам твоята такава ли е :)
Външните прекъсвания са изцяло хардуерни, от тов апо-надеждно и предвидимо здраве му кажи, това са тригери и ЛЕ, нищо друго. Въпроса е че те се тактуват по някакъв клок, не съм влизал в детайли на атмегата как става. При PIC ако не се лъжа на Q1 се четеше вхда а на Q3 се сетва прекъсването, ама може и да ме лъже паметта, когато нещата опрат до това в кой цикъл се генерир апрекъсването просто си отварям дейта шийта и гледам семата :)
Ако не искаш да влизаш в самото прекъсване спокойно може да полираш флага му, но да полираш самият вход си е едно от най-ненадеждните решения.


Абе винаги, когато съм се опитвал да ги ползвам съм стигал до някви аномалии. Компаратора работи по-добре в тия случаи.
А ако обърнеш внимание на мащаба, един импулс ти е към 1 ms, тоест говорим за доста нискочестотен сигнал, нищо не изпуска полиранието. :)

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