[BASCOM] Program "Minutnik"

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
tomson
-
Posty: 29
Rejestracja: 26 lut 2007, 18:02
Kontakt:

[BASCOM] Program "Minutnik"

Post autor: tomson » 18 mar 2007, 17:51

Witam
Napisałem program w którym po naciśnięciu przycisku S1 następuje załaczenie przekaźnika na czas 1 minuty
Tym samym przyciskiem można również przed upływem minuty wyłączyć przekaźnik
Problem jest taki że chciałbym aby timer0 zaczął odliczać dopiero po naciśnięciu i puszczeniu przycisku
W tej chwili timer cały czas pracuje i powoduje to losowy czas wyłączenia

Kod: Zaznacz cały

    $regfile = "attiny2313.dat"
$crystal = 4000000
Config Portb = 255
       Portb = 255
Config Portd = &B1111100
       Portd = &B1111111
Config Timer0 = Timer , Prescale = 64
On Timer0 Minutnik
Dim Sekunda As Byte
Dim Minuta As Byte
S1 Alias Pind.2
Enable Interrupts
Enable Timer0
Load Timer0 = 250
'///////////////////////////////////////////////////////////
Do                       'program główny w którym po naciśnięciu S1
Debounce S1 , 0 , Przekaznik , Sub       'przenosi nas do podprogramu "przekaznik"
Loop
End
'///////////////////////////////////////////////////////////
Minutnik:                'ten podprogram ma na celu wyłaczyć przekaźnik
Load Timer0 = 250        'po upływie 1 minuty
Incr Sekunda
If Sekunda = 250 Then
Incr Minuta
If Minuta = 60 Then
Set Portb.1
Minuta = 0
End If
End If
Return
'//////////////////////////////////////////////////////////
Przekaznik:
Bitwait S1 , Set         'Jeżeli został naciśnięty przycisk S1 to czekać aż zostanie puszczony
Toggle Portb.1           ' i następnie zmieniony stan na wyjściu B1
Return                   'powrót do programu
Ostatnio zmieniony 01 sty 1970, 1:00 przez tomson, łącznie zmieniany 1 raz.

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 18 mar 2007, 19:16

Wykorzystaj polecenia:

Kod: Zaznacz cały

Start Timer0 ' aby uruchomić
' i
Stop Timer0 ' aby zatrzymać

tomson
-
Posty: 29
Rejestracja: 26 lut 2007, 18:02
Kontakt:

Post autor: tomson » 18 mar 2007, 19:40

Próbowałem ale nie wiem czy po instrukcji STOP dokonuje się wyzerowanie timera
Nie bardzo chciało to mi działać, ale to była wina ponieważ pomiar czasu robiłem przy pierwszym podejściu zanim nastąpiło wykonanie instrukcji STOP
Przy drugiej próbie już liczy poprawnie ponieważ timer jest zatrzymany
z Moich pomiarów wynika że program oblicza mi 1 minutę i 3 sekundy
Czytam w książce i niemogę nadal zrozumieć jak się oblicza PRESKALE i potem co wpisać w LOAD timer0 = ?
W książce przykłady są dla kwarca 8MHz a ja mam 4MHz

zastosowanie instrukcji Start i Stop zrobiłem w poniższy sposób

Kod: Zaznacz cały

'///////////////////////////////////////////////////////////
Minutnik:                'ten podprogram ma na celu wyłaczyć przekaźnik
Load Timer0 = 250        'po upływie 1 minuty
Incr Sekunda
If Sekunda = 250 Then
Incr Minuta
If Minuta = 60 Then
Set Portb.1
Minuta = 0
Stop Timer0
End If
End If
Return
'//////////////////////////////////////////////////////////
Przekaznik:
Bitwait S1 , Set         'Jeżeli został naciśnięty przycisk S1 to czekać aż zostanie puszczony
Start Timer0
Toggle Portb.1           ' i następnie zmieniony stan na wyjściu B1
Return                   'powrót do programu

asdek
-
Posty: 10
Rejestracja: 18 mar 2007, 13:43

Post autor: asdek » 20 mar 2007, 12:42

witam,
Masz 8 bitowy timer (timer0), który zlicza do 255 i generuje przerwanie.
W takiej strukturze programu, jaką masz napisaną timer przepełnia się co 4ms i zgłasza przerwanie.
Dlaczego?
prescaler/4MHz= co ile sie zwiękeszy timer, np.
1/4000000=0,25us
0,25us*to co wpiszesz do timera=czas do ilu będzie zliczał timer, np.
0,25us*250=62,750us
Dalej, aby uzyskać przerwanie co 1 sekundę radziłbym użyć 16 bitowego timera1 (który zlicza do 65536).
zgodnie z tymi śmiesznymi wzorkami powyżej;
64/4000000=16us
żeby uzyskać 1s przy prescale=64:
x=1s/16us=62500
i to wpisać do load timer.
Nie pamiętam czy nie trzeba od max wartości timera odjąć 62500 i tą wartość wpisać. Jak wypiję kawę to może mi się przypomni. :P

mam nadzieję, że w miarę sensownie to wyjaśniłem.

tomson
-
Posty: 29
Rejestracja: 26 lut 2007, 18:02
Kontakt:

Post autor: tomson » 20 mar 2007, 18:04

Dzięki super mi to wytłumaczyłeś
Moje nie zrozumienie polegało na tym że ja dzieliłem fXtal/preskale a nie tak jak ty odwrotnie
Dlatego nie mogłem pojąć skąd się biorą te 0,25us
Teraz już ujażmiłem timery :) , przynajmniej w podstawowym zakresie


Edit: jeszcze mam jeden problem

1/4000000=0,00000025
0,00000025=0,25uS czy aby napewno ten zapis jest poprawny ?
czy nie powinno być 0,000025=0,25uS

z tego co wyszukałem to 1uS=10^-6 a więc 0,000001

...i jeszcze jedno
Jeżeli okres wynosi 100mS to jaka to częstotliwość ?? 10Hz ??

asdek
-
Posty: 10
Rejestracja: 18 mar 2007, 13:43

Post autor: asdek » 21 mar 2007, 12:12

Dzięki super mi to wytłumaczyłeś

1/4000000=0,00000025
0,00000025=0,25uS czy aby napewno ten zapis jest poprawny ?
czy nie powinno być 0,000025=0,25uS

z tego co wyszukałem to 1uS=10^-6 a więc 0,000001
"tak", zapis jest poprawny i "nie" nie powinno być 0,000025=0,25us bo jak sam powiedziałeś 1us=10^-6 czyli 0,000025=25us :) (6 razy przesuwasz przecinek)
...i jeszcze jedno
Jeżeli okres wynosi 100mS to jaka to częstotliwość ?? 10Hz ??
tak :) T=1/f, gdzie T okres w sekundach, f częstotliwość w hertzach
jeżeli T=100ms=0,1s to f=1/0,1=10 Hz
Prosta matematyka :)

pozdrawiam

tomson
-
Posty: 29
Rejestracja: 26 lut 2007, 18:02
Kontakt:

Post autor: tomson » 21 mar 2007, 15:52

Jeszcze mam wątpliwości bo coś tu jest namieszane

1) 1/4000000Hz=0,00000025 (prawda czy fałsz ? ) :D tak pokazuje kalkulator
2) 0,00000025=25uS (prawda czy fałsz) według tego co napisałeś to jest prawda
3) 1uS=10^-6 a więc 0,000001 (prawda czy fałsz) ten wzór zaprzecza temu co jest w punkcie numer 2

Po mojemu punkt pierwszy jest niezaprzeczalny ale może wynik jest w nano sekundach a nie mikro ?

asdek
-
Posty: 10
Rejestracja: 18 mar 2007, 13:43

Post autor: asdek » 21 mar 2007, 17:46

1) prawda
2) fałsz 0,00000025=0,25us a nie 25us
3) prawda :)

Wynik nie jest w nano sekundach bo nano jest 10^-12


Jeszcze raz dla pewności:
0,00000025 przesuwasz przecinek 6 razy w lewo czyli masz 0,25us czyli 250 ns (bo ns sa do -12) :D

jeszcze prosciej:
dzielisz prescaler/MHz bez milionow czyli 1/4 = 0,25 :) i teraz doklejasz jednostki:\
Mega(Hz) to 1 000 000 czyli 10^6 :) ale ze jest w mianowniku to wynik jest 10^-6 czyli us :)
wszystko teraz jasne bo już jaśniej nie umiem :)
pozdrawiam

tomson
-
Posty: 29
Rejestracja: 26 lut 2007, 18:02
Kontakt:

Post autor: tomson » 21 mar 2007, 20:50

W punkcie 2 oczywiście się pomyliłem mój błąd
Już kojarzę co i jak ale chyba chodziło ci o przesunięcie przecinka w prawo
0,00000025=0,25us

dzięki za wytłumaczenie

asdek
-
Posty: 10
Rejestracja: 18 mar 2007, 13:43

Post autor: asdek » 22 mar 2007, 7:06

no tak przesunięcie w prawo przecinka :)

ODPOWIEDZ