Uživatel:Polanjir

Z MAM wiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Část 3. - Nastavovací MENU přes RS232)
(Wattmetr na nepájivém poli)
Řádka 852: Řádka 852:
-
'''Pokračování příště (komentáře zdrojových kódů)..... :-)'''
+
'''Pokračování příště..... :-)'''
-
--[[Uživatel:Polanjir|Polanjir]] 21. 4. 2010, 14:51 (UTC)
+
--[[Uživatel:Polanjir|Polanjir]] 28. 4. 2010, 19:47 (UTC)

Verze z 28. 4. 2010, 19:47

Jiří Polanský

předmět MAM, cvičení ČT 9:15 


Obsah

Téma semestrální práce

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.

Soubor:Wattmetr2_.jpg

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]




HARDWARE

ATmega168 – mikrokontrolér


Soubor:Atmega168.jpg


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


DS1302 - Obvod reálného času (RTC)


Soubor:DS1302.jpg


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


SFH309-5 - Fototranzistor


Soubor:SFH309-5.jpg


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.

Datasheet SFH309-5


MC2004B-SBL/H - Alfanumerický LCD display


Soubor:LCDsmall.jpg


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

Datasheet LCD


USB na RS232 TTL modul


Soubor:interface.jpg


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




SOFTWARE

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




Příklady

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?



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




Zobrazení textu nebo proměnné na znakovém LCD display

Soubor:AVRLCD.png

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


Další příklady






Zdrojový kód semestrální práce



Čá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)



Čá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., E = Portd., Db4 = Portb., Db5 = Portb., Db6 = Portd., 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., 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




Čá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




FOTO


Wattmetr na nepájivém poli


Soubor:wattmetr_med.jpg


Pokračování příště..... :-)

--Polanjir 28. 4. 2010, 19:47 (UTC)

Osobní nástroje