ATTiny13 - liczenie obrotów i zapalenie diody


Witam. Chcę liczyć obroty z impulsatora (sinus) porównać je z jakąś wartością i gdy zrównają się z nią i ją przekroczą zapali się dioda LED.

Cienko u mnie z bascomem. Kiedyś pisałem proste miganie diodami na mega8. Tutaj mam problemy ;/
W ogóle to zerżnąłem ten kod z obrotomierza na mega8 wlaśnie. Poza tym chyba liczenie przez 1s to głupota. Potrzebuję liczyć okres impulsu i na podstawie tego częstotliwość a później obroty ....

Poniżej kod. Wywala mi błędy :/

$regfile = "attiny13.dat"
$crystal = 10000000
 
 
 
 
Config Portb = &B000000                                     'Dioda Led
 
       Portb = &B111111
 
 
 
Dim Obr As Long                                             ' Deklaracja Zmiennej
 
Config Timer1 = Counter , Edge = Rising
Enable Interrupts
Enable Timer0
On Timer0 Licz
Timer0 = 0
 
Do
Loop
End
 
Licz:
 
 
   Start Timer0
   Wait 1
   Stop Timer0
 
   Obr = Timer0
 
 
   If Obr >= 85 Then           ' 85 = 5k Obr / Min
   Portb.4 = 0
   Else
   Portb.4 = 1
   End If




Portret użytkownika paavo91

Już wiem :) Brakowało mi

Już wiem :) Brakowało mi kilku rzeczy:

$regfile = "attiny13.dat"
$crystal = 10000000
$hwstack = 8
$swstack = 8
$framesize = 8
 
 
 
 
 
Config Portb = &B000000                                     'Dioda Led
 
       Portb = &B111111
 
Dim Obr As Long                                             ' Deklaracja Zmiennej
 
Config Timer0 = Counter , Edge = Rising
Enable Interrupts
Enable Timer0
On Timer0 Licz
Timer0 = 0
 
Do
Loop
End
 
Licz:
 
 
   Start Timer0
   Wait 1
   Stop Timer0
 
   Obr = Timer0
 
 
   If Obr >= 85 Then                                        ' 85 = 5k Obr / Min
   Portb.4 = 0
   Else
   Portb.4 = 1
   End If

Teraz nie mam błędów. Ale chętnie posłucham porad jak to lepiej zrobić, żeby szybciej liczył częstotliwość.
dzięki

Portret użytkownika mirley

Re: Obroty

Użyj drugiego timera do odliczania czasu zamiast stosować wait. poza tym procedura Licz powinna się odnosic do drugiego timera ktory odlicza ta sekundę czasu. Po odliczeniu powinien zatrzymac drugi timer

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Nie poradzę sobie ;/ Mógłby

Nie poradzę sobie ;/ Mógłby ktoś pomóc w napisaniu?

Dowiedziałem się, że zapalanie diody led musi być w pętli do..loop i w niej odczytywać wartość zmiennej Obr. Więc kod nie będzie działał.
A co do timerów, muszę zmienić w tryb timer? Nie wiem jak to zrobić, żeby timer zaczął liczyć jak pojawi się zbocze narastające, i skończył liczyć jak pojawi się kolejne zbocze narastające.

Portret użytkownika mirley

Re: Program

Spróbuj w takiej wersji na początek. Jak zadziała i zacznie mierzyć w miarę poprawnie to zrobimy timer

$regfile = "attiny13.dat"
$crystal = 10000000
$hwstack = 8
$swstack = 8
$framesize = 8
 
Config Portb = &B010000  'b.4 musi być wyjścim bo ustawiasz mu stan                               
       Portb = &B111111
 
Dim Obr As Byte                                            
 
Config Timer0 = Counter , Edge = Rising
Enable Timer0
Enable Interrupts
 
Do
 
  timer0=0
  wait 1
  Obr = Timer0 
  If Obr >= 85 Then  Portb.4 = 0 Else Portb.4 = 1
 
Loop
End

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika paavo91

Jak b4 ma być wyjsciem to

Jak b4 ma być wyjsciem to początkowy stan powinien mieć 0 prawda?
No i wtedy po przekroczeniu obr powinien dostać 1.

Co do testów to mam mały problem. Nie mogę w taką pogodę zrobić nic przy motocyklu. Wpadłem na pomysł, żeby pobierać obroty z wiatraczka komputerowego. Tam idzie prostokąt więc jest ułatwienie, chociaż do testów bym miał. Nie wiem tylko czy się nada :) Wyjście ma typu otwarty kolektor.

Portret użytkownika mirley

Re: Obroty

Stan początkowy B.4 nie ma znaczenia bo i tak wpisujesz albo zero albo 1 do niego. Wiatraczek komputerowy będzie ok

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika paavo91

W takim razie podepnę ten

W takim razie podepnę ten wiatraczek. Tylko na wejście INT0 czy T0? Bo już się pogubiłem. Z Twojego kodu wynika za na T0. Nie wiem tylko jak oszacować obroty z tego wiatraczka żeby mi się dioda zapaliła. Mam do niego taki regulator obrotów i żebym mógł to zasymulować.

Portret użytkownika mirley

Re: went

Pewnie ze 2000 obrotów będzie miał. Dioda sie powinna palić jak bedzie działał, natomiast jak zatrzymasz palcem lub spowolnisz to powinna zgasnąć.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika paavo91

lcd

Podpiąłem sobie LCD do procka. Wyświetla mi tylko w 1 linii same "kwadraciki". W czym problem?

Portret użytkownika mirley

Re: LCD

Podłączyłeś LCD do tiny13? raczej będzie problem coś skompilować pod tego procka bo ma mało pamięci.... LCD się tak zachowuje jak jest nie podłączony (6 pinów jest potrzebne) lub jak nie ma kontrastu dobrze ustawionego

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika paavo91

Czemu? Zobaczymy, jak na

Czemu? Zobaczymy, jak na razie chcę sprawdzić LCD. Podłączyłem od D4 do D7, E,RS, R/W do masy i zasilanie, no i kontrast z V0 do masy przez potencjometr. Kontrast się dobrze reguluje. Nóżki tiny13 wybrałem sobie dowolnie bez jakichś reguł ale tak samo ustawiłem w bascomie.

EDIT:
Sprawdzałem to już 10 razy i dalej kicha :/ Chyba wyświetlacz padł.

Portret użytkownika matrix

Re: LCD

Gdyby lcd padł to nie wyświetlałby kwadracików. Kwadraty wyświetlają się gdy wyświetlacz jest niewłaściwie zainicjowany, czyli jednym słowem mówiąc, niewłaściwie podpięty.

Ja tak miałem na początku jak bujałem lcd z wyprowadzeniami z boku w dwóch rzędach obok siebie.

Portret użytkownika paavo91

Po całym dniu dochodzenia...

Po całym dniu dochodzenia... nie będzie mi działał LCD bo przecież PB5 nie jest ustawiony jako I/O. Musiałbym zmieniać fuse bity. A na próbę tego nie zrobię bo nie mam potem sprzętu aby powrócić do default.

Portret użytkownika mirley

Re: LCD

Żeby LCD działał potrzebujesz 6 pinów, innego podłączenia nie znam. Zmień kontroler na tiny2313 na czas testów. Potem jak Ci zadziała to wywalisz obsługę LCD i wgrasz program do tiny13

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Zrobiłem to z diodą led i

Zrobiłem to z diodą led i wiatraczkiem od PC. Szczerze to dziwnie się to zachowuje. Kręcił się to świeciło, zatrzymałem palcem przestało, ale już ponownie nic się nie dzieje.

Portret użytkownika gosc

Odpiąłem też sygnał z

Odpiąłem też sygnał z wiatraczka. Dioda świeci a nie powinna i czasem gaśnie potem znów świeci.

Portret użytkownika gosc

Te losowe błyski powodował

Te losowe błyski powodował programator którego nie odpiąłem.
Ale na tą chwilę nie zapala mi się dioda niestety. Co z prescalerem?
paavo

Portret użytkownika mirley

Re: Licznik

Spróbuj zamiast timer napisac counter:

  counter0=0
  wait 1
  Obr = counter0 
  If Obr >= 85 Then  Portb.4 = 0 Else Portb.4 = 1

popatrz jeszcze do helpa bascoma

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Nic to nie daje :( Ja nie

Nic to nie daje :(
Ja nie wiem czy to może być wina tego, że zasilam wiatrak 5V? I przez to nie daje on sygnału?

Portret użytkownika mirley

Re: Wiatrak

Podłącz ten wiatrak na 12V tak jak powinien być, nie powinno to jednak mieć znaczenia

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

ciąg dalszy

Witam. Dokonałem kilka przeróbek w kodzie wg. poleceń znajomego.
Kod wygląda tak:

$regfile = "attiny13.dat"
$crystal = 9600000                                          ' fuse bity przestawione na 9,6MHz
$hwstack = 8
$swstack = 8
$framesize = 8
 
 
Config Portb.5 = Output
Config Portb.4 = Output
Config Portb.3 = Output                                     ' tutaj podłączyłem LED
Config Portb.2 = Output                                     ' T0
Config Portb.1 = Input                                      'tutaj FAN na INT0
Config Portb.0 = Output
 
Reset Portb
 
 
Dim Czas2 As Single
Dim Czas As Word
Dim Rpm As Word
 
 
 
 
 
Config Int0 = Rising
On Int0 Licz
Enable Int0
Enable Interrupts
Config Timer0 = Timer , Prescale = 256
Enable Timer0
Stop Timer0
Timer0 = 0
 
 
Portb.3 = 1
Wait 1
Portb.3 = 0
 
Do
 
If Rpm >= 5000 Then Portb.3 = 1 Else Portb.3 = 0
 
 
Loop
End
 
Licz:
   Czas = Timer0
   Timer0 = 0
 
   If Czas = 0 Then
   Start Timer0
   Else
   Czas2 = Czas * 0.00002667
   Rpm = 60 / Czas2
 
   End If
 
 Return

Niestety po podpięciu wiatraczka, czy impulsatora procesor nie reaguje. Sygnał z impulsator na pewno dochodzi. Wie ktoś w czym problem?

Portret użytkownika mirley

Re: Obroty

Po pierwsze to spróbuj zrobić to na tiny2313, który ma więcej ramu i wywal polecenia

$hwstack = 8
$swstack = 8
$framesize = 8

prawdopodobnie nie ma miejsca w ramie na stos

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Zmieniłem na tiny2313. Nic to

Zmieniłem na tiny2313. Nic to nie dało. Program nie liczy poprawnie prędkości wg. kodu poniżej:

$regfile = "attiny2313.dat"
$crystal = 8000000                                          ' fuse bity przestawione na 8MHz
 
Config Portb = Output
 
Config Portd = Input                                        'tutaj FAN na INT0
 
 
Reset Portb
Reset Portd
 
 
 
Dim Czas2 As Single
Dim Czas As Word
Dim Rpm As Word
 
 
 
 
 
Config Int0 = Rising
On Int0 Licz
Enable Int0
Enable Interrupts
Config Timer0 = Timer , Prescale = 256
Enable Timer0
Stop Timer0
Timer0 = 0
 
 
Portb.0 = 1
Wait 1
Portb.0 = 0
 
Do
 
If Rpm >= 10000 Then Portb.0 = 1 Else Portb.0 = 0
 
 
Loop
End
 
Licz:
   Czas = Timer0
   Timer0 = 0
 
   If Czas = 0 Then
     Start Timer0
   Else
     Czas2 = Czas * 0.000032
     Czas2 = 60 / Czas2
     Rpm = Round(czas2)
   End If
 Return

Fuse bity ustawione wg. poradników na tej stronie. Układ zachowuje się tak, że dioda losowa zapala się i gaśnie w każdym zakresie obrotów. Czasami jakby ustawało gaszenie przy wyższych obrotach.

Portret użytkownika rafliczek22

$regfile =

$regfile = "attiny2313.dat"
$crystal = 8000000                                          ' fuse bity przestawione na 8MHz
 
DDRB=255
PORTB=0
DDRD=0
PORTD=0
 
Dim rps as word
Dim rpm as word
 
Config timer1=timer, prescale=256
on timer1 cosek
Config Int0 = Rising
On Int0 Licz
Enable Int0
timer1=62500
Enable Timer1
enable interrupts
 
do
if rpm>10000 then
portb=1
else
portb=0
endif
loop
end
 
 
 
Licz:
incr rps
return
 
cosek:
timer1=62500
rpm=rps*30
rps=0
return

Kod był sprawdzany na atmega169, i działa, dioda podpięta pod portb0, czas oczekiwania (czyt. reakcja) wynosi 2 s. i można ją zmniejszyć zmniejszając timer i zwiększając mnożnik rpm, ale zmniejsza się wtedy dokładność (narazie wynosi 30 rpm), polecam zostawić tak jak jest. Po prostu podłącz diodę do portb0 i gotowe.

Portret użytkownika rafliczek22

Aha nie dawaj prosto sygnału

Aha nie dawaj prosto sygnału z wiatraka podłączonego na 12 v bo proc się zajara, jeśli wyjście jest OC to trzeba rezystorem podciągnąć, aha no i all wentyle jakie miałem w ręka dawały 2 imp na obrót dlatego jeśli się kręciły np. 5rpm to z kabelka wychodziło jakby 10rpm.

Portret użytkownika gosc

Dzięki za pomoc ale niestety

Dzięki za pomoc ale niestety potrzebuję szybszej reakcji ja zmianę obrotów. Największą dokładność chcę uzyskać w zakresie 8-11 tys. obr/min. Chcę to wykorzystać przy motocyklu. Robiłem już próby i są duże zakłócenia. Chyba będę musiał zastosować jakiś filtr. Ma ktoś na to pomysły?