Goto page 1, 2 Next
scx
Guest
Fri Jan 12, 2007 5:21 pm
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
T.M.F.
Guest
Fri Jan 12, 2007 6:22 pm
Quote:
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.
Po co? I tak dajesz opornik na baze, a wbudowane diody zabezpieczajace
obetna napiecie do Vcc+0,6V. Albo daj MOSFETa.
Quote:
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.
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.
Quote:
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
A to zalezy od czasu przez jaki bedziesz przebywal w obsludze przerwania.
--
Inteligentny dom -
http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz sie do projektu.
scx
Guest
Fri Jan 12, 2007 9:11 pm
Dnia Fri, 12 Jan 2007 18:22:56 +0100, T.M.F. napisał(a):
Quote:
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.
Po co? I tak dajesz opornik na baze, a wbudowane diody zabezpieczajace
obetna napiecie do Vcc+0,6V. Albo daj MOSFETa.
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.
Quote:
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.
No niestety, tiny12 ma tylko jeden timer

Quote:
A to zalezy od czasu przez jaki bedziesz przebywal w obsludze przerwania.
"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
scx
Guest
Fri Jan 12, 2007 11:05 pm
Dnia Fri, 12 Jan 2007 21:58:14 +0100, Piotr Chmiel napisał(a):
Quote:
Sprzęt:
Przedstaw to na schemacie, bo nie moge sobie wyobraźić
Proszę bardzo:
http://diablo.ict.pwr.wroc.pl/~mmanski/letis.gif
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

)
OBROTY to wejscie sygnału z komputera silnikowego
Quote:
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.
Ja bym mierzył czas między kolejnymi impulsami i na tej podstawie zapalał
lampkę.
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.
telmag
Guest
Fri Jan 12, 2007 11:06 pm
Quote:
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
Niewielkie ale mozesz na czas wykonywania procedury zawiesic obsluge
przerwan ... wtedy nic zlego sie nie stanie
scx
Guest
Fri Jan 12, 2007 11:20 pm
Dnia Fri, 12 Jan 2007 23:06:10 +0100, telmag napisał(a):
Quote:
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
Niewielkie ale mozesz na czas wykonywania procedury zawiesic obsluge
przerwan ... wtedy nic zlego sie nie stanie
Wtedy z kolei mogę przegapić któryś z impulsów....
Krzysiek
Guest
Fri Jan 12, 2007 11:46 pm
W dniu 12-01-2007 23:20, scx napisał:
Quote:
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
Niewielkie ale mozesz na czas wykonywania procedury zawiesic obsluge
przerwan ... wtedy nic zlego sie nie stanie :)
Wtedy z kolei mogę przegapić któryś z impulsów....
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.
--
Pozdrawiam
Krzysiek
Luk@sz
Guest
Sat Jan 13, 2007 12:28 am
scx napisał(a):
Quote:
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.
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
scx
Guest
Sat Jan 13, 2007 1:53 am
Dnia Sat, 13 Jan 2007 00:28:06 +0100, Luk@sz napisał(a):
Quote:
scx napisał(a):
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.
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.
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

Po co? Zaciekawiła mnie taka
kwestia. Może kiedyś będę musiał zrobić coś dokładnego - to będę wiedział
jak.
Quote:
ATtiny mimo że mały to i tak będzie się nudził niesamowicie:)
Mały, ale wariat
Cośtam mu jeszcze dorzucę, ale i tak 98% wykonywanych instrukcji to nop
będzie.
Pozdro i dziękuję wszystkim za rady!
William
Guest
Sat Jan 13, 2007 7:40 am
Quote:
Mały, ale wariat
Cośtam mu jeszcze dorzucę, ale i tak 98% wykonywanych instrukcji to nop
będzie.
od nop lepsze:
sleep
rjmp PC-1
oczywiście włącz wcześniej tryb sleep
scx
Guest
Sat Jan 13, 2007 11:55 am
Dnia Sat, 13 Jan 2007 07:41:25 +0100, William napisał(a):
Quote:
Mały, ale wariat
Cośtam mu jeszcze dorzucę, ale i tak 98% wykonywanych instrukcji to nop
będzie.
od nop lepsze:
sleep
rjmp PC-1
oczywiście włącz wcześniej tryb sleep
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...
William
Guest
Sat Jan 13, 2007 12:08 pm
scx napisał(a):
Quote:
Dnia Sat, 13 Jan 2007 07:41:25 +0100, William napisał(a):
Mały, ale wariat
Cośtam mu jeszcze dorzucę, ale i tak 98% wykonywanych instrukcji to nop
będzie.
od nop lepsze:
sleep
rjmp PC-1
oczywiście włącz wcześniej tryb sleep
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...
Ależ jest drugi timer

Wathdog. W sam raz na mruganie dwiema diodami.
scx
Guest
Sat Jan 13, 2007 1:33 pm
Dnia Sat, 13 Jan 2007 12:08:16 +0100, William napisał(a):
Quote:
Ależ jest drugi timer

Wathdog. W sam raz na mruganie dwiema diodami.
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?
Marcin Stanisz
Guest
Sat Jan 13, 2007 1:52 pm
On Sat, 13 Jan 2007 13:33:21 +0100, scx wrote:
Quote:
No chyba że jest jakiś sposób rozróżnienia, czy reset nastąpił przez
watchdoga czy w wyniku włączenia zasilania?
Jest - w rejestrze MCU jest wskazane źródło resetu.
Pozdrawiam
Marcin Stanisz
--
"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"
T.M.F.
Guest
Sat Jan 13, 2007 4:27 pm
Quote:
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.
Po co? I tak dajesz opornik na baze, a wbudowane diody zabezpieczajace
obetna napiecie do Vcc+0,6V. Albo daj MOSFETa.
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 to zastosuj NPN, chociaz nie wiem jak to jest rozwiazane w
samochodzie i cvzy polaczenia ie ograniczaja sposobu zasialania zarowki.
Quote:
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.
No niestety, tiny12 ma tylko jeden timer
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.
Quote:
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
Inne ATTiny maja tez wewnetrzny zegar 9,6MHz.
--
Inteligentny dom -
http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz sie do projektu.
Goto page 1, 2 Next