Uživatel:Polanjir
Z MAM wiki
(→Wattmetr na nepájivém poli) |
m (kategorie) |
||
(Nejsou zobrazeny 2 mezilehlé verze.) | |||
Řádka 323: | Řádka 323: | ||
=== Zdrojový kód semestrální práce === | === Zdrojový kód semestrální práce === | ||
<br> | <br> | ||
+ | |||
+ | Zdrojový kód semestrální práce je rozdělen do tří částí z důvodu lepší přehlednosti. Všechny jsou řešeny tak, aby fungovaly samostatně kvůli ladění. | ||
+ | * Hlavní jádro programu, kde probíhá počítaní pulzů a jednotlivých period náběžných hran z fototranzistoru. Dále je zde matematický aparát a konečné zobrazení všech výsledků na display | ||
+ | * Druhá, neméně důležitá část programu, pracuje s RTC obvodem DS1302 a udržuje námi nastavený čas a datum zálohovaný baterii proti náhlým výpadkům napájení | ||
+ | * Poslédní část kódu je nastavovací menu, které je v programu z důvodu nastavení času, datumu, mazání hodnot v EEPROM atd. bez nutnosti použití periferního zařízení jako je např. klavesnice. | ||
Řádka 843: | Řádka 848: | ||
---- | ---- | ||
- | |||
= '''FOTO''' = | = '''FOTO''' = | ||
Řádka 854: | Řádka 858: | ||
'''Pokračování příště..... :-)''' | '''Pokračování příště..... :-)''' | ||
- | --[[Uživatel:Polanjir|Polanjir]] 28. 4. 2010, | + | --[[Uživatel:Polanjir|Polanjir]] 28. 4. 2010, 22:07 (UTC) |
+ | |||
+ | [[Category:Kód v BASCOMu]] |
Aktuální verze z 21. 2. 2011, 09:54
Jiří Polanský
předmět MAM, cvičení ČT 9:15
Obsah |
[editovat] Téma semestrální práce
[editovat] Wattmetr solární elektrárny
"Převod frekvence indikátoru (LED) elektroměru na relevatní hodnotu v jednotkách Wh, s použitím vhodného převodníku a programovacího jazyka Bascom pro AVR. Údaj bude zobrazovaný na LCD display. K mikrokontroléru bude připojen i RTC obvod pro údaj o správném času."
Je to přístroj, který má snímat pomocí fototranzistoru indikační LED diodu v elektroměru solárních panelů. Tato dioda bliká s měnící se periodou a v závislosti na ní se mění i aktuální výkon solární elektrárny. Dle výrobce elektroměru 1 impulz LED diody je roven 0,5Wh. Tudíž čítáme periodu mezi pulzy (náběžnou hranu) pro aktuální výkon i denní počet pulzů pro informaci o celkové výrobě energie. V našem přístroji byl použit fototranzistor, jelikož nemůžem zasáhnout do zapojení elektroměru a LED dioda je jediná, pro nás použitelná indikace.
větší obr. Elektroměr je přítroj nejvíc nalevo.
Semestální práci budu dělat společně s Ondřejem Veselým [1]
[editovat] HARDWARE
[editovat] ATmega168 – mikrokontrolér
Mikrokontroléry AVR jsou vyráběny firmou Atmel. Mezi jejich základní vlastnosti patří:
- 8-bitová RISC architektura
- 130 instrukcí (120 pro ATtiny), většina jednotaktových
- rozsah frekvencí od 32kHz do 20MHz
- oddělená programová a datová paměť
- programová paměť flash přeprogramovatelná za běhu, 10 000 mazacích/zápisových cyklů
- operační paměť SRAM, dvoutaktový přístup
- integrovaná EEPROM, 100 000 mazacích/zápisových cyklů
- 32 pracovních registrů
- napájení 1.8 - 5.5V, nízká spotřeba, režim spánku
- množství digitálních i analogových periferií
- jednoduché programování, software zdarma
Pro naší konstrukci jsme vybrali 8-bitový RISC mikrokontroler s typovým označením ATmega168. Disponuje 16kB programovatelné FLASH paměti, která je programovatelná přímo v aplikaci s možností uzamknutí, 10.000 zápisových/mazacích cylků s volitelnou velikostí bootovací sekce s nezávislým uzamykáním. Dále pro nás důležité hodnoty jako 1kB interní SRAM, 512 Byte velká paměť EEPROM, 8-kanálový 10-bitový A/D převodník, ale hlavně pro naše použití má mikrokontroler dva pinové vývody pro externí přerušení (INT0 a INT1) a dva čítače z čehož první TIMER0 je 16-bitový a TIMER1 pouze 8-bitový, každý s vlastní před-děličkou.
Více info v datasheet ATmega168
[editovat] DS1302 - Obvod reálného času (RTC)
Dle provedení lze RTC rozdělit takto:
- vnitřní nebo externí krystal
- vnitřní nebo externí záložní baterie
- výstup pro probouzení mikroprocesoru
Dle zapojení do obvodu:
- sériové připojení pomocí 1wire, I2C nebo 3 wire sběrnice
- paralelní připojení
Pro naší konstrukci jsme zvolili obvod reálného času od firmy Dallas s typovým označením DS1302. Tyto obvody sice nemají vnitřní baterii, ani krystal, za to však mají srozumitelné ovládání. Využívají minimální počet pinů pro komunikaci s mikroprocesorem. Obvod DS1302 komunikuje s mikroprocesorem po třech vodičích. Signál RESET aktivuje komunikaci s DS1302, signál SCLK potvrzuje platná data a nakonec signál SDATA, který data přijímá, ale i odesílá. Komunikace je dvoubytová. Nejprve se odešle příkazový byte a následně se odešle byte s daty, nebo přijme byte s daty. MSB bit příkazového bytu je vždy log. 1, jinak by nešlo do obvodu zapisovat.
- Microhead [online], poslední aktualizace 2008 [cit. 14. 4. 2010], Wikipedie. Dostupné z WWW: <http://www.microhead.cz/elektro/avr/AVRrtc_dallas.htm>
viz. [2]
Více info v datasheet DS1302
[editovat] SFH309-5 - Fototranzistor
Pro detekci červené LED diody ve wattmetru jsme použili obyčejný NPN fototranzistor SFH309-5. U jeho parametrů jsme si museli pohlídat vlnovou délku, při které ještě bude buzen dopadajícím světlem LEDky, tzn. (630 – 650)nm. Což námi zvolený fototranzistor s rozsahem (380 - 1150)nm zcela splňuje.
[editovat] MC2004B-SBL/H - Alfanumerický LCD display
Display bude sloužit jako zobrazovací jednotka naměřených hodnot.
- Rozměry LCD: 20 znaků / 4 řádky
- LCD ŘADIČ/OVLADAČ: S6A0069
- Operační napětí: 2.7 - 5.5V
- Volitelná 4 nebo 8 bitová komunikace
[editovat] USB na RS232 TTL modul
Modul USB na RS232 TTL je integrován v čipu CP2102, který tvoří most mezi USB - UART a převádí data mezi těmito formáty. Tento čip obsahuje kompletní implementaci USB řady 2.0 s full-speed režimem. K našemu mikrokontroléru je připojen pouze 3 piny (RX, TX a nesmíme zapomenout na připojení země - GND). Lze použít i napájení skrze USB a to ve formátu 5V nebo 3.3V, ale to doporučuji pouze pro odzkoušení komunikace s procesorem. Pro celkové napájení přístroje včetně LCD nám to 5V, 1A stabilizátor nenahradí.
Modul nám snadno umožní ovládat náš přístroj skrze obyčejně USB a Terminál, který obsahuje kterýkoliv PC/NTB. Proto jsme naprogramovali MENU, kde lze měnit datum, čas, mazat hodnoty uložené v EEPROM a spoustu dalších do budoucna rozšířitelných funkcí.
Hlavní přednosti
- Mini USB konektor
- USB 2.0 vyhovující, full-speed (12 Mbps)
- 1024 Bytes of EEPROM
- Použitelné výstupní napětí 3.3V nebo 5V
- Přenosová rychlost: 300 bps to 1 Mbps
- Provozní teplota –40 to +85 °C
- Velikost modulu (D * Š * V): 26 * 20 * 14mm včetně konektoru
[editovat] SOFTWARE
[editovat] Bascom
Pro naší semestrální práci jsme si vybrali programovací jazyk BASCOM AVR. Důvody naší volby byly hned dva. A to, že jazyk BASCOM je velice srozumitelný (hned na první pohled), vychazí z jazyka Visual Basic. A další neméně důležitý fakt, že bychom chtěli našim spolužákum ukázat, že existují i jiné programovací jazyky než je (Asembler), C a Java. Samozřejmě nelze popřít, ze tyto jazyky jsou pracovním nástrojem profesionálních programátorů.
Úspěch Qbasicu i Visual Basicu inspiroval v roce 1995 Marka Albertse k vytvoření nového programovacího jazyka, pojmenovaného Bascom, umožňujícího i začátečníkům napsat program pro jednočipové mikropočítače a mikrokontroléry. Tento program produkuje firma MCS electronics ve dvou implementacích - Bascom 51 pro mikrokontroléry kompatibilní s již klasickým I8051 a Bascom AVR pro RISCové mikrokontroléry ATMEL AVR.
- Hlavní výhodou je jednoduchost programování a podpora velkého množství externího hardwaru, ke kterému se přistupuje opravdu jednoduchým způsobem.
- Kompilátor má také integrovaný simulátor a programátor, který podporuje většinu ISP programátorů (na paralelní port LPT, na sériový COM i na USB).
- Součástí jsou i knihovny pro řízení flash karet, harddisků a dalších zařízení prostřednictvím systému AVR-DOS, který podporuje souborový systém FAT16 a FAT32. Více na stránkách výrobce MCS electronics.
Vzhledem k tomu, že ovládání programu Bascom je velmi intuitivní a nastavování vlastního prostředí odpovídá běžným konvencím programů běžících pod Windows, těší se stále větší oblibě.
Bascom nabízí:
- Strukturovaný BASIC s návěštími (labely)
- Strukturované programování s IF-THEN-ELSE-END IF, DO-LOOP, WHILE-WEND, SELECT- CASE
- Rychlý strojový kód
- Proměnné a návěští mohou být až 32 znaků dlouhé
- Proměnné typu Bit, Byte, Integer, Word, Long, Single , DOUBLE a String
- Podpora proměnné typu DOUBLE. Na rozdíl od jiných AVR kompilátorů vám BASCOM dává výhodu zpracovávat obrovská čísla v proměnných typu DOUBLE(8 bytů s plovoucí čárkou)
- Implementována funkce výpočtu datumu a času
- Vytvořené programy pracují se všemi AVR procesory, které mají vnitřní paměť
- Příkazy jsou velmi podobné příkazům Microsoft VB/QB
- Speciální příkazy pro LCD a grafické displeje, I2C a 1WIRE obvody, PC klávesnici, maticovou klávesnici, příjem a vysílání RC5, RC6 a Sony kódu
- TCP/IP
- Lokální proměnné, uživatelské funkce, podpora knihoven
- Integrovaná emulace terminálu s podporou download
- Integrovaný simulátor pro testování
- Integrovaný ISP programátor (podle Aplikační poznámky Atmel AVR910.asm)
- Integrovaný programátor STK200 a STK300. Také podporuje ultralevný programátor Sample Electronics. Podpora mnoha dalších programátorů přes univerzální interface
- Editor se zvýrazněním syntaxe
- Prohlížeč PDF datasheetů
- Velmi dobře zpracovaná kontextově citlivá nápověda
- A mnoho dalšího...
Pokud Vás již toto zaujalo a chtěli byste si tento programovací nástroj vyzkoušet, lze si ze stránek MCS electronics stáhnout demoverzi, která je pouze omezená délkou výsledného kódu na 4kB. Což už je polovina flash paměti ATmega8.
Download: BASCOM AVR
[editovat] Příklady
[editovat] Implementace reálného času v Bascom-AVR:
Na dvě nožičky procesoru připojíme krystal 32,768kHz a v kompilátoru napíšeme:
Config Date = Dmy , Separator = . Config Clock = Soft
Tím se nastaví vše potřebné pro běh asynchronního oscilátoru a vytvoří se dvě proměnné date$ a time$, které (jak se dá předpokládat) obsahují datum a čas s nastaveným oddělovačem. Od této chvíle už Atmel počítá každou vteřinu... :o)
Ve kterém jiném kompilátoru můžete zařídit vnitřní reálný čas připojením externího krystalu a napsáním DVOU (!) řádek kódu?
[editovat] AD prevodnik
Potřebujete analogový vstup? Vyberte si procesor, který obsahuje AD převodníky (rodina procesorů AVR má implementovány desetibitové AD převodníky), a kompilátoru řekněte, že je chcete používat pro měření a zvolte si referenci:
Config Adc = Single , Prescaler = Auto , Reference = Internal 'Zapněte převodník Start Adc 'a načtěte hodnotu, kterou změřil převodník 0: merena_hodnota=getadc(0)
Zdá se Vám měření AD převodníkem na TŘECH (!) řádcích složité? :o)
- Blikání LED diody
$regfile = "m8def.dat" 'knihovna pouziteho procesoru ATmega8 $crystal = 1000000 'krystal 1MHz Config Portd.0 = Output 'nastaveni portuD.0 jako vystup Do 'nekonecna smycka Set Portd.0 'nastavi logickou 1 na portD.0 Wait 1 'cekej 1s Reset Portd.0 'nastavi logickou 0 na portD.0 Wait 1 Loop 'skok zpet na DO End
[editovat] Zobrazení textu nebo proměnné na znakovém LCD display
Pins | Signal | Description |
1 | Ground | 0V |
2 | Vcc | +5V |
3 | Contrast Voltage | |
4 | R/S Register Select | 0=Instruction Register. 1=Data |
5 | R/W Read/Write LCD | 1=Read from LCD, 0=Write to LCD |
6 | E Clock | 450 nsecs positive pulse to initiate data transfer |
7 - 14 | Data I/O Pins | 8-bit data bus (4-bit mode only uses pins 11..14) |
$regfile = "m8def.dat" $crystal = 1000000 'definice LCD pinu Config Lcdpin = Pin , Rs = Portd.5 , E = Portd.4 , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 Config Lcd = 20 * 2 Cursor Off 'vypnuti kurzoru Cls 'vymazani LCD Dim A As Integer 'deklarace promenne jako Integer Do 'nekonecna smycka Locate 1 , 1 'pozice zobrazeneho textu na LCD osa(x,y) Lcd "Ahoj Karle" 'vypis na LCD "Ahoj karle" Locate 2 , 1 Lcd A 'vypis promenne A na LCD Loop End 'konec programu 'konec programu
[editovat] Další příklady
- Soustu dalších příkladů (cca 300) lze nalézt přímo v nainstalovaným adresáři Bascomu pod složkou SAMPLES
- Spousta návodů a příkladů (eng)
- Bascom příklady (cz)
- Jak na Bascom (cz)
- Nejvíce informací, návodů a příkladů lze sehnat zde FÓRUM Bascom (eng)
[editovat] Zdrojový kód semestrální práce
Zdrojový kód semestrální práce je rozdělen do tří částí z důvodu lepší přehlednosti. Všechny jsou řešeny tak, aby fungovaly samostatně kvůli ladění.
- Hlavní jádro programu, kde probíhá počítaní pulzů a jednotlivých period náběžných hran z fototranzistoru. Dále je zde matematický aparát a konečné zobrazení všech výsledků na display
- Druhá, neméně důležitá část programu, pracuje s RTC obvodem DS1302 a udržuje námi nastavený čas a datum zálohovaný baterii proti náhlým výpadkům napájení
- Poslédní část kódu je nastavovací menu, které je v programu z důvodu nastavení času, datumu, mazání hodnot v EEPROM atd. bez nutnosti použití periferního zařízení jako je např. klavesnice.
[editovat] Část 1. - přerušení + perioda + výpočet + zobrazení na LCD
$regfile = "m168def.dat" $crystal = 8000000 '$hwstack = 64 '$swstack = 64 '$framesize = 64 '$baud = 19200 Dim Flag_a As Word , _sec0 As Byte , _sec1 As Byte , _sec01 As Byte , _sec001 As Byte Dim Cas As Single , Cas1 As Single , Cas2 As Single , A As Single , B As Single , C As Single Dim Pulz As Byte , Ptot As Long , Pac As Single , Pac1 As Single , Preruseni As Single , Pacmax As Single Dim Asec As Byte , Asec1 As Byte , Asec01 As Byte , Asec001 As Byte Dim Pacs As String * 7 , Pacmaxs As String * 7 Const Maxpower = 4000 Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.1 , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portd.4 , Db7 = Portd.7 Config Lcd = 20 * 4 Cursor Off Cls Int_tlac Alias Portd.2 Config Int_tlac = Input Const Timer1reload = 7850 Config Timer1 = Timer , Prescale = 1 Stop Timer1 Config Int0 = Rising Load Timer1 , Timer1reload Enable Interrupts On Ovf1 Timer1_isr On Int0 Int0_int Enable Timer1 Enable Int0 Start Timer1 Do A = 0.1 * Asec1 'casovy prepocet B = 0.01 * Asec01 C = 0.001 * Asec001 Cas1 = Asec + A Cas2 = B + C Cas = Cas1 + Cas2 'perioda mezi dvema pulzy Pac = 1800 / Cas 'Pac = Int(pac1) If Pulz >= 2 Then '1 bliknuti = 0.5Wh.....tudiz potrebuju 2 pulzy na incr Ptot Pulz = 0 Incr Ptot End If If Pac < Maxpower Then 'osetreni zapisu maximalniho dosazeneho aktualniho vykonu If Pac > Pacmax Then 'maximalni dosazeny aktualni vykon Pacmax = Pac End If End If If _sec > 100 Then 'osetreni - pri 100sekundach bude aktualni vykon 0 Pac = 0 End If Locate 1 , 1 Lcd "Pac:" 'zobrazeni aktualniho vykonu Locate 1 , 5 If Pac > Maxpower Then Lcd "....... W" Elseif Pac >= 1000 Then Pacs = Fusing(pac , "####.##") Lcd Pacs ; " W" Elseif Pac >= 100 Then Pacs = Fusing(pac , "###.##") Lcd " " ; Pacs ; " W" Elseif Pac >= 10 Then Pacs = Fusing(pac , "##.##") Lcd " " ; Pacs ; " W" Else Pacs = Fusing(pac , "#.##") Lcd " " ; Pacs ; " W" End If Locate 2 , 1 Lcd "Ptot:" 'zobrazeni totalni celodenni vyroby Locate 2 , 6 Lcd Ptot ; " Wh" Locate 3 , 1 Pacmaxs = Fusing(pacmax , "####.##") Lcd "Pmax:" ; Pacmaxs ; " W" 'zobrazeni max dosazeneho vykonu Locate 4 , 1 Lcd "TimeMax:" ; Asec ; "." ; Asec1 ; Asec01 ; Asec001 'zobrazeni max periody Locate 4 , 15 Lcd _sec ; "." ; _sec1 ; _sec01 ; _sec001 'zobrazeni casu Loop Timer1_isr: Load Timer1 , Timer1reload Incr _sec001 'pricita tisiciny If _sec001 > 9 Then 'pricita setiny _sec001 = 0 Incr _sec01 If _sec01 > 9 Then 'pricita desetiny _sec01 = 0 Incr _sec1 If _sec1 > 9 Then 'pricita sekundy _sec1 = 0 Incr _sec End If End If End If Return Int0_int: Asec = _sec : Asec1 = _sec1 : Asec01 = _sec01 : Asec001 = _sec001 Timer1 = 0 _sec = 0 : _sec1 = 0 : _sec01 = 0 : _sec001 = 0 : Cas = 0 Incr Pulz Return End 'Timer value explination ' The timer is a 16Bit timer, it overflows when the timer reaches 65536 ' The AVR is running at 8000000Hz, the prescaler is 1 ' Each tick is 0,008 ms - (1 / CPUSpeed in KHz ) * Prescaler ' The timer needs 125 ticks to reach the required time ( 125 * 0,008 = 1ms) ' The start value for the timer must be set to 65411 so that it will overflow at 65536 after 125 ticks ' NOTE: The load command does the inversion for you (256-value or 65536-value)
[editovat] Část 2. - RTC(DS1302)
- Procedura pro RTC obvod DS1302 byla použita z Bascom fóra od uživatele Jordan Press
$regfile = "m168def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.1 , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portd.4 , Db7 = Portd.7
Config Lcd = 20 * 4
Cursor Off
Cls
Config Clock = User
Config Date = Mdy , Separator = /
'SET TIME / SET DATE
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
_hour = 19
_min = 00
_sec = 00
_day = 26
_month = 03
_year = 10
'proces date/time into BCD
'21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)Polanjir 21. 4. 2010, 15:14 (UTC)
'21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)21. 4. 2010, 15:14 (UTC)Polanjir 21. 4. 2010, 15:14 (UTC)
_sec = Makebcd(_sec)
_min = Makebcd(_min)
_hour = Makebcd(_hour)
_day = Makebcd(_day)
_month = Makebcd(_month)
_year = Makebcd(_year)
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'Config pinouts for clk
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Sclk Alias Portc.5
I_o Alias Portc.4
Ce Alias Portc.3
Config Sclk = Input
Config I_o = Input
Config Ce = Input
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
'make time vareables
'###############################################################################
'###############################################################################
Dim I As Byte
Dim Time_stamp As String * 8
Dim Date_stamp As String * 8
Dim Time_comand(7) As Byte
Dim Time_set(7) As Byte
Dim Time_read_comand(6) As Byte
Dim Read_time(6) As Byte
'###############################################################################
'###############################################################################
'set vareables to proper values
'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
Time_set(1) = &H00
Time_set(2) = _sec
Time_set(3) = _min
Time_set(4) = _hour
Time_set(5) = _day
Time_set(6) = _month
Time_set(7) = _year
Time_comand(1) = &H8E 'Write_wp
Time_comand(2) = &H80 'Write_sec
Time_comand(3) = &H82 'Write_min
Time_comand(4) = &H84 'Write_hrs
Time_comand(5) = &H86 'Write_day
Time_comand(6) = &H88 'Write_month
Time_comand(7) = &H8C 'Write_year
Time_read_comand(1) = &H81 'read_sec
Time_read_comand(2) = &H83 'read_min
Time_read_comand(3) = &H85 'read_hrs
Time_read_comand(4) = &H87 'read_day
Time_read_comand(5) = &H89 'read_mounth
Time_read_comand(6) = &H8D 'read_year
'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
'prgraming event
'###############################################################################
'###############################################################################
For I = 1 To 7
Reset Sclk
Set Ce
Waitus 1
Shiftout I_o , Sclk , Time_comand(i) , 3
Shiftout I_o , Sclk , Time_set(i) , 3
Reset Sclk
Reset Ce
Waitus 1
Next
'###############################################################################
'###############################################################################
Do
'reading event
'###############################################################################
'###############################################################################
For I = 1 To 6
Reset Sclk
Set Ce
Shiftout I_o , Sclk , Time_read_comand(i) , 3
Reset Sclk
Shiftin Pinc.4 , Sclk , Read_time(i) , 2
Reset Ce
Reset Sclk
Rotate Read_time(i) , Left , 1
If I = 1 Then
_sec = Read_time(i)
_sec = Makedec(_sec)
End If
If I = 2 Then
_min = Read_time(i)
_min = Makedec(_min)
End If
If I = 3 Then
_hour = Read_time(i)
_hour = Makedec(_hour)
End If
If I = 4 Then
_day = Read_time(i)
_day = Makedec(_day)
End If
If I = 5 Then
_month = Read_time(i)
_month = Makedec(_month)
End If
If I = 6 Then
_year = Read_time(i)
_year = Makedec(_year)
End If
Next
'###############################################################################
'###############################################################################
Waitms 100
Time_stamp = Time(_sec)
Date_stamp = Date(_day)
Locate 1 , 1
Lcd "Time = " ; Time_stamp
Locate 2 , 1
Lcd "Date = " ; Date_stamp
Loop
End
[editovat] Část 3. - Nastavovací MENU přes RS232
'RS232 INTERFACE 'nastaveni data a casu $regfile = "m168def.dat" $crystal = 8000000 $baud = 9600 Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.1 , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portd.4 , Db7 = Portd.7 Config Lcd = 20 * 4 Cursor Off Cls Dim _hour As Integer , _min As Integer , _sec As Integer Dim _day As Integer , _month As Integer , _year As Integer Dim Volba As Byte _hour = 00 _min = 00 _sec = 00 _day = 00 _month = 00 _year = 00 Menu: 'Disable Interrupts Print "Nastav cas =>1<=" Print "Nastav datum =>2<=" Print "Datum a cas =>3<=" Print "Konec menu =>4<=" Locate 1 , 1 Lcd "Nastav cas =>1<=" Locate 2 , 1 Lcd "Nastav datum =>2<=" Locate 3 , 1 Lcd "Datum a cas =>3<=" Locate 4 , 1 Lcd "Konec menu =>4<=" Input "Vloz volbu => " , Volba 'ASCII hodnota ze serial portu Select Case Volba Case 1 'nastaveni casu Print "Nastaveni casu" Lcd "Nastaveni casu" Input "Hodin = " , _hour '_hour = Waitkey() Input "Minuty = " , _min Input "Sekundy = " , _sec Print "Cas = " ; _hour ; ":" ; _min ; ":" ; _sec Locate 1 , 1 Lcd "Cas = " ; _hour ; ":" ; _min ; ":" ; _sec Wait 2 Goto Menu Case 2 'nastaveni data Print "Nastaveni datumu" Lcd "Nastaveni datumu" Input "Den = " , _day Input "Mesic = " , _month Input "Rok = " , _year Print "Datum = " ; _day ; "/" ; _month ; "/" ; _year Locate 1 , 1 Lcd "Datum = " ; _day ; "/" ; _month ; "/" ; _year Wait 2 Goto Menu Case 3 Print "Cas = " ; _hour ; ":" ; _min ; ":" ; _sec Locate 1 , 1 Lcd "Cas = " ; _hour ; ":" ; _min ; ":" ; _sec Print "Datum = " ; _day ; "/" ; _month ; "/" ; _year Locate 2 , 1 Lcd "Datum = " ; _day ; "/" ; _month ; "/" ; _year Wait 5 Goto Menu Case 4 'konec menu Goto Main Case Else 'spatna volba =>return Menu Print "Spatna volba" Locate 1 , 1 Lcd "Spatna volba" Wait 1 Goto Menu End Select 'Until Volba = 27 End 'Loop Until Volba = 27 'pokud byl zmacknut ESC Main: 'zde bude hlavni kod End 'konec programu
[editovat] FOTO
[editovat] Wattmetr na nepájivém poli

Pokračování příště..... :-)
--Polanjir 28. 4. 2010, 22:07 (UTC)