Bascom Stoper z dokładnością do 1/10 sekundy

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
XAX
-
Posty: 7
Rejestracja: 22 cze 2010, 21:42
Lokalizacja: Kraków

Bascom Stoper z dokładnością do 1/10 sekundy

Post autor: XAX » 22 cze 2010, 22:07

Witam ponownie po bardzo długiej przerwie starych i nowych znajomych :)
A teraz do rzeczy.

Musze zrobić stoper z dokładnością najlepiej do 1/10 sekundy na zawody modelarskie :twisted:
Niestety umie tylko jako tako programować w Bascomie AVR i zamierzam zastosować procek ATmega32 (taki akurat mam ale zawsze mogę zmienić)

Czy ktoś z kolegów ma gotowca do wgladu lub potrafi jakoś łopatologicznie staremu dziadkowi wytłumaczyć jak to zrobić.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 23 cze 2010, 8:36

żeby wyszedł Ci dobrej dokładności stoperek, to musiz zaprząc jakiś RTC.

Awatar użytkownika
haterkmp
Użytkownik
Posty: 652
Rejestracja: 08 sie 2008, 11:47
Lokalizacja: Wałbrzych

Post autor: haterkmp » 23 cze 2010, 8:38

ojejku to proste akurat. na elportalu jest całe archiwum do Mikroprocesorowej Oślej Łączki i tam jest program takiego właśnie stopera z obsługą 4 wyświetlaczy led. program do 2313 ale przerobić go do M32 nie problem.

[ Dodano: 2010-06-23, 09:40 ]
a dokładnie C012.bas

[ Dodano: 2010-06-23, 09:40 ]
a tu masz lina do archiwum:
https://elportal.pl/ftp/mol_listingi.zip

[ Dodano: 2010-06-23, 09:41 ]
Matrix a nie wystarczy użyć timera? po co od razu robić skomplikowaną maszynę?

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 23 cze 2010, 17:34

haterkmp pisze:Matrix a nie wystarczy użyć timera? po co od razu robić skomplikowaną maszynę?
użyłem raz w swoim pierwszym zegarze timera odliczającego 1s. wynik?
po około dwóch godzinach zegar spieszył się o kilka minut, więc jeśli to ma być dokładny stoper to polecam jakiś RTC.

zależy jeszcze co dokładnie na tych zawodach ów stoper będzie odmierzał? jeśli kilka okrążeń gdzie łączny czas nie przekroczy kilku minut, to nie warto komplikować układu o dodatkowy RTC.

keruseykaryu

Post autor: keruseykaryu » 23 cze 2010, 19:16

matrix pisze:użyłem raz w swoim pierwszym zegarze timera odliczającego 1s. wynik?
po około dwóch godzinach zegar spieszył się o kilka minut, więc jeśli to ma być dokładny stoper to polecam jakiś RTC.
Pierwsze. Jeśli procesor taktowany był z układu RC jakie ma wewnątrz to dokładność jest niska. Dobrej klasy częstościomierz wykazywał rozbieżności z deklarowanym 8MHz. Podgrzewanie procesora dawało jeszcze lepsze efekty. Drugie. Licznika do przerwań zegarowych też trzeba umieć używać i tryb CTC jest wymagany. Zwłaszcza w Bascomie ze swoim wilczym apetytem na stos.

XAX jak masz Mega8(88) czy inny procesor z TOSC1/2 - patrz na opis nóżek czy jest - to żadnego dodatkowego RTC nie potrzeba. Licznik w tryb ASSY, rezonator 32,768kHz do TOSC i wszystko będzie ok. Dokładność paru sekund na dobę przecież wystarczy do tego.

Awatar użytkownika
haterkmp
Użytkownik
Posty: 652
Rejestracja: 08 sie 2008, 11:47
Lokalizacja: Wałbrzych

Post autor: haterkmp » 24 cze 2010, 10:20

wewnętrzny RC jest bardzo niestabilny. dobry rezonator kwarcowy wspomagany dwoma dobrej jakości kondensatorami na bank spełnia swoje zadanie. mój zegar na 2313 chodzi już pół roku i nie ma wahań we wskazaniach.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 24 cze 2010, 14:34

no ja użyłem wewnętrznego oscylatora.

Awatar użytkownika
XAX
-
Posty: 7
Rejestracja: 22 cze 2010, 21:42
Lokalizacja: Kraków

Post autor: XAX » 26 cze 2010, 6:37

Witam

Dzięki za pomoc.
Gotowce są nieocenione :mrgreen:
Stoper już działa :twisted:

W celach edukacyjnych pobawiłem się trochę programem.
Wiem że pewnie da się to zrobić ładniej ale chodziło mi bardziej o przejrzystość programu.

Kod: Zaznacz cały

$regfile = "8535DEF.dat"                          'typ procesora
$crystal = 4000000                                'czestotliwosc kwarcu

Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Config Lcd = 16 * 1a                              'typ LCD
Cursor Off
Cls

Dim Set_jed As Byte                               'setne sekundy: jednostki
Dim Set_dzi As Byte                               'setne sekundy: dziesiąte
Dim Sek_jed As Byte                               'sekundy: jednostki
Dim Sek_dzi As Byte                               'sekundy: dziesiąte
Dim Min_jed As Byte                               'minuty: jednostki
Dim Min_dzi As Byte                               'minuty: dziesiąte

Config Timer1 = Timer , Prescale = 64             'zwiększanie T/C0 co 16us (64*0,25us)
Enable Interrupts                                 'odblokowanie globalnego systemu przerwań
Enable Timer1                                     'odblokowanie pzerwania przepełnienia Timer1
On Timer1 Co10ms                                  'po przepełnieniu skok do etykiety Co10ms
Start Timer1                                      'uruchomieni Timer1

Set_jed = 0 : Set_dzi = 0 : Sek_jed = 0 : Sek_dzi = 0 : Min_jed = 0 : Min_dzi = 0




Do
   Locate 1 , 1 : Lcd "CZAS: " ; Min_dzi ; Min_jed ; ":" ; Sek_dzi ; Sek_jed ; ":" ; Set_dzi ; Set_jed
Loop


End

'-----------------------------------------------------------------------

Co10ms:                                           'procedura obsługi przerwania od Timera T/C1 wykonywana co 10ms
Timer1 = 64911                                    'załaduj do Timera1, żeby zliczył 625 (=65535-64911)impulsów =10ms

   Incr Set_jed                                   'co 10ms zwiększ wartość licznika setnych sekundy

   If Set_jed = 10 Then                'przekroczenie licznika jednostek setnych sekundy
   Set_jed = 0                                                   'wyzerownie licznika
   Incr Set_dzi                            'zwiększ stan licznika dziesiąte setnej sekundy
   End If

   If Set_dzi = 10 Then                'przekroczenie licznika dziesiąte setnej sekundy
   Set_dzi = 0                                    'wyzerownie licznika
   Incr Sek_jed                                   'zwiększ stan licznika jednostek sekundy
   End If

   If Sek_jed = 10 Then                      'przekroczenie licznika jednostek sekundy
   Sek_jed = 0                                    'wyzerownie licznika
   Incr Sek_dzi                                   'zwiększ stan licznika dziesiąte sekundy
   End If

   If Sek_dzi = 6 Then                       'przekroczenie licznika dziesiąte sekundy
   Sek_dzi = 0                                    'wyzerownie licznika
   Incr Min_jed                                   'zwiększ stan licznika jednostek minuty
   End If

   If Min_jed = 10 Then                      'przekroczenie licznika jednostek minuty
   Min_jed = 0                                    'wyzerownie licznika
   Incr Min_dzi                                   'zwiększ stan licznika dziesiąte minuty
   End If

   If Min_dzi = 6 Then                       'przekroczenie licznika dziesiąte minuty
   Min_dzi = 0                                    'wyzerownie licznika
   End If

Return                                            'koniec procedury

keruseykaryu

Post autor: keruseykaryu » 26 cze 2010, 9:20

Brak CTC! :( A to taka pożyteczna funkcja licznika... No i byka masz już na starcie. Pierwsze przerwanie pojawi się po... 1,04sek.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 26 cze 2010, 10:03

Stoper w sklepie czy na targowisku kosztuje 25-40zł, a ty będziesz go robił 3-4 tygodnie i wykosztuje cię 80zł, lub więcej, jak będziesz chciał mieć gigantyczny wyświetlacz. Co gorsza dokładność twojego stopera będzie zależeć nie tylko od programu, ale także od jakości oscylatora który zastosujesz i jego właściwość.

Awatar użytkownika
XAX
-
Posty: 7
Rejestracja: 22 cze 2010, 21:42
Lokalizacja: Kraków

Post autor: XAX » 26 cze 2010, 19:34

:arrow: keruseykaryu
To co zamieściłem to fragment pokazowy.
Tak na wszelki wypadek dla innych zielonych, żeby nie musieli pisać na forum :)

:arrow: kayron
Nie potrzebuje super chiper dokładności bo będę mierzył czas modeli RC.
Będziemy urządzać tego typu zawody Zawody RC

To co pisałem potrzebowałem było fragment większego projektu.

Założenia są takie:
LCD graficzny 240x64
Pamięć wyników dla kilku modeli
Dwie bariery podczerwieni lub na laserkach. Dla startu i mety (konfigurowane).
Wyzwalanie przy pomocy startera, czasu lub po przekroczeniu bariery.
Wykrywanie falstartu.
Lampy sygnalizacyjne startu (5 sztuk)
Sygnalizator dźwiękowy.

Potem ma być transmisja do laptopa (USB lub radiowo)

Tego już za grosze się nie kupi.
Zresztą nawet nie można nic takiego kupić.

ODPOWIEDZ