Отговори на тема  [ 22 мнения ]  Отиди на страница 1, 2  Следваща
Обикновен повторител (atMega) 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 11:32 am
Мнения: 7885
Местоположение: София
Мнение Обикновен повторител (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 | Прегледано 3045 пъти ]


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

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 | Прегледано 3045 пъти ]


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


Нед Окт 31, 2021 12:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2586
Местоположение: Велико Търново / София
Мнение Re: Обикновен повторител (atMega)
Не трябва ли да е PORTCbits.LATC0 или нещо от сорта ? Ако има нещо друго на PORTC може да се обърква такова сетване. ( Така е при PIC-овете) предполагам и при атмегите е подобно. :roll:
INT0 не е ли само по активно състояние, т.е. не е по смяна на състояние (по фронт) ?
След като обработиш прекъсването, изчистваш ли му флага ?

_________________
https://github.com/slav4ocom/


Нед Окт 31, 2021 12:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27994
Местоположение: София
Мнение Re: Обикновен повторител (atMega)
Прочете ли какво ти написах, инт0 може да генерира две прекъсвания асинхронно, по фронт и по ниво, конкретно по ниско ниво, виж дали си го забранил.


Нед Окт 31, 2021 4:22 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Окт 30, 2004 4:18 am
Мнения: 632
Мнение Re: Обикновен повторител (atMega)
Пробвай с този код. Гледал съм мега328 за EICRA регистъра.
На изхода резистор към захранване ли има, махни го.
Код:
DDRC=(1<<0);
EICRA = (1<<1)|(1<<0);


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

_________________
Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно!


Нед Окт 31, 2021 8:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27994
Местоположение: София
Мнение Re: Обикновен повторител (atMega)
ами не четете май пдф-а, пише че ако сменяш ISCn0/1 трябва да забраняваш прекъсването защото промяната им генерира прекъсване. Та най-вероятно имаш второ прекъсване.


Нед Окт 31, 2021 9:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 11:32 am
Мнения: 7885
Местоположение: София
Мнение Re: Обикновен повторител (atMega)
ToHu написа:
ами не четете май пдф-а, пише че ако сменяш ISCn0/1 трябва да забраняваш прекъсването защото промяната им генерира прекъсване. Та най-вероятно имаш второ прекъсване.


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


Пон Ное 01, 2021 10:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2586
Местоположение: Велико Търново / София
Мнение Re: Обикновен повторител (atMega)
Да не би да има нещо друго на порта ? Някой хардуерен модул прикачен ? Може да сетнеш порта в ниско ниво при запускане на контролера и да видиш дали няма нещо да го вдигне в 1-ца. Разбира се изключваш присвояванията в прекъсването.
п.с. сега се сещам, че на PIC-овете сетването на порта в 0 е една инструкция clrf докато за някаква друга стойност имаш 2 инструкции movlv и movwf , на atMegaта сигурно пак е така, може да сложиш и един nop преди или след PORTC=0

_________________
https://github.com/slav4ocom/


Пон Ное 01, 2021 10:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27994
Местоположение: София
Мнение Re: Обикновен повторител (atMega)
Ами от моя опит досега, никога съм нямал проблем с прекъсване, но полиране се изтърва. Прекъсванията са една от най-предвидимите и устойчиви системи в един микроконтролер. Единият проблем е че мениш настройката на прекъсването без да си забранил самото прекъсване, а това е изрично указано. Не всички контролери са така, това си е някаква специфика на тая мега, то аз чета за меа 16 де, не знам твоята такава ли е :)
Външните прекъсвания са изцяло хардуерни, от тов апо-надеждно и предвидимо здраве му кажи, това са тригери и ЛЕ, нищо друго. Въпроса е че те се тактуват по някакъв клок, не съм влизал в детайли на атмегата как става. При PIC ако не се лъжа на Q1 се четеше вхда а на Q3 се сетва прекъсването, ама може и да ме лъже паметта, когато нещата опрат до това в кой цикъл се генерир апрекъсването просто си отварям дейта шийта и гледам семата :)
Ако не искаш да влизаш в самото прекъсване спокойно може да полираш флага му, но да полираш самият вход си е едно от най-ненадеждните решения.


Сря Ное 03, 2021 7:20 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2586
Местоположение: Велико Търново / София
Мнение Re: Обикновен повторител (atMega)
Реконструктор написа:
Всъщност, тоя код беше да тествам дали работи устойчиво и предвидимо прекъсването. :) Очевидно не съвсем, трябва си няква филтрираща схема преди него. С полиране си бачка перфектно. Ако някой му трябва да цъка реленца и други неща с китайско дистанционно :)

Ами с delay() казваш, че работи. Това PORTC = 0; работи една инструкция по-бързо от PORTC = 1; Може би if else блоковете се изпълняват различно бързо. Та затова като им смениш местата на сетванията и спира да работи. Един nop или ако напишеш два пъти PORTA = 0; ще се оправи според мен :roll: Това е защо не работи като смениш местата на 0 и 1
А защо ти трябва закъснение от една инструкция сигурно както Тони писа, е свързано с повторно влизане в прекъсване.

_________________
https://github.com/slav4ocom/


Сря Ное 03, 2021 9:29 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Окт 30, 2004 4:18 am
Мнения: 632
Мнение Re: Обикновен повторител (atMega)
ToHu написа:
..Единият проблем е че мениш настройката на прекъсването без да си забранил самото прекъсване...

Ц, виж SREG.

_________________
Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно!


Чет Ное 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
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 22 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни