Stránka 1 z 1

Digitální hodiny v Bascomu na ATTINY 2313

Napsal: 04 črc 2008, 21:30
od Robert
Zdravím,
potřeboval bych pomoc. Programuji hodiny v Bascomu a nejdemi to rozjet. Už nad tím sedím spoustu dní a pořád mi to nejdene. Nemněl by někdo funkční program nebo návod jak na ten program.
Díky Zatím

Napsal: 05 črc 2008, 10:24
od rkozeluh
'--------------------------------------------------------------
' Hodiny.bas
'
' Po zapnutí začne zobrazovat hodiny : minuty : vteřiny (od 0:00:00)
' K PD5 a PD6 připojte tlačítka pro nastavení
'--------------------------------------------------------------
'$sim
$regfile = "Attiny2313.DAT"
$crystal = 10000000

'Deska ZD1:
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2

'Timer1 = časovač, bez předděliče, odpojený od pinu OC1A, při shodě vynuluj čítač
Config Timer1 = Timer , Prescale = 1 , Compare A = Disconnect , Clear Timer = 1
Compare1a = 50000 'porovnávací hodnota (5 ms)

Enable Interrupts 'povol přerušení
Enable Compare1a 'povol přerušení COMPARE1A
On Compare1a Tim 'při přerušení jdi na Tim

Declare Sub Zobraz 'deklarace procedury

Dim Pocet_preruseni As Word 'počet přerušení
Dim Vterin As Byte , Minut As Byte , Hodin As Byte

Tlac_hod Alias Pind.5 'tlačítko nastavení hodin
Tlac_min Alias Pind.6 'tlačítko nastavení minut
Config Portd = Input 'celý portD vstupní
Portd = 255 'pull-up

Cursor Off 'vypni kurzor
''''''''''''''''''''''''''' HLAVNI PROGRAM '''''''''''''''''''''''''''''''''''

Pocet_preruseni = 0 'vynuluj proměnné
Vterin = 0
Minut = 0
Hodin = 0

Do

'Test tlačítek:
If Tlac_hod = 0 Then
Cls
Incr Hodin 'přičti 1
Call Zobraz
Waitms 200 'rychlost přičítání
End If

If Tlac_min = 0 Then
Cls
Incr Minut
Call Zobraz
Waitms 200
End If

'Zobrazení na displeji:
Call Zobraz
Waitms 100
Loop

''''''''''''''''''''''''''' KONEC HLAVNIHO PROGRAMU ''''''''''''''''''''''''''
End

Sub Zobraz
Cls
Lcd Hodin ; ":"

If Minut < 10 Then 'pokud minut je 0 - 9
Lcd "0" ; Minut ; ":" 'přidáme úvodní nulu, aby výsledek byl vždy dvojmístný
Else
Lcd Minut ; ":"
End If

If Vterin < 10 Then
Lcd "0" ; Vterin
Else
Lcd Vterin
End If
End Sub


Tim: 'obsluha přerušení
Incr Pocet_preruseni 'každých 5 milisec vznikne přerušení (při 10 MHz)

If Pocet_preruseni > 199 Then '200 x 5 ms = 1 sec
Incr Vterin 'zvětši o 1
Pocet_preruseni = 0 'vynuluj počítadlo
End If

If Vterin > 59 Then
Vterin = 0
Incr Minut 'každou minutu
End If

If Minut > 59 Then
Minut = 0
Incr Hodin 'každou hodinu
End If

If Hodin > 23 Then 'každý den
Hodin = 0
End If
Return

----------------------------------
toto není moje tvorba, ale našel jsem to někde na netu, tak snad by to mohlo pomoci.

Napsal: 05 črc 2008, 16:16
od nekmil
to Robert: prozraď nám schéma a výpis programu :)

Napsal: 06 črc 2008, 18:49
od Robert
Paráda. Díky moc.
Už mi to jede. Ještě bych se zeptal, co a jak mám upravit pro krystal 12 MHz. Jinak pro ,,Nekmil,, konkrétněji co máš na mysly. Schéma programu nebo fyzické desky na kterou to dám?

Napsal: 07 črc 2008, 18:12
od nekmil
Myslel jsem schéma zapojení těch hodin a výpis programu.

Při použití krystalu 12MHz změň $crystal = 12000000
a v obsluze přerušení musíš přepočítat počty přerušení

Tim: 'obsluha přerušení
Incr Pocet_preruseni 'každých 5 milisec vznikne přerušení (při 10 MHz)

If Pocet_preruseni > 199 Then '200 x 5 ms = 1 sec
Incr Vterin 'zvětši o 1
Pocet_preruseni = 0 'vynuluj počítadlo
End If

Napsal: 07 črc 2008, 18:30
od Robert
Přímo schéma ti můžu zaslat. Jinak to bude vosekaná testující deska, pouze ATTINY 2313, LCD monitor, asi čtyři tlačítka a podpůrné obvody pro chod (,,napájení,, , krystal, piezo).
Spíš to budou stopky než hodiny :lol:
Kdyžtak mi naište na ICQ

Napsal: 08 črc 2008, 09:17
od Návštěvník
jak mám upravit pro krystal 12 MHz

Stačí změnit řádek
Compare1a = 50000
na
Compare1a = 41666

Napsal: 09 črc 2008, 18:57
od nekmil
to anonym: teoreticky ano, ale stejně je třeba nastavit
$crystal = 12000000 protože jsou v programu použity instrukce WAITMS , jinak by ty časy neseděly :)

Napsal: 09 črc 2008, 19:29
od Jakut
třeba nastavit
$crystal = 12000000

To jsem předpokládal, ale i kdyby se na to zapomnělo, bude to fungovat. O něco častěji bude zobrazovat a přičítat při nastavování.
(Ten program jsem psal já).