Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Zegarek na LCD i atmega8 ,brak precyzji...i Timer'ów.

jacynka84
-
-
Posty:150
Rejestracja:17 maja 2006, o 22:50
Lokalizacja:Sulejówek
Zegarek na LCD i atmega8 ,brak precyzji...i Timer'ów.

Postautor: jacynka84 » 11 lis 2006, o 22:56

Cześć.
Zrobiłem prosty zegarek na LCD i atmega8 ,
kwarc wewnętrzny 8Mhz
No i problem ,kod jest dość prymitywny :

Kod: Zaznacz cały

Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0 Config Lcd = 16 * 2 Dim Sekunda As Byte Dim Minuta As Byte Dim Godzina As Byte Do Waitms 1000 Incr Sekunda If Sekunda = 59 Then Sekunda = 0 Incr Minuta End If If Minuta = 59 Then Minuta = 0 Incr Godzina End If If Godzina = 24 Then Godzina = 0 End If If Sekunda = 20 And Minuta = 1 Then 'budzik,zał np. Led Reset Portx.x End If Cls Cursor Off Locate 1 , 2 Lcd "" ; Godzina Locate 1 , 4 Lcd ":" ; Minuta Locate 1 , 7 Lcd ":" ; Sekunda Loop Until Godzina = 24
Proste ,nie?
Tylko jako że nie umiem jeszcze Timer'ów obsługiwać ,nie wiem jak odmierzyć
"prawdziwą" sekundę - na razie te funkcję pełni 'Waitms 1000'
Ale jest precyzyjna jak tasak przy operacji neurochirurgicznej...
Ma ktoś pomysł aby wytrzasnąć sekundę?
Czy może wewn. kwarc nie będzie precyzyjny ??
Wie ktoś może jak najprościej się określa cyfry w wyświetlaczu Led'owym?
Np na PortB0-10 (7Pinów sterujących + 4 do tranzystorów).

mw
-
-
Posty:242
Rejestracja:23 lut 2003, o 23:22
Lokalizacja:Busko Zdrój
Kontaktowanie:

Postautor: mw » 12 lis 2006, o 00:33

Przyklad w zalaczniku
Załączniki
8_18.zip
(1.76KiB)Pobrany 29333 razy

jacynka84
-
-
Posty:150
Rejestracja:17 maja 2006, o 22:50
Lokalizacja:Sulejówek

Postautor: jacynka84 » 21 lis 2006, o 11:25

Ten mi nie działa .

Kod: Zaznacz cały

$regfile = "m8def.dat" $crystal = 11059200 Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0 Config Lcd = 20 * 4 Dim Sek As Byte Dim Mint As Byte Dim Godz As Byte Config Timer1 = Timer , Prescale = 256 'skok do podprocedury Enable Interrupts Enable Timer1 Timer1 = 22336 On Timer1 Czas: Start Timer1 Cls Cursor Off Do Incr Sek If Sek = 59 Then Sek = 0 Incr Mint End If If Mint = 59 Then Mint = 0 Incr Godz End If Loop Until Godz = 24 Locate 1 , 1 Lcd "" ; Sek Locate 1 , 4 Lcd "" ; Mint Locate 1 , 7 Lcd "" ; Godz Czas: Incr Sek Return

mw
-
-
Posty:242
Rejestracja:23 lut 2003, o 23:22
Lokalizacja:Busko Zdrój
Kontaktowanie:

Postautor: mw » 21 lis 2006, o 11:42

Co sie dzieje dokladnie?

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 21 lis 2006, o 23:23

Dostajesz gotowca jak na tacy - to przynajmniej byś się wysilił i opisał co nie działa? Już nie wspomnę że wypada podziękować MW :x

jacynka84
-
-
Posty:150
Rejestracja:17 maja 2006, o 22:50
Lokalizacja:Sulejówek

Postautor: jacynka84 » 22 lis 2006, o 11:10

Spoko Fredy ,dzięki, ten twój kod jest całkiem zrozumiały , i coś zadziałało ,lecz zwykły zegarek można w prostrzy sposób zrobić ,
A to co nie działa to to że w ogóle pomimo wyliczenia i zewn kwarcu nie trzyma dokładności lub zwyczajnie sie śpieszy ,jakieś kilkanaście razy za szybko... :D
Chyba te tajmery coś z nimi nie tak.
O to najbardziej aktualny kod

Kod: Zaznacz cały

$regfile = "m8def.dat" $crystal = 11059200 Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0 Config Lcd = 20 * 4 Config Portc = Output Portc = &B11111111 Dim Sek As Byte Dim Mint As Byte Dim Godz As Byte Config Timer1 = Timer , Prescale = 256 Enable Timer1 Enable Interrupts Start Timer1 Timer1 = 22336 On Timer1 Czas Do If Pinc.4 = 0 Then Waitms 40 If Pinc.4 = 0 Then Incr Mint End If End If If Pinc.5 = 0 Then Waitms 40 If Pinc.5 = 0 Then Incr Godz End If End If If Sek = 60 Then Sek = 0 Incr Mint End If If Mint = 60 Then Mint = 0 Incr Godz End If If Godz = 24 Then Godz = 0 End If Locate 1 , 8 Lcd "" ; Godz ; " " ; Mint ; " " ; Sek Loop Czas: Incr Sek Return
ALbo odświerzanie z udziałem Cls sprawia że prawie nic nie widać ,albo sie śpieszy ,już nie wiem co mam robić... :566:

[ Dodano: 22-11-2006, 10:17 ]
Fuse'y to : Ext XTAL (1110 ,tak mi sie wydaje), Delay 4ms, CKOPT = 0 .

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 22 lis 2006, o 22:37

To nie ja ci wysłałem plik tylko MW.
A po drugie jaki sens ma ten twój kod

If Pinc.4 = 0 Then
Waitms 40
If Pinc.4 = 0 Then
Incr Mint
End If
End If

przecież sprawdzasz dwa razy ten sam warunek- chyba w drugim ifie ma być PinC.4=1

:?

jacynka84
-
-
Posty:150
Rejestracja:17 maja 2006, o 22:50
Lokalizacja:Sulejówek

Postautor: jacynka84 » 23 lis 2006, o 01:32

Dobrze jest.
To do nastawiania godziny.
Przepraszam że pomyliłem sie MW.

[ Dodano: 23-11-2006, 00:34 ]
wbij to sobie do procka ,ustaw jakikolwiek zegarek i guzik do zmiennej godzina.

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 23 lis 2006, o 08:43

Zwróć uwagę że ładujesz Timer1 tylko na początku programu. Póżniej już tego nie robisz. Powinieneś w każdym przerwaniu ustawiać początkową wartość timer1 bo inaczej zacznie liczyć od 0.
Wstaw w procedurę Czas: Counter1 = Counter1 + 22337

[ Dodano: 23-11-2006, 07:45 ]
Rozumiem już ten twój podwójny if - jest OK

jacynka84
-
-
Posty:150
Rejestracja:17 maja 2006, o 22:50
Lokalizacja:Sulejówek

Postautor: jacynka84 » 29 gru 2006, o 19:51

Ten kod działa PRAWIE dobrze - spóźnia się - pomimo obliczenia timera.

Kod: Zaznacz cały

$regfile = "m32def.dat" $crystal = 11059200 Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0 Config Lcd = 20 * 4 Config Portc = Output Portc = &B11111111 Config Timer1 = Timer , Prescale = 256 Enable Interrupts Enable Timer1 Counter1 = 22336 'wartość początkowa wpisywana do On Timer1 Skd Start Timer1 Dim Gdz As Byte Dim Mnt As Byte Dim Sek As Byte Cls Do If Pinc.4 = 0 Then Waitms 70 If Pinc.4 = 0 Then Incr Mnt End If End If If Pinc.6 = 0 Then Waitms 70 If Pinc.6 = 0 Then Incr Gdz End If End If If Pinc.5 = 0 Then Waitms 70 If Pinc.5 = 0 Then Incr Sek End If End If If Sek = 59 Then Sek = 0 Incr Mnt End If If Mnt = 59 Then Mnt = 0 Incr Gdz End If If Gdz = 24 Then Gdz = 0 End If Cursor Off Locate 4 , 12 Lcd "" ; Gdz ; ":" ; Mnt ; ":" ; Sek ; " " Loop Skd: Incr Sek Return

mw
-
-
Posty:242
Rejestracja:23 lut 2003, o 23:22
Lokalizacja:Busko Zdrój
Kontaktowanie:

Postautor: mw » 29 gru 2006, o 22:24

Jak duże jest opóźnienie?

jacynka84
-
-
Posty:150
Rejestracja:17 maja 2006, o 22:50
Lokalizacja:Sulejówek

Postautor: jacynka84 » 30 gru 2006, o 05:52

Po 5 minutach od synchro z innym zegarkiem , widać już jakieś 5-7minut różnicy .
Jak od zera jest na tym 5minut to na przykładowym jakieś 10minut.

[ Dodano: 30-12-2006, 05:59 ]
Może ktoś wie jak sie ustawia ten Timer1 aby zliczył dokładnie 1 sekundę ?

mw
-
-
Posty:242
Rejestracja:23 lut 2003, o 23:22
Lokalizacja:Busko Zdrój
Kontaktowanie:

Postautor: mw » 30 gru 2006, o 07:14

Do procedury

Skd:

Incr Sek

Return

wstaw

Counter1 = Counter1 + 22337

jacynka84
-
-
Posty:150
Rejestracja:17 maja 2006, o 22:50
Lokalizacja:Sulejówek

Postautor: jacynka84 » 30 gru 2006, o 17:48

Jeśli o to ci chodziło - to nie działa za dobrze... pogina jakieś 1000! x za szybko .
I nie mam pojęcia co trzeba zrobić aby to naprawić. Cały czas czytam coś o
Timer'ach

Kod: Zaznacz cały

$regfile = "m32def.dat" $crystal = 11059200 Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0 Config Lcd = 20 * 4 Config Portc = Output Portc = &B11111111 Config Timer1 = Timer , Prescale = 256 Enable Interrupts Enable Timer1 'wartość początkowa wpisywana do On Timer1 Skd Start Timer1 Dim Gdz As Byte Dim Mnt As Byte Dim Sek As Byte Cls Do If Pinc.4 = 0 Then Waitms 70 If Pinc.4 = 0 Then Incr Mnt End If End If If Pinc.6 = 0 Then Waitms 70 If Pinc.6 = 0 Then Incr Gdz End If End If If Pinc.5 = 0 Then Waitms 70 If Pinc.5 = 0 Then Incr Sek End If End If Incr Sek If Sek = 60 Then Sek = 0 Incr Mnt End If If Mnt = 60 Then Mnt = 0 Incr Gdz End If If Gdz = 24 Then Gdz = 0 End If Cursor Off Locate 4 , 12 Lcd "" ; Gdz ; ":" ; Mnt ; ":" ; Sek ; " " Loop Skd: Incr Sek Counter1 = Counter1 + 22337 Return
[/list]

Radek
-
-
Posty:1
Rejestracja:21 mar 2003, o 21:39
Lokalizacja:Katowice

Postautor: Radek » 16 sty 2007, o 21:06

Cześć może spróbuj taki kod:

$regfile = "m32def.dat"
$crystal = 8000000

Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.6 , Rs = Portd.7
Config Lcd = 16 * 1a


Dim Sek As Byte
Dim Mint As Byte
Dim Godz As Byte

Config Timer1 = Timer , Prescale = 256
Enable Interrupts
Enable Timer1
Timer1 = 32000
On Timer1 Czas:
Start Timer1

Cls
Cursor Off

Sek = 0
Lcd "" ; Godz ; ":" ; Mint ; ":" ; Sek ; " "
Do

'Incr Sek

If Sek = 59 Then
Sek = 0
Incr Mint
End If

If Mint = 59 Then
Mint = 0
Incr Godz
End If

Loop Until Godz = 24

Czas:
Timer1 = 32000
Incr Sek
Cursor Off
Cls

Lcd "" ; Godz ; ":" ; Mint ; ":" ; Sek ; " "
Return


Chodzi w miarę dobrze. Ustawiony jest wewnętrzny oscylator M-ki na 8 Mhz. No i oczywiście piny podłączenia do LCD będą u Ciebie inne.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 25 gości