Skocz do zawartości

Pomocna odpowiedź

Dając czujnik białej lini na wyjściu PC2(ADC2) czy jest możliwość żeby pojawienie się impulsu na tym wejściu uruchamiało przerwanie?

Nie ma przerwań dla każdej nóżki uC,to o czym mówisz to przerwanie zewnętrzne i jest oznaczone w AVRach jako INTx(dla mega8 jest to PD2 i PD3). Jest opcja zrobić coś takiego na pinach ADC pod warunkiem że nie wykorzystujesz modułu ADC,używa się do tego przerwania od komparatora.

Chciałbym wykorzystać to wejście ADC w swoim robocie do czujnika białej linii, i jeśli pojawi się biała linia żeby robot jechal w tył, a kiedy nie to normalnie jedzie do przodu. Jak wyglądają te przerwania od ADC? Robi się to na timerze czy jak?

Robi się to na komparatorze.Do wejścia nieodwracającego możesz ustawić wewnętrzne 1.3V a do odwracającego którykolwiek pin ADC.Przy zmianie stanu pinu wywołasz przerwanie od komparatora.Czujnik wysyła sygnał cyfrowy,tak?

//Mówimy o atmega8?

Tak, atmega8, czujnik linii to CNY70 więc cyfrowy. Nie rozumiem za bardzo tego co napisałeś, możesz trochę jaśniej?

Strona 186 datasheeta.Używasz przerwania od komparatora.

analog-comparator-atmega8.jpg

Do wejścia + ustawiasz bandgap reference czyli jakieś 1.3V

Do - przez ADC multiplexer output podłączasz którykolwiek z pinów ADC.

Gdy napięcie na plusie czyli 1.3V jest wyższe niż na minusie(u ciebie PC2) to wywołuje się przerwanie.Po szczegóły odsyłam do dokumentacji,można skonfigurować jeszcze kilka przydatnych rzeczy.

Nie, w ATmega8 nie możesz tak ustawić ADC by zgłaszał przerwanie tylko wtedy, gdy zmierzy coś powyżej lub poniżej jakiegoś progu. Możesz puścić ADC by mierzył w kółko któreś wejście i za każdym razem gdy ADC będzie miał nowy wynik dostaniesz przerwanie. Musisz go wtedy odczytać i programowo ocenić czy to, na co patrzy czujnik jest czarne czy białe. Są procesory w których taką ocenę progu może autonomicznie robić sam ADC.

Do oceny napięcia Kolega proponuje użycie komparatora ale jest to zupełnie inny blok niż ADC, choć może korzystać z wejść ADC. Komparator tylko porównuje napięcie wejściowe z jakimś napięciem odniesienia (np. podanym z potencjometru lub z wnętrza procesora) i odpowiada stanem 0 lub 1 (i ew. przerwaniem) gdy sprawdzane napięcie jest większe lub mniejsze niż próg. W procesorze komparator taki jest tylko jeden więc i jeden czujnik możesz obsłużyć gdy będziesz po prostu na przerwanie czekał. Jeśli zabierzesz się za to programowo, możesz "podsuwać" komparatorowi do oceny napięcia z kolejnych wejść ale zawsze dostaniesz odpowiedź 0 lub 1. Z ADC dostajesz wyniki w postaci liczb 0-1023.

Trochę słabo u mnie z angielskim 😋

Muszę ustawić przerwanie jako

ISR (ADC_vect)

ale co dalej? Trzeba jakiś timer, preskaler albo coś ustawić?

[ Dodano: 16-03-2013, 00:34 ]

Więc nie powinienem dawać CNY70 na te wejścią tylko np. na INT1 i INT0?

Musisz uruchomić ADC, ustawić, by wywoływało przerwanie po konwersji i włączyć globalną obsługę przerwań, następnie robisz obsługę przerwania tak jak napisałeś:

ISR(ADC_vect)
{
//cośtam
}

Więc może być ten czujnik na wejściu ADC? W jaki sposób mam ustawić żeby wywoływało przerwanie po konwersji? Resztę wiem jak zrobić

Zobacz register description w rodziale o ADC w DSie twojego uC. To przerwanie nie będzie działać tak, że przy przekroczeniu progu zostanie wykonane, tylko po zakończeniu konwersji ADC (z dowolnego kanału)

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...