Prosty projekt na attiny

Witam

Kolega poprosił mnie o skonstruowanie ustrojstwa, które, m.in., po przekroczeniu 5tys obrotów silnika w samochodzie zapali lampkę. Szczególna dokładność czy powtarzalność nie jest wymagana. Obroty dostaję w postaci 2 impulsów na obrót wału korbowego.

Wymyśliłem takie rozwiązanie:

Sprzęt: ATTiny 12 pracuje z wewnętrznym generatorem (zawsze jeden element mniej na płytce) Zasilany przez stabilizator napięcia ujemnego 79L05. Czyli masa układu jest na +7V względem masy samochodu. A to dlatego, żeby lampki sterowane +12V włączać po prostu jednym tranzystorem PNP.

Soft (napisany będzie w assemblerze): Każdy impuls wywołuje przerwanie, w którym inkrementowana jest zawartość jednego z rejestrów, nazwijmy go OBR. Na przerwaniach od timera umieszczę procedurę sprawdzającą wartość OBR, i jeśli będzie ona większa od jakiejśtam wartości to włączająca lampeczkę. Potem zerowanie OBR. Reszta funkcji, które układ ma spełniać, jest w pętli głównej.

Teraz pytanie, czy dobrze wykombinowałem i czy nie ma to jakiegoś ukrytego błędu. Zdaje mi się, że częstotliwość przerwań od timera będzie za duża, i układ nie nadąży liczyć odpowiedniej liczby impulsów. Może ugryźć sprawę z drugiej strony, i nie mierzyć częstotliwości, tylko okres - wtedy licznik inkrementowany przez timer byłby zerowany przerwaniem wywołanym przez sygnał z silnika.

I jeszcze jedno pytanie: czy w trakcie obsługi jednego przerwania wyłączać obsługę innych? Zdaje mi się, że jeśli wyłączę to mogę zgubić np zerowanie licznika, z kolei jeśli zostawię włączone to mogą się pojawić jakieś dziwne rzeczy

Reply to
scx
Loading thread data ...

Po co? I tak dajesz opornik na baze, a wbudowane diody zabezpieczajace obetna napiecie do Vcc+0,6V. Albo daj MOSFETa.

Moze znowu prosciej bedzie popedzac timer z zewnetrznego zrodla CLK, jakim beda impulsy z walu. Drugi timer co jakis czas daje przerwanie i po prostu odczytujesz ile bylo impulsow w ustalonym czasie. Albo jeszcze inaczej, impulsy z walu generuja przerwanie, a ty odczytujesz czas pomiedzy impulsami (jesli zalezy ci na szybkiej reakcji, hehe:). 10000 przerwan/s spokojnie AVR pociagnie, tym bardziej, ze i tak bedzie sie nudzil.

A to zalezy od czasu przez jaki bedziesz przebywal w obsludze przerwania.

Reply to
T.M.F.

Dnia Fri, 12 Jan 2007 18:22:56 +0100, T.M.F. napisał(a):

Hmm... Jeśli mam na wyjściu AVRka +5V względem masy samochodu, to mam względem +12V całe 7V. A -7V na bazie względem emitera to aż nadto, żeby tranzystor PNP puścił prąd do żaróweczki.

No niestety, tiny12 ma tylko jeden timer :)

"małe" przerwanie, czyli liczenie tyknięcia zegara lub półobrotu wału, to

IMPULS: inc obr 1 ret 4

czyli 5 cykli

"duże" przerwanie to kilka instrukcji:

TIMER: subi obr,0x11 1 brpl ALARM 1 lub 2 clr obr 1 cbi PORTB,PB2 2 ret 4 ALARM: clr obr 1 sbi PORTB,PB2 2 ret 4

czyli 9 lub 10 cykli

Przy zegarze 1,2MHz, daje to odpowiednio 4 i 8 us. No chyba że coś źle policzyłem. Ciekawe jakie jest prawdopodobieństwo, że wystąpi przerwanie zwiększające obr, pomiędzy instrukcjami subi i clr - wtedy na pewno coś zadziałoby źle

Reply to
scx

Dnia Fri, 12 Jan 2007 21:58:14 +0100, Piotr Chmiel napisał(a):

Proszę bardzo:

formatting link
L1 L2 to wyjścia na żaróweczki (tak sobie teraz pomyślałem, że BD140 to lekkie przegięcie jak na żaróweczki-kontrolki w samochodzie :P)

OBROTY to wejscie sygnału z komputera silnikowego

A jak ten czas mierzyc? Przychodzi mi do głowy tylko timer w przerwaniu inkrementujący jakiś rejestr, sprawdzany i zerowany w przerwaniu od impulsu z silnika - czyli druga wymyślona przeze mnie metoda.

Reply to
scx

Dnia Fri, 12 Jan 2007 23:06:10 +0100, telmag napisał(a):

Wtedy z kolei mogę przegapić któryś z impulsów....

Reply to
scx

W dniu 12-01-2007 23:20, scx napisał:

A czy przegapienie jednego, lub nawet kilku impulsów będzie takie straszne w skutkach? I tak mówiłeś, że sygnalizacja ma być raczej orientacyjna i niekoniecznie superdokładna i powtarzalna.

Reply to
Krzysiek

scx napisał(a):

Spróbuj tak:

Impuls z silnika powoduje przerwanie. W obsłudze przerwania odczytujesz stan licznika(czas od poprzedniego impulsu) a następnie zerujesz timer. Dorzuć jeszcze, żeby przepełnienie timera powodowało jego zatrzymanie. Robie tak w każdym projekcie związanym z pomiarem RPM i działa niezawodnie. ATtiny mimo że mały to i tak będzie się nudził niesamowicie:)

Pozdro

Reply to
Luk

Dnia Sat, 13 Jan 2007 00:28:06 +0100, Luk@sz napisał(a):

Dobry pomysł z zatrzymywaniem timera. Pozwala zmiejszyć dzielnik timera ->

zwiększyć dokładność pomiaru czasu -> rozdzielczość. Tak zrobię.

Usiadłem sobie z karteczką, i wszystko policzyłem. Przy dzielniku timera

256, mam 1 "tyknięcie" co 213us. 8 bitowy rejestr liczący tyknięcia, pozwala zmierzyć maks okres 54 ms. 54 ms, przy dwóch impulsach na obrót wału, daje 555 rpm. Zmiejszenie dzielnika na 128 powoduje, że minimalnie mierzę 1098 rpm. W sumie mogłoby być - nawet gdyby zachciało mi się dorobić sygnalizację zbyt niskich obrotów to pomiar będzie miał wystarczający zakres.

Dodatkowo pomyślałem o zerowaniu licznika wewnętrznego timera przy każdym impulsie z wału. Gdybym tego nie zrobił, tyknięcia przerwania timera mogłyby się nieszczęśliwie ułożyć z sygnałami wału, i miałbym 2 tyknięcia w plecy, czyli błąd pomiaru rpm, przy dzielniku 256, jakieś 360rmp na plusie. Czyli zamiast przy 5022 rpm układ zareagowałby przy 4662.

Zapewne wielu z Was puka się w głowę, mówiąc, że to nie miało mieć dużej dokładności. No nie miało, ale teraz już ma :P Po co? Zaciekawiła mnie taka kwestia. Może kiedyś będę musiał zrobić coś dokładnego - to będę wiedział jak.

Mały, ale wariat :P Cośtam mu jeszcze dorzucę, ale i tak 98% wykonywanych instrukcji to nop będzie.

Pozdro i dziękuję wszystkim za rady!

Reply to
scx

od nop lepsze:

sleep rjmp PC-1

oczywiście włącz wcześniej tryb sleep

Reply to
William

Dnia Sat, 13 Jan 2007 07:41:25 +0100, William napisał(a):

W głównej pętli będzie jeszcze mrygał dwiema diodami. Mógłbym go uśpić, ale z braku drugiego timera musiałbym wszytsko robić na tym jednym. Poza tym tiny12 budzi się przez 4 cykle :] A mnie dopadła mania dokładności. Kwestia poboru prądu całkowicie mnie nie interesuje, a już różnica jednego mA...

Reply to
scx

scx napisał(a):

Ależ jest drugi timer :) Wathdog. W sam raz na mruganie dwiema diodami.

Reply to
William

Dnia Sat, 13 Jan 2007 12:08:16 +0100, William napisał(a):

Tak też pomyślałem w pierwszym odruchu... Ale watchdog wywołuje normalny reset, nie ma dla niego oddzielnego wektora przerwania. A tak się składa, że w momencie włączenia układ musi kilka rzeczy zrobić - których wykonywanie za każdym cyknięciem watchdoga jest mocno niepożądane... No chyba że jest jakiś sposób rozróżnienia, czy reset nastąpił przez watchdoga czy w wyniku włączenia zasilania?

Reply to
scx

Jest - w rejestrze MCU jest wskazane źródło resetu.

Pozdrawiam Marcin Stanisz

Reply to
Marcin Stanisz

No to zastosuj NPN, chociaz nie wiem jak to jest rozwiazane w samochodzie i cvzy polaczenia ie ograniczaja sposobu zasialania zarowki.

To masz ATTiny13, 25, 45, 85, do woli. Akurat 12 jest paskudna bo nie ma SRAM i tylko 3 pozycyjny stos, dzieki czemu musisz uwazac na przerwania, szczegolnie jesli korzystasz z RCALL.

Inne ATTiny maja tez wewnetrzny zegar 9,6MHz.

Reply to
T.M.F.

Dnia Sat, 13 Jan 2007 16:27:35 +0100, T.M.F. napisał(a):

Wszystkie żarówy są na wspólnej masie. Muszę podawać 12V.

Akurat mam kilka sztuk tiny12 to wykorzystam. SRAM mi niepotrzebny, zostanie z 20 rejestrów wolnych... 3 pozycyjny stos to aż nadto, maksymalnie wykorzystam 2 pozycje. Ja tiny12 bardzo lubie - to pierwszy procek na którym zacząłem pisać w assemblerze. Jest prosty i jednocześnie daje duże możliwości.

Reply to
scx

parę kondensatorów, rezystorów, komparator i już. Nic się nie zawiesi, da się regulować. Co najwyżej trzeba poszukać elementów o małym współczynniku temperaturowym, żeby te same obroty w zimie i w lecie wskazywało.

Reply to
Jarek Andrzejewski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.