Виж темите без отговор | Виж активните теми
Дата и час: Пет Апр 19, 2024 2:36 am
Обикновен повторител (atMega)
Автор |
Съобщение |
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 7885 Местоположение: София
|
Обикновен повторител (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; } Всичко работи идеално: Някой в състояние ли е да обясни какво се случва?
|
Нед Окт 31, 2021 12:16 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2586 Местоположение: Велико Търново / София
|
Re: Обикновен повторител (atMega)
Не трябва ли да е PORTCbits.LATC0 или нещо от сорта ? Ако има нещо друго на PORTC може да се обърква такова сетване. ( Така е при PIC-овете) предполагам и при атмегите е подобно. INT0 не е ли само по активно състояние, т.е. не е по смяна на състояние (по фронт) ? След като обработиш прекъсването, изчистваш ли му флага ?
|
Нед Окт 31, 2021 12:27 pm |
|
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 8:21 pm Мнения: 27994 Местоположение: София
|
Re: Обикновен повторител (atMega)
Това PORTC освен ако не е дефинирно от теб като бит, е целия порт. Обаче, пише че тоя порт INT0 може да има едновременно прекъсване по фронт и по ниско ниво, които се генерират асинхронно.. Ако си оставил прекъсването по ниво активно, в момента в който влезеш в прекъсване по заден фронт ти сваляш изхода и променяш флага за фронт. След това обаче влизаш още веднъж по ниво виждаш че си бил на заден фронт и пак вдигаш изхода. Нещо такова. Имаш регистър за типът прекъсване , по-добре използвай него а не твой флаг. p.s. ако не е това дай да видим как са ти сетнати регистрите за прекъсвания и и/о, изобщо дай целия код.
|
Нед Окт 31, 2021 4:10 pm |
|
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 7885 Местоположение: София
|
Re: Обикновен повторител (atMega)
Ами не, INT0 е на PORTD, а клатя PORTC. Знам, че ако клатя порта, който слушам, може да има аномалии. Обаче проблема изглежда хардуерен, тоест фронтовете не са чисти и INT0 се тригърва по повече от един път за един фронт. Защото като добавих един delay 1 ms, нещата се поизчистиха. Обаче е много дълъг тоя дилей, не ме устройва. Май ще мисля друг начин някъв.
|
Нед Окт 31, 2021 4:19 pm |
|
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 8:21 pm Мнения: 27994 Местоположение: София
|
Re: Обикновен повторител (atMega)
Прочете ли какво ти написах, инт0 може да генерира две прекъсвания асинхронно, по фронт и по ниво, конкретно по ниско ниво, виж дали си го забранил.
|
Нед Окт 31, 2021 4:22 pm |
|
|
nobodyshadow
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 4:18 am Мнения: 632
|
Re: Обикновен повторител (atMega)
Пробвай с този код. Гледал съм мега328 за EICRA регистъра. На изхода резистор към захранване ли има, махни го.
_________________ Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно!
|
Нед Окт 31, 2021 8:47 pm |
|
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 8:21 pm Мнения: 27994 Местоположение: София
|
Re: Обикновен повторител (atMega)
ами не четете май пдф-а, пише че ако сменяш ISCn0/1 трябва да забраняваш прекъсването защото промяната им генерира прекъсване. Та най-вероятно имаш второ прекъсване.
|
Нед Окт 31, 2021 9:47 pm |
|
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 7885 Местоположение: София
|
Re: Обикновен повторител (atMega)
Това не обяснява защо простата размяна на присвояването, нещата работят, макар и инвертирано. Както и да е, направих го с просто полиране, чиста работа
|
Пон Ное 01, 2021 10:35 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2586 Местоположение: Велико Търново / София
|
Re: Обикновен повторител (atMega)
Да не би да има нещо друго на порта ? Някой хардуерен модул прикачен ? Може да сетнеш порта в ниско ниво при запускане на контролера и да видиш дали няма нещо да го вдигне в 1-ца. Разбира се изключваш присвояванията в прекъсването. п.с. сега се сещам, че на PIC-овете сетването на порта в 0 е една инструкция clrf докато за някаква друга стойност имаш 2 инструкции movlv и movwf , на atMegaта сигурно пак е така, може да сложиш и един nop преди или след PORTC=0
|
Пон Ное 01, 2021 10:58 pm |
|
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 8:21 pm Мнения: 27994 Местоположение: София
|
Re: Обикновен повторител (atMega)
Ще зачета утре пак дейташита, първия път като го гледах ми се стори, че видях да пише че може да се генерират прекъсвания едновременно по ниво нува и по фронт, на второто четене гледах регистрите и не го видях и реших че ми се е привидяло. Ако ако обаче е така, то това каточе ли обеснява поведението, защото получаваш прекъсване само при преминаване в от 1 в 0. Полирнето е малко куца работа, особенно в по-сложен код и къси импулси, я полирш на време я не.
|
Вто Ное 02, 2021 4:05 am |
|
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 7885 Местоположение: София
|
Re: Обикновен повторител (atMega)
Всъщност, тоя код беше да тествам дали работи устойчиво и предвидимо прекъсването. Очевидно не съвсем, трябва си няква филтрираща схема преди него. С полиране си бачка перфектно. Ако някой му трябва да цъка реленца и други неща с китайско дистанционно
|
Сря Ное 03, 2021 7:10 pm |
|
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 8:21 pm Мнения: 27994 Местоположение: София
|
Re: Обикновен повторител (atMega)
Ами от моя опит досега, никога съм нямал проблем с прекъсване, но полиране се изтърва. Прекъсванията са една от най-предвидимите и устойчиви системи в един микроконтролер. Единият проблем е че мениш настройката на прекъсването без да си забранил самото прекъсване, а това е изрично указано. Не всички контролери са така, това си е някаква специфика на тая мега, то аз чета за меа 16 де, не знам твоята такава ли е Външните прекъсвания са изцяло хардуерни, от тов апо-надеждно и предвидимо здраве му кажи, това са тригери и ЛЕ, нищо друго. Въпроса е че те се тактуват по някакъв клок, не съм влизал в детайли на атмегата как става. При PIC ако не се лъжа на Q1 се четеше вхда а на Q3 се сетва прекъсването, ама може и да ме лъже паметта, когато нещата опрат до това в кой цикъл се генерир апрекъсването просто си отварям дейта шийта и гледам семата Ако не искаш да влизаш в самото прекъсване спокойно може да полираш флага му, но да полираш самият вход си е едно от най-ненадеждните решения.
|
Сря Ное 03, 2021 7:20 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2586 Местоположение: Велико Търново / София
|
Re: Обикновен повторител (atMega)
Ами с delay() казваш, че работи. Това PORTC = 0; работи една инструкция по-бързо от PORTC = 1; Може би if else блоковете се изпълняват различно бързо. Та затова като им смениш местата на сетванията и спира да работи. Един nop или ако напишеш два пъти PORTA = 0; ще се оправи според мен Това е защо не работи като смениш местата на 0 и 1А защо ти трябва закъснение от една инструкция сигурно както Тони писа, е свързано с повторно влизане в прекъсване.
|
Сря Ное 03, 2021 9:29 pm |
|
|
nobodyshadow
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 4:18 am Мнения: 632
|
Re: Обикновен повторител (atMega)
_________________ Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно!
|
Чет Ное 04, 2021 9:00 pm |
|
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 7885 Местоположение: София
|
Re: Обикновен повторител (atMega)
| | | | ToHu написа: Ами от моя опит досега, никога съм нямал проблем с прекъсване, но полиране се изтърва. Прекъсванията са една от най-предвидимите и устойчиви системи в един микроконтролер. Единият проблем е че мениш настройката на прекъсването без да си забранил самото прекъсване, а това е изрично указано. Не всички контролери са така, това си е някаква специфика на тая мега, то аз чета за меа 16 де, не знам твоята такава ли е Външните прекъсвания са изцяло хардуерни, от тов апо-надеждно и предвидимо здраве му кажи, това са тригери и ЛЕ, нищо друго. Въпроса е че те се тактуват по някакъв клок, не съм влизал в детайли на атмегата как става. При PIC ако не се лъжа на Q1 се четеше вхда а на Q3 се сетва прекъсването, ама може и да ме лъже паметта, когато нещата опрат до това в кой цикъл се генерир апрекъсването просто си отварям дейта шийта и гледам семата Ако не искаш да влизаш в самото прекъсване спокойно може да полираш флага му, но да полираш самият вход си е едно от най-ненадеждните решения. | | | | |
Абе винаги, когато съм се опитвал да ги ползвам съм стигал до някви аномалии. Компаратора работи по-добре в тия случаи. А ако обърнеш внимание на мащаба, един импулс ти е към 1 ms, тоест говорим за доста нискочестотен сигнал, нищо не изпуска полиранието.
|
Чет Ное 04, 2021 9:49 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 4 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|