Hlavní stránka‎ > ‎

PWM counter pro RC modely (Assembler)

   Vyšlo v časopise AR Praktická Elektronika č. 9/2011
 
 

Modeláři občas potřebují změřit výstupní signál (šířku pulzu) PWM nebo napětí U na výstupu svého RC přijímače. Nyní mají možnost si takové zařízení zhotovit a použít. Jedná se o zařízení s názvem PWM counter pro RC modely a návod na jeho stavbu naleznete zde.

 

Technické údaje

Vstupní napájecí napětí: 4,5 V až 20 V

Vstupní signál: šířkou modulovaný signál PWM pro modelářské servo

Zobrazení šířky pulzu vstupního signálu PWM: 1 – 2540µs

Zobrazení šířky pulzu vstupního signálu PWM grafem: 1 – 40 kroků po 63,5 µs

Zobrazení napájecího napětí zástupným symbolem baterie: 1 – 9 kroků, viz obr. „Symboly baterie“

 
 
 

Jak to funguje

 

Po správném připojení konektoru K1 na výstup jednoho z kanálu RC přijímače (tím je PWM counter i napájen) kontrolér PIC testuje ustálené napájecí napětí. Toto testování s označením PWRTE je nastaveno v konfiguračním slově při programování kontroléru PIC (viz tabulka „Konfigurační slovo“). PWRTE má za úkol po určitý čas držet kontrolér PIC ve stavu RESET až do zmíněného ustálení vstupního napětí. Po ukončení RESETU naběhne program a zobrazí po 3 sekundy na displeji LCD úvodní obrazovku s nápisem „PWM counter“ a verzí nahraného programu (např. „V1.0“). Po tomto úvodu program přistoupí k cyklickému načítání vstupu PWM na vývodu kontroléru PIC RC0 a měřením vstupního napětí. Vstupní napětí je měřeno za ochrannou diodou (proti přepólování) D1 a je vedeno přes odporový dělič složený z odporů R3 a R4 až na vývod kontroléru PIC RA0. Za pomoci 10ti bitového AD převodníku a výpočetních rutin je hodnota naměřeného vstupního napění zobrazena zástupnými symboly baterie v pravém rohu LCD displeje. Tabulka zástupných symbolů ‚baterií‘ a k nim přiřazených napětí je na obrázku „Symboly baterie, obsazení EEProm“. Nyní program testuje vstup signálu PWM na zkrat na plus nebo zkrat na mínus. Zkrat na mínus může též signalizovat neaktivní signál PWM. Pro zobrazení zkratu na minus nebo neaktivního signálu PWM program musí nasbírat 255 vzorků s hodnotou „log 0“ a periodou testování cca 90 µs. Pakliže se na vstupu signálu PWM již nenachází „log 0“ a nasbíraných vzorků bylo méně jak 255, program začne načítat šířku pulzu PWM. V opačném případu program začne testovat vstup signálu PWM na zkrat na plus. Aby bylo možné zobrazit tento zkrat na plus musí program nasbírat 255 vzorků s hodnotou „log 1“ a periodou testování cca 10 µs. Zobrazení zkratu na mínus nebo neaktivního signálu PWM na vstupu signálu PWM je zobrazováno nápisem „Low <<<“ od levé části LCD displeje. Zobrazení zkratu na plus na vstupu signálu PWM je zobrazováni nápisem „High >>>“ od levé části LCD displeje. Načítání šířky pulzu vstupního signálu PWM projde nejdříve testem na sestupnou hranu staré periody a po náběhu hrany periody nové se začne načítat šířka tohoto nového pulzu. Nový pulz je zastoupen v maximálně 255 vzorcích s periodou snímání cca 10 µs. Přesáhne-li šířka pulzu snímaného signálu PWM hodnotu 255 vzorků, displej LCD zobrazí nápis „out of range“ a smyčka načítání a zobrazení začne znovu.

Je-li nasbíraný počet vzorku menší jak 255, program naplní CGRAM displeje LCD novými znaky pro grafické zobrazení načtené šířky pulzu PWM. Graf umožňuje zobrazení šířky pulzu PWM ve 40ti krocích, tj. po cca 63,5 µs. Displej LCD za grafem zobrazuje ještě číselnou hodnotu šířky pulzu PWM v mikrosekundách. Tato hodnota se pohybuje v rozmezí 1-2540 µs. Opět na poslední pozici DDRAM displeje LCD je zobrazován konkrétní zástupný symbol baterie poukazující na hodnotu vstupního napájecího napětí. Zařízení PWM counter je proti nepředpokládaným vstupům signálu PWM nebo zacyklení programu chráněn funkcí WDT. WDT je interní časovač kontroléru, který při přetečení kontrolér RESETUJE a uvede tak program na začátek, tj. úvodní obrazovku „PWM counter“. Tato vlastnost WDT je povolena v konfiguračním slově kontroléru při programování kontroléru (viz konfigurační slovo).
 
 
 

 

 

 

 

                                    

                      

 

 

                         

 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
Popis DC/DC a napájení

 

O kontrolu vstupního napájecího napětí pro celé zařízení se stará snižující DC/DC převodník od fy LINEAR TECHNOLOGY LTC 3388-3 viz. obr.: ‚Blokové zapojení DC_DC LTC3388-3‘. Obvod se v této aplikaci nachází v 11ti pinovém pouzdře s označením MSOP 10-MSE. Výrobce tohoto měniče umožnil upravovat výstupní napětí ve čtyřech krocích. Kroky jsou hardwarově definovatelné logickým zapojením vývodů D0 a D1. Pro výstupní napětí 2,8 V je D1=0 a D0=0, pro 3,0 V je D1=0 a D0=1, pro 3,3 V je D1=1 a D0=0 a v případě tohoto zařízení na výstupu DC/DC snižujícího měniče LTC … je 5 V s konfigurací D1=1 a D0=1.

Zařízení – kontrolér spolehlivě pracuje už od napětí 2 V. Omezením je displej LCD, který má jako vstupní napájecí napětí 4,5-5 V a na vývodu V0 odpor upravující hodnotu napětí pro řízení jasu symbolů.

Celé zařízení spotřebovává cca 20 mA, tudíž výstupní proud DC/DC měniče, jež je 50 mA, je dostačující.

Snižující převodník U2 využívající hysterézní napěťový algoritmus, který kontroluje výstup přes interní zpětnou vazbu vývodem VOUT. Převodník nabíjí výstupní kondenzátor C6 přes cívku IN1 na hodnotu mírně vyšší než je nastavený regulační bod (viz. D0 – D1). Je to tím, že indukčnost IN1 je buzena spínačem P-MOS až na proud 150 mA a vypínána vypínačem N-MOS. To dodává účinně energii do výstupního kondenzátoru C6. Výstupní hodnota napětí je odvislá od hodnoty vstupního napětí VIN a zpětné vazby VOUT a hodnoty indukčnosti.

Je-li na výstupu snižujícího převodníku požadované napětí, výstup spínačů MOS se uvede do spánku a převodník sleduje vnitřním komparátorem výstupní napění převodníku. Během tohoto spánku výstupní energii poskytuje výstupní kondenzátor C6. Když výstupní napětí klesne pod hodnotu stanovenou převodníkem, převodník se probudí a cyklus se opakuje.

Tento hysterézní způsob regulace výkonu snižuje ztráty spojené se spínáním FET a udržuje výstup při nízkém zatížení převodníku. Převodník přináší 50 mA průměrného zatěžovacího proudu při přepínání.

Je-li komparátor převodníku v režimu spánku, může být N-MOS sepnut a přivádět tak proud do indukčnosti. Tím převodník zabraňuje ztrátám při prodlevě.

Převodník funguje pouze tehdy, je-li výstupní napětí vybíjeno a převodník není ve stavu spánku. To umožňuje být převodníku vysoce efektivní a mít vlastní spotřebu nižší jak 10 µA.

 
 
 
 
 
 

Obsazení adres EEPROM kontroléru PIC

 

Na adresách 0 – 19 EEPROM jsou umístěny mezní hodnoty pro zobrazování jednotlivých zástupných symbolů baterie. Přiřazení hodnot k těmto symbolům je patrné z tab. „Symboly baterie, obsazení EEPROM.“ Každý symbol je ohraničen hodnotami (OD až (DO-1)). Tyto hodnoty dle použitého AD převodníku PIC se mohou pohybovat v 10bitovém rozsahu, tj. 0 – 1023 DEC/vzorek. Protože tento kontrolér PIC pracuje pouze s 8bitovými daty programu, musíme toto ohraničení (OD až (DO-1)) rozdělit na dva 8bitové bajty, tj. „Mezní hodnota MSB, mezní hodnota LSB.“ 

Příklad:

Mezní hodnota 16 bit = 307 DEC = 16 bit BIN = 0000.0001.0011.0011

15 – 8 bit = 0000.0001 = 1 DEC

7 – 0 bit = 0011.0011 = 51 DEC

 

Hodnota 16bitového vzorku Byt ze vstupního napětí Uin(0 - 20 V) spočítáme takto:

 

Byt = Uin / (Uin max/1024) = 6/(20/1024) = 307 DEC

 

 

 

Hodnota napětí na AD převodníku z 16bitovho vzorku Byt spočítáme takto:

 

UAD = Byt * (5/1024) = 1,49 V

 

Adresy 20 – 23 EEProm kontroléru PIC jsou obsazeny znaky aktuální verze SW (např. v1.0).

 
 
 
 
 

Sestavení a oživení

 

Deska s plošnými spoji PWM counteru je na obr. 1 a 2. Na desku DPS nejprve osadíme IO s označením U2. Jedná se o velice malou součástku, která při osazování potřebuje pevnou ruku a přesné oko. U2 je vyroben v pouzdře MSOP 10 –MSE. Tento typ pouzdra má mimo malého rozměru a deseti bočních nožiček na svém bříšku ještě jednu kovovou plošku – nožičku, kterou je též nutné připájet.

Jako finta se při osazování U2 osvědčilo zlehka a stejnoměrně pocínovat kontaktní plochy DPS (bez zkratů) určené pro styk s vývody U2. Poté na pocínované kontaktní plochy přesně položíme  a tenkým šroubováčkem přitlačíme U2.  Takto připravený obvod na krátkou ale dostatečnou dobu nahřejeme horkovzdušnou pistolí až se obvod U2 připájí. Pro nahřání by měla stačit teplota cca 300 °C.

Dále osadíme mechanické prvky jako jsou kontaktní piny (hřebínek) displeje LCD a napájecí a signálový vodič označený K1. Dále až na kontrolér a displej LCD osadíme zbylé součástky.

K napájecímu konektoru K1 (pin 1 GND, pin 2 plus) připojíme napájecí napětí 5 V a vyzkoušíme, zda na vývodech pro kontrolér (Vdd pin 20, GND pin 8 a 19) je správné napětí 4,5-5 V. Je-li napájení v pořádku,  mezi vývody pro kontrolér (GND pin 8 nebo 9) a (RA0 pin 2) připojíme dočasně odpor 10 kOhmu. Nyní zvýšíme vstupní napětí na 20,00 V a na vývodu pro kontrolér (RA0 pin 2) by mnělo být 5,00 V. Případně můžeme provést požadovanou korekci tohoto 5V napětí odporovým děličem R3 a R4. Tím nastavíme poměr napětí pro AD převodník. Je-li vše v pořádku, odpojíme vstupní napětí od konektoru K1 a připájíme kontrolér PIC a LCD displej. Po připojení programátoru (např. PRESTO od firmy ASIX) ke konektoru ICSP podle obr. „Zapojení konektorů“ a nastavení konfiguračního slova kontroléru PIC podle tab. „Konfigurační slovo“ můžeme nahrát program do kontroléru PIC. Pak už můžeme hotové zařízení připojit konektorem K1 k jednomu z výstupů RC přijímače a testovat jeho signální výstup PWM a napájení. 

 
 
 Hotový program HEX: Stáhnout zde 
 
 Konfigurační slovo kontroléru

 

                               _Config 0f06

                                PWRTE            - On

                                WDT                - On

                                CP                   - On

                                oscilátor HS, 20 MHz
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
Mechanické zapojení
 
Modul displeje LCD a modul zařízení PWM counteru jsou spojeny přes propojovací hřebínek tak, by oba moduly byly v zákrytu a kontrolér PIC byl umístěn na odvrácené straně desky plošného spoje od modulu displeje LCD. Oba tyto moduly jsou v rozích sešroubovány přes distanční sloupky vysoké dle výšky izolantu hřebínku cca 2,5 mm (viz obr. „Boční pohled“).  Celé zařízení pak oparně zatavíme do široké termobužírky. Průhled na zobrazovací část displeje LCD opatrně prořízneme lámacím nožem nebo skalpelem. Tímto je zařízení sestaveno a připraveno k použití.
 
 
 
 
 
 
 
 
 
 Náhled do výpisu programu
 
 
;program na obsluhu zarizeni PWM counter pro RC modely v1.0.
 include<p16f876.inc>
 include <makra.inc>

 list c=150,n=0,f=inhx8m,p=16F876,r=dec,x=on,fixed
 __Config 0f06h    
 ;PWRTE,WDT,HS,CP                                                                                                                               
;**************************************************************************
;*                                PIC16F872/3                             *
;*                             --------\/--------                         *
;* ICSP Pull-up 10kOhm VPP    -|MCLR     PGD/RB7|-  LCD- D8   ICSP- DATA  *
;*UBat = 0-10V/Trim 27kOhm   -|RA0/AN0  PGC/RB6|-  LCD- D7   ICSP- CLOCK *
;*                            -|RA1/AN1      RB5|-  LCD- D6            *
;*                         -|RA2/AN2      RB4|-  LCD- D5               *
;*                      -|RA3/AN3  PGM/RB3|-  LCD- D4             *
;*                         -|RA4/T0CKL    RB2|-  LCD- D3               *
;*                         -|RA5/AN4      RB1|-  LCD- D2               *
;*                     GND    -|Vss      INT/RB0|-  LCD- D1               *
;*       Krystal 20,00 Mhz    -|osc1         Vdd|-  +5V                   *
;*       Krystal 20,00 Mhz    -|osc2         Vss|-  GND                   *
;*                 PWM_in     -|RC0       Rx/RC7|-  LCD- E                *
;*                            -|RC1       Tx/RC6|-  LCD- RS               *
;*                            -|RC2          RC5|-                        *
;*                            -|RC3/SCL  SDA/RC4|-                        *
;*                             ------------------                         *
;*                                                                        *
;**************************************************************************
Ram    EQU  32   ;První adresa paměti RAM pro PIC16F872 = 368 bytů ... Strana1= (20h - 7Fh) tj.: 95 bytů
TMP0     EQU     Ram+1   ;Nacítání casových smycek
TMP1     EQU     Ram+2  ;Nacítání casových smycek
TMP2      EQU     Ram+3  ;Nacítání casových smycek
TMP3   EQU  Ram+4
IMPwidth  EQU  Ram+5  ;Načtená šířka ovládacího impulzu
Imp255m   EQU  Ram+6  ;Proměnná pro smyčku analiz
LCDcmnd   EQU  Ram+7  ;E a RS LCD
Znak   EQU  Ram+8  ;Univ. promněnná
Highs   EQU  Ram+9  ;Vzorkovací smyčka pro test na "H"
Lows   EQU  Ram+10  ;Vzorkovací smyčka pro test na "L"
NUM_A     EQU     Ram+11     ;8 bit nasobenec - multiplicand
NUM_B     EQU     Ram+12     ;8 bit nasobitel - multiplier
H_BYTE    EQU     Ram+13     ;High byte z 16 bit vysledku
L_BYTE    EQU     Ram+14     ;Low byte z 16 bit vysledku
COUNT     EQU     Ram+15     ;Čitací smycka násobení
CISLO_H   EQU     Ram+16  ;BCD konvert vstup cislo H
CISLO_L   EQU     Ram+17  ;BCD konvert vstup cislo L
JEDNA   EQU     Ram+18  ;BCD konvert vystup jednoky
DESET   EQU     Ram+19  ;BCD konvert vystup desitky
STO    EQU     Ram+20  ;BCD konvert vystup stovky
TISIC   EQU     Ram+21  ;BCD konvert vystup tisice
DTISIC   EQU     Ram+22  ;BCD konvert vystup desetitisice
MOD    EQU  Ram+23  ;Delenec, jako zbytek po deleni
INT    EQU  Ram+24  ;Vysledek - cele cislo
DLTL   EQU  Ram+25  ;Delitel
NIC    EQU  Ram+26  ;Pomenná po smycku grafu
RFlag   EQU  Ram+27  ;Příznaky rozmezi
R_OD_H   EQU  Ram+28  ;Hodnota rozmezi od MSB
R_OD_L   EQU  Ram+29  ;Hodnota rozmezi od LSB
R_DO_H   EQU  Ram+30  ;Hodnota rozmezi do MSB
R_DO_L   EQU  Ram+31  ;Hodnota rozmezi do LSB
ROZ_H   EQU  Ram+32  ;Porovnávaná hodnota MSB
ROZ_L   EQU  Ram+33  ;Porovnávaná hodnota LSB
CIS1_L   EQU  Ram+34  ;Hodnota L odcitance
CIS1_H   EQU  Ram+35  ;Hodnota H odcitance
CIS2_L   EQU  Ram+36  ;Hodnota L odcitatele
CIS2_H   EQU  Ram+37  ;Hodnota H odcitatele
Q_L    EQU  Ram+38  ;Výsledek odcitani L
Q_H    EQU  Ram+39  ;Výsledek odcitani H
;**************************************************************************
#define  PWM_in  PORTC,0  ;Načítání PWM z pinu RC0 (pulz ?ms)
#define   RS  PORTC,6  ;Povel LCD vyber registru
#define   E  PORTC,7  ;Povel LCD povoleni zapisu
#define  RFlag_H  RFlag,0  ;Priznak horniho rozmezi
#define  RFlag_L  RFlag,1  ;Priznak dolniho rozmezi
#define  RFlag_S  RFlag,2  ;Priznak stredniho rozmezi
;**************************************************************************
org 2100h      ; přednast. adr. v EEPROM ... adr.: 0-19 jedná se o porovnávací 16 bitové hodnoty k AD převodu
de 0,0,0,253,1,5,1,13,1,20,1,28,1,36,1,43,1,51,255,255,86,49,46,48
;**************************************************************************
org 0x0000
  Call INI_PIC 
  call Uvod
  goto Start
  goto $-3
org 0x0004      ;Vektor přerušení
;------------------------------------------------------------------------- 
org 0x0005      ;Stranka0 programove pamneti
  
Start
 
 
;-----------zobrazení stavu baterie------
  Call AD_UBat     ;Zavolani si pro hodnoty převodu (10bit)
;---------------------  
  movfw ADRESH     
  movwf ROZ_H
  Bank1
  movfw ADRESL
  Bank0 
  movwf ROZ_L  
  
;---------------------
F0  Bank2
  movlw 0
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_OD_H     ;Komparace a zapsani spravneho symbolu na adr 120 v CG RAM v LCD
  Bank2
  movlw 1
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_OD_L
  
  
  Bank2
  movlw 2
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_DO_H     
  Bank2
  movlw 3
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_DO_L
  
  Call ROZMEZ
  
  btfss RFlag_S
  goto F1_
  Call Bat_L
  goto VykrlBat
  
F1_  btfss RFlag_L
  goto F1
  Call Bat_L
  goto VykrlBat 
;---------------------
F1  Bank2
  movlw 2
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_OD_H     ;Komparace a zapsani spravneho symbolu na adr 120 v CG RAM v LCD
  Bank2
  movlw 3
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_OD_L
  
  
  Bank2
  movlw 4
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_DO_H     
  Bank2
  movlw 5
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_DO_L
  
  Call ROZMEZ
  
  btfss RFlag_S
  goto F2
  Call Bat_0
  goto VykrlBat 
;---------------------
F2  Bank2
  movlw 4
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_OD_H     ;Komparace a zapsani spravneho symbolu na adr 120 v CG RAM v LCD
  Bank2
  movlw 5
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_OD_L
  
  
  Bank2
  movlw 6
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_DO_H     
  Bank2
  movlw 7
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_DO_L
  
  Call ROZMEZ
  
  btfss RFlag_S
  goto F3
  Call Bat_1
  goto VykrlBat 
;---------------------
F3  Bank2
  movlw 6
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_OD_H     ;Komparace a zapsani spravneho symbolu na adr 120 v CG RAM v LCD
  Bank2
  movlw 7
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_OD_L
  
  
  Bank2
  movlw 8
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_DO_H     
  Bank2
  movlw 9
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_DO_L
  
  Call ROZMEZ
  
  btfss RFlag_S
  goto F4
  Call Bat_2
  goto VykrlBat 
;---------------------
F4  Bank2
  movlw 8
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_OD_H     ;Komparace a zapsani spravneho symbolu na adr 120 v CG RAM v LCD
  Bank2
  movlw 9
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_OD_L
  
  
  Bank2
  movlw 10
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_DO_H     
  Bank2
  movlw 11
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_DO_L
  
  Call ROZMEZ
  
  btfss RFlag_S
  goto F5
  Call Bat_3
  goto VykrlBat 
;---------------------
F5  Bank2
  movlw 10
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_OD_H     ;Komparace a zapsani spravneho symbolu na adr 120 v CG RAM v LCD
  Bank2
  movlw 11
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_OD_L
  
  
  Bank2
  movlw 12
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_DO_H     
  Bank2
  movlw 13
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_DO_L
  
  Call ROZMEZ
  
  btfss RFlag_S
  goto F6
  Call Bat_4
  goto VykrlBat 
;---------------------
F6  Bank2
  movlw 12
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_OD_H     ;Komparace a zapsani spravneho symbolu na adr 120 v CG RAM v LCD
  Bank2
  movlw 13
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_OD_L
  
  
  Bank2
  movlw 14
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_DO_H     
  Bank2
  movlw 15
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_DO_L
  
  Call ROZMEZ
  
  btfss RFlag_S
  goto F7
  Call Bat_5
  goto VykrlBat 
;---------------------
F7  Bank2
  movlw 14
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_OD_H     ;Komparace a zapsani spravneho symbolu na adr 120 v CG RAM v LCD
  Bank2
  movlw 15
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_OD_L
  
  
  Bank2
  movlw 16
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_DO_H     
  Bank2
  movlw 17
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_DO_L
  
  Call ROZMEZ
  
  btfss RFlag_S
  goto F8
  Call Bat_6
  goto VykrlBat 
;---------------------
F8  Bank2
  movlw 16
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_OD_H     ;Komparace a zapsani spravneho symbolu na adr 120 v CG RAM v LCD
  Bank2
  movlw 17
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_OD_L
  
  
  Bank2
  movlw 18
  movwf EEADR
  Bank0
  Call Read_EEP   
  movwf R_DO_H     
  Bank2
  movlw 19
  movwf EEADR
  Bank0
  Call Read_EEP
  movwf R_DO_L
  
  Call ROZMEZ
  
  btfss RFlag_S
  goto ErrBat
  Call Bat_H
  goto VykrlBat 
;---------------------    ;Pakli, že se naměřená hodnota z AD převodu nehodí k žádnému rozmezí, je zobrazeno 'E'
ErrBat movlw 199     ;2 radek, 7 znak displeje (posledni)
  call InstLCD    
  Call Cek40u 
  movlw 'E' 
  Call DataLCD
  Call Radek1
  goto Tst_H_L 
;---------------------
VykrlBat
  movlw 199     ;2 radek, 7 znak displeje (posledni)
  call InstLCD
  Call Cek40u 
  movlw 7 
  Call DataLCD
  Call Radek1 
;--------Testování vstupu na stále "L" nebo "H" ----------
Tst_H_L
  movlw 255
  movwf Highs
  movwf Lows
  
HorL btfsc PWM_in
  goto Highin
  goto Lowin
;---------------------  
Lowin Call Cek90us
  decfsz Lows
  goto HorL
  
  Call Radek1
  movlw 'L' 
  Call DataLCD 
  movlw 'o' 
  Call DataLCD 
  movlw 'w' 
  Call DataLCD 
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call Radek2
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  CLRWDT
  
  Call Radek1
  movlw 'L' 
  Call DataLCD 
  movlw 'o' 
  Call DataLCD 
  movlw 'w' 
  Call DataLCD 
  Call MezeraLCD
  Call Cek200ms
  movlw '<' 
  Call DataLCD 
  Call Cek200ms
  movlw '<' 
  Call DataLCD
  Call Cek200ms 
  movlw '<' 
  Call DataLCD  
  Call Cek200ms
  CLRWDT
  goto Start
;---------------------
Highin movfw Lows
  xorlw 255
  btfss STATUS,Z
  goto TsPWM
;---------------------
High_a Call Cek10us
  decfsz Highs
  goto High_b
  
  
  Call Radek1
  movlw 'H' 
  Call DataLCD 
  movlw 'i' 
  Call DataLCD 
  movlw 'g' 
  Call DataLCD 
  movlw 'h' 
  Call DataLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call Radek2
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  Call MezeraLCD
  CLRWDT
  
  Call Radek1
  movlw 'H' 
  Call DataLCD 
  movlw 'i' 
  Call DataLCD 
  movlw 'g' 
  Call DataLCD 
  movlw 'h' 
  Call DataLCD 
  Call MezeraLCD
  Call Cek200ms
  movlw '>' 
  Call DataLCD 
  Call Cek200ms
  movlw '>' 
  Call DataLCD
  Call Cek200ms 
  movlw '>' 
  Call DataLCD 
  Call Cek200ms
  goto Start
;---------------------
High_b btfsc PWM_in
  goto High_a
  goto TsPWM  
;--------načtení  střídy PWM ---------- 
  
TsPWM btfsc PWM_in   ;Test konce staré periody před spuštěním načítání pulzu periody nové
  goto TsPWM
  
  btfss PWM_in   ;Test začátku nastávající periody před spuštěním načítání pulzu periody
  goto TsPWM
  
  movlw 255    
  movwf Imp255m
  clrf IMPwidth
 
analiz btfss PWM_in   ;Spuštění kontroly  pulzu PWM a načtení jeho šířky 9,8u-sekundovým vzorkováním do proměnné IMPwidth
  goto Nacteno
  incf IMPwidth  
  call Cek10us
  decfsz Imp255m   ;Odčítání 2,5ms z šířky jednoho pulzu peroidy
  goto analiz 
;--------pulz je širší jak 255 vzorků --  
  Call MazLCD
  movlw 'o' 
  Call DataLCD 
  movlw 'u' 
  Call DataLCD 
  movlw 't' 
  Call DataLCD 
  Call MezeraLCD
  movlw 'o'
  Call DataLCD 
  movlw 'f' 
  Call DataLCD 
  Call MezeraLCD
  movlw 'r' 
  Call DataLCD 
  Call Radek2
  movlw 'a' 
  Call DataLCD 
  movlw 'n'
  Call DataLCD 
  movlw 'g'
  Call DataLCD 
  movlw 'e'
  Call DataLCD 
  CLRWDT
  goto Start  
;--------------------------------  
Nacteno 
  Call Radek1 
;-----------zobrazení grafu------ 
  movfw IMPwidth
  movwf MOD
  movlw 6
  movwf DLTL
  call DEL
    
  movfw INT
  movwf MOD
  movlw 5
  movwf DLTL
  call DEL
  
  movlw 9
  movwf NIC
;-------------------      
Bx  decf NIC
  decfsz INT
  goto Ax
  movfw MOD
  call DataLCD
   
Dx  decfsz NIC
  goto Cx
  CLRWDT
  goto NUMMES
  
Ax  movlw 5
  call DataLCD
  goto Bx
Cx  movlw 0
  call DataLCD
  goto Dx    
;-----------zobrazení načtených dat------  
NUMMES Call Radek2
  movfw IMPwidth
  movwf NUM_A
  movlw 10
  movwf NUM_B
  Call NASOB
  
  movfw H_BYTE
  movwf CISLO_H
  movfw L_BYTE
  movwf CISLO_L
  call HEX2BCD
  movlw 6 
  Call DataLCD
  movlw 's' 
  Call DataLCD
  goto Start
;************************************************************************* 
;---------------------PODPROGRAMY----------------------------------------
;*************************************************************************

;**************************************************************************
;                  Nastavení procesoru
;************************************************************************** 
INI_PIC          
     Bank1
   movlw 6
  movwf ADCON1    ;nastavení RA jako D ou                      
  movlw 1     ;0=výstup, 1=vstup
     movwf TRISA     
  movlw 0            
     movwf TRISB
     movlw 1     
  movwf TRISC       
  bsf  OPTION_REG,RBPU  ;vývody RB nepřipojeny na pull-up
  bcf     INTCON,GIE   ;Všechna nastavená přerušení jsou zakázána
        Bank0                   
        clrf PORTA
        clrf PORTB
        clrf PORTC 
        clrf Znak
        Call Ini_LCD  
        Call Ini_AD
        CLRWDT    
  Return
;**************************************************************************
;               AD-převodník  
;**************************************************************************
Ini_AD         
  Bank1
  movlw 142     ;Výsledek je v registech zarovnan vpravo,AN0/RA0
  movwf ADCON1
  Bank0
  movlw 193
  movwf ADCON0    ;AD převodník on, F osc/RC, RA0
  Return
;*************************************************************************
;    AD- UBat 20V (time převodu = 1,6*12+0,1= 19,3 us
;*************************************************************************
AD_UBat        ;NAčtení hodnoty UBat 20V
  bsf  ADCON0,GO 
  btfsc ADCON0,GO
  goto $-1
  Return 
;*************************************************************************
; Zjisti stred rozmezi 16bit čísla ROZ_H, ROZ_L až do hodnoty 65535
; R_DO_H, R_DO_L až po (R_OD_H, R_OD_L  vcetne), příznaky 0-3 RFlag = (RFlag_L, RFlag_S, RFlag_H)
;*************************************************************************  
ROZMEZ
  clrf RFlag
  movfw R_OD_L  ;dolni mez
  movwf CIS2_L   
  movfw R_OD_H
  movwf CIS2_H
  movfw ROZ_L
  movwf CIS1_L
  movfw ROZ_H
  movwf CIS1_H
  
  call SUB
  btfss STATUS,C
  goto v1
          
  movfw R_DO_L  ;horni mez
  movwf CIS2_L   
  movfw R_DO_H
  movwf CIS2_H
  movfw ROZ_L
  movwf CIS1_L
  movfw ROZ_H
  movwf CIS1_H
  
  call SUB
  btfsc STATUS,C
  goto v2        
;-----------------------
  bsf  RFlag_S    ;CISLO je R_OD az (R_DO-1)
  Return 
;-----------------------  
v1  bsf  RFlag_L    ;CISLO je < jak R_OD
  Return
v2  bsf  RFlag_H    ;CISLO je => R_DO
  Return
;**************************************************************************
; odečte dvě 16-bitová čísla (do výsledku 65535)
; Q_H, Q_L = CIS1_H, CIS1_L - CIS2_H, CIS2_L POZOR !!! upraveno pro test zirou vstupních hodnot v cislech 'H'
;**************************************************************************
SUB  
  movfw CIS2_L    ;CISLO_2 do W
  subwf CIS1_L, W   ;W = CISLO1_L - CISLO2_L
  movwf Q_L
  btfss STATUS, C
  goto S_1
S_3  movfw CIS2_H
  subwf CIS1_H, W   ;W = CISLO1_H - CISLO2_H
  movwf Q_H
  Return   
S_2  movfw CIS2_H    ;test zda CIS2_H je nebo není nulový
  iorlw 0
  btfss STATUS,Z
  goto S_3 
  Return
S_1  
  movfw CIS1_H    ;test zda CIS1_H je nebo není nulový
  iorlw 0
  btfsc STATUS,Z
  goto S_2    
  decf CIS1_H    ;pokud C přeteklo, tak odečti
  goto S_3  
;**************************************************************************
; Děleni MOD / DLTL = INT, zbytek MOD
;************************************************************************** 
DEL 
  clrf INT
;-------------------------------
DEL_7 movfw DLTL
  subwf MOD,W   
  btfss STATUS,C
  Return      ;zbytek po deleni v MOD
;------------------------
  incf INT,F   
  movfw DLTL
  subwf MOD,F   
  goto DEL_7
;**************************************************************************
; Nasobeni cisla NUM_A (8 bit) * NUM_B (8 bit) -> H_BYTE, L_BYTE (16 bits)
;                0FFh (255)    * 0FFh (255)    -> FE01h (65025)
;************************************************************************** 
NASOB   
  clrf H_BYTE
  clrf L_BYTE
  movlw 8     ;nastav citac rotace na 8
  movwf COUNT
  movfw NUM_A
  bcf  STATUS,C   ;Smaz Carry bit ve Status registru
;-------------------------------
LOOP rrf  NUM_B,F
  btfsc STATUS,C
  addwf H_BYTE,F
  rrf  H_BYTE,F
  rrf  L_BYTE,F
;       ------------------------
  decfsz COUNT,F
  goto LOOP    ;hodnota v COUNT neni nulova
;-------------------------------
  Return
;**************************************************************  
;  Podprogram prevede 16 bitove cislo z HEX na BCD
; CISLO_H a CISLO_L -> DTISIC, TISIC, STO, DESET, JEDNA
; Priklad: FFFFh -> 65535d
;************************************************************** 
HEX2BCD 
  clrf DTISIC
  clrf TISIC
  clrf STO
  clrf DESET
  clrf JEDNA
;-------------------------   
  swapf CISLO_H,W
  andlw 15  
  addlw 240  
  movwf TISIC
  addwf TISIC,F
  addlw 226
  movwf STO
  addlw 50
  movwf JEDNA
  movfw CISLO_H
  andlw 15
  addwf STO,F
  addwf STO,F
  addwf JEDNA,F
  addlw 233
  movwf DESET
  addwf DESET,F
  addwf DESET,F
  swapf CISLO_L,W
  andlw 15
  addwf DESET,F
  addwf JEDNA,F
  rlf  DESET,F
  rlf  JEDNA,F
  comf JEDNA,F
  rlf  JEDNA,F
  movf CISLO_L,W
  andlw 15
  addwf JEDNA,F
  rlf  TISIC,F
  movlw 7
  movwf DTISIC
  movlw 10
;       ------------------------
LB1  addwf JEDNA,F
  decf DESET,F
  btfss STATUS,C
  goto LB1
;       ------------------------
LB2  addwf DESET,F
  decf STO,F
  btfss STATUS,C
  goto LB2
;       ------------------------
LB3  addwf STO,F
  decf TISIC,F
  btfss STATUS,C
  goto LB3
;       ------------------------
LB4  addwf TISIC,F
  decf DTISIC,F
  btfss STATUS,C
  goto LB4
;--------------------------            
destis_digit
  movfw DTISIC     
  iorlw 0 
  btfss STATUS,Z
  goto $+2
  goto    tis_digit
  movfw DTISIC
  Addlw 48
  Call DataLCD 
  goto A_  
;--------------------------            
tis_digit
  movfw TISIC     
  iorlw 0 
  btfss STATUS,Z
  goto A_
  goto    sto_digit
A_  movfw TISIC
  Addlw 48
  Call DataLCD 
  goto B_      
;--------------------------            
sto_digit
  movfw STO     
  iorlw 0 
  btfss STATUS,Z
  goto B_
  goto    des_digit
B_  movfw STO
  Addlw 48
  Call DataLCD 
  goto C_ 
;--------------------------            
des_digit
  movfw DESET     
  iorlw 0 
  btfss STATUS,Z
  goto C_
  goto    jed_digit
C_  movfw DESET
  Addlw 48
  Call DataLCD  
;--------------------------  
jed_digit  
  movfw JEDNA
  Addlw 48
  Call DataLCD
  CLRWDT
  Return
;**************************************************************************
;                LCD
;************************************************************************** 
Ini_LCD
  
  clrf LCDcmnd
  call Cek15m    ;cekej 15ms
  
  movlw 56     ;8bit komunikace, 1*řádek,
  Call InstLCD
  call Cek100u 
  
  movlw 56     ;8bit komunikace, 1*řádek,
  Call InstLCD
  call Cek40u    
 
  movlw 56     ;8bit komunikace, 1*řádek,
  Call InstLCD
  call Cek40u
  
  movlw 12     ;LCD,Kurzor,Blikání Kur = off  
  Call InstLCD
  call Cek40u
    
  movlw 6     ;inkrementace, normální operace
  Call InstLCD
  call Cek40u  
  
  
  call NoveZnakyLCD
  call MazLCD
  RETURN
;------------------------------
InstLCD
  movwf Znak
  Call RS_off
  
  movfw Znak
  movwf PORTB
  Call E_on
  Call E_off
  call Cek40u    ;RS=1, zápis instr - čekej 40 us
 
  Return
;-----------------------------
DataLCD  
  movwf Znak    ;zapis dat do LCD
  Call RS_on
  
  movfw Znak
  movwf PORTB
  Call E_on 
  Call E_off
  Call Cek40u    ;RS=1, zápis dat - čekej 40 us
  Return
;-----------------------------
Radek1
  movlw 128     ;1 radek, 0 znak displeje
  call InstLCD
  Call Cek40u    ;RS=1, zápis dat - čekej 40 us
  Return
;------------------------------
Radek2
  movlw 192     ;2 radek, 0 znak displeje
  call InstLCD
  Call Cek40u    ;RS=1, zápis dat - čekej 40 us
  Return
;------------------------------
MazLCD 
  movlw 1     ;smaz LCD a vratit se na pozici 0
        Call InstLCD
  call Cek1m6   
  Return
;-----------------------------
MezeraLCD 
  movlw ' '
  call DataLCD
  RETURN 
;-----------------------------
RS_on
  btfsc RS
  Return
  movlw 64
  Call LCDcmnd_Send
  Return
;-----------------------------
RS_off
  btfss RS
  Return
  movlw -64
  Call LCDcmnd_Send
  Return
;------------------------------
E_on
  btfsc E
  Return
  movlw 128
  Call LCDcmnd_Send
  Return
;------------------------------
E_off
  btfss E
  Return
  movlw -128
  call LCDcmnd_Send
  Return
;------------------------------ 
LCDcmnd_Send
  Addwf LCDcmnd,f
  movfw LCDcmnd  
  movwf PORTC
  Return
;--------------------Zapis nových znaků do CG-RAM v LCD----------
NoveZnakyLCD      
  movlw 64     ;..... (volací adr. v LCD = 0)
  call InstLCD
  movlw 0
  call DataLCD
  movlw 0
  call DataLCD
  movlw 0
  call DataLCD
  movlw 0
  call DataLCD
  movlw 0
  call DataLCD
  movlw 0
  call DataLCD
  movlw 0
  call DataLCD
  movlw 31
  call DataLCD
 ;----------------------- 
  movlw 72     ;|.... (volací adr. v LCD = 1)
  call InstLCD
  movlw 16
  call DataLCD
  movlw 16
  call DataLCD
  movlw 16
  call DataLCD
  movlw 16
  call DataLCD
  movlw 16
  call DataLCD
  movlw 16
  call DataLCD
  movlw 16
  call DataLCD
  movlw 31
  call DataLCD
;-----------------------  
  movlw 80     ;||... (volací adr. v LCD = 2)
  call InstLCD
  movlw 24
  call DataLCD
  movlw 24
  call DataLCD
  movlw 24
  call DataLCD
  movlw 24
  call DataLCD
  movlw 24
  call DataLCD
  movlw 24
  call DataLCD
  movlw 24
  call DataLCD
  movlw 31
  call DataLCD
;-----------------------  
  movlw 88     ;|||.. (volací adr. v LCD = 3)
  call InstLCD
  movlw 28
  call DataLCD
  movlw 28
  call DataLCD
  movlw 28
  call DataLCD
  movlw 28
  call DataLCD
  movlw 28
  call DataLCD
  movlw 28
  call DataLCD
  movlw 28
  call DataLCD
  movlw 31
  call DataLCD
;-----------------------  
  movlw 96     ;||||. (volací adr. v LCD = 4)
  call InstLCD
  movlw 30
  call DataLCD
  movlw 30
  call DataLCD
  movlw 30
  call DataLCD
  movlw 30
  call DataLCD
  movlw 30
  call DataLCD
  movlw 30
  call DataLCD
  movlw 30
  call DataLCD
  movlw 31
  call DataLCD
;-----------------------
  movlw 104     ;||||| (volací adr. v LCD = 5)
  call InstLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
;-----------------------
  movlw 112     ;µ (volací adr. v LCD = 6)
  call InstLCD
  movlw 0
  call DataLCD
  movlw 0
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 25
  call DataLCD
  movlw 22
  call DataLCD
  movlw 16
  call DataLCD
;-----------------------
  Return  
;--------------------Zapis nových znaků do CG-RAM v LCD----------
NoveZnakyLCD_Bat      
Bat_H movlw 120     ;Bat U =  9/9 tj. >6V (volací adr. v LCD = 7)
  call InstLCD
  movlw 14
  call DataLCD
  movlw 27
  call DataLCD
  movlw 17
  call DataLCD
  movlw 27
  call DataLCD
  movlw 31
  call DataLCD
  movlw 27
  call DataLCD
  movlw 17
  call DataLCD
  movlw 31
  call DataLCD
  Return
 ;----------------------- 
Bat_6 movlw 120     ;Bat U =  8/9 tj. 5.85V (volací adr. v LCD = 7)
  call InstLCD
  movlw 14
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  Return
;-----------------------  
Bat_5 movlw 120     ;Bat U =  7/9 tj. 5,7V (volací adr. v LCD = 7)
  call InstLCD
  movlw 14
  call DataLCD
  movlw 27
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  Return
;-----------------------  
Bat_4 movlw 120     ;Bat U =  6/9 tj. 5,55V (volací adr. v LCD = 7)
  call InstLCD
  movlw 14
  call DataLCD
  movlw 27
  call DataLCD
  movlw 17
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  Return
;-----------------------  
Bat_3 movlw 120     ;Bat U =  5/9 tj. 5,4V (volací adr. v LCD = 7)
  call InstLCD
  movlw 14
  call DataLCD
  movlw 27
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  Return
;-----------------------
Bat_2 movlw 120     ;Bat U =  4/9 tj. 5,25V (volací adr. v LCD = 7)
  call InstLCD
  movlw 14
  call DataLCD
  movlw 27
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  Return
;-----------------------
Bat_1 movlw 120     ;Bat U =  3/9 tj. 5,1V(volací adr. v LCD = 7)
  call InstLCD
  movlw 14
  call DataLCD
  movlw 27
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 31
  call DataLCD
  movlw 31
  call DataLCD
  Return
;-----------------------
Bat_0 movlw 120     ;Bat U =  2/9 tj. 4,95V (volací adr. v LCD = 7)
  call InstLCD
  movlw 14
  call DataLCD
  movlw 27
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 17
  call DataLCD
  movlw 31
  call DataLCD 
  Return 
;-----------------------
Bat_L movlw 120     ;Bat U =  1/9 tj. < 4,95V  (volací adr. v LCD = 7)
  call InstLCD
  movlw 14
  call DataLCD
  movlw 27
  call DataLCD
  movlw 17
  call DataLCD
  movlw 25
  call DataLCD
  movlw 25
  call DataLCD
  movlw 31
  call DataLCD
  movlw 17
  call DataLCD
  movlw 31
  call DataLCD
  Return    
;-------------------------------Uvodni obrazovka-------------------------- 
Uvod
  movlw 'P'
  Call DataLCD
  movlw 'W'
  Call DataLCD 
  movlw 'M'
  Call DataLCD
  call MezeraLCD
  movlw 'c'
  Call DataLCD
  movlw 'o'
  Call DataLCD
  movlw 'u'
  Call DataLCD
  movlw 'n'
  Call DataLCD
  Call Radek2
  movlw 't'
  Call DataLCD
  movlw 'e'
  Call DataLCD
  movlw 'r'
  Call DataLCD
  call MezeraLCD
  
  Bank2
  movlw 20
  movwf EEADR
  Bank0
  Call Read_EEP
  Call DataLCD
  
  Bank2
  movlw 21
  movwf EEADR
  Bank0
  Call Read_EEP
  Call DataLCD
  
  Bank2
  movlw 22
  movwf EEADR
  Bank0
  Call Read_EEP
  Call DataLCD
 
  Bank2
  movlw 23
  movwf EEADR
  Bank0
  Call Read_EEP
  Call DataLCD
  
  Call Cek3s 
  Call MazLCD
  Return
;************************************************************************
;                EEPROM
;************************************************************************ 
Read_EEP       ;  !!! nastav EEADR !!!
  Bank3       
  bcf  EECON1,EEPGD  ;ukazatel nastavit na EEPROM paměť dat
  bsf  EECON1,RD   ;cteni EEPROM
  Bank2      
  movfw EEDATA       ;nactena data z pameti EEPROM do registru W
  Bank0      
  Return      ;  !!! data v registru W !!!  
  
;**************************************************************************
;                   Časové smyčky
;************************************************************************** 
;-------- cas = 3 s ----------
Cek3s
  movlw 77
  movwf TMP3
C3s  decfsz TMP3
  goto $+2
  Return
  Call Cek39ms
  goto C3s
;-------- cas = 200 ms ----------
Cek200ms
  movlw 5
  movwf TMP3
C200ms decfsz TMP3
  goto $+2
  Return
  Call Cek39ms
  goto C200ms  
;-------- cas = 39.2 ms ---------- 
Cek39ms 
  movlw 255    
  movwf TMP0
  movlw 255
  movwf TMP1
  goto Smycka
;-------- cas = 97,8 us ---------- 
Cek90us 
  movlw 146   
  movwf TMP0
  movlw 1
  movwf TMP1
  goto Smycka  
;-------- cas = 10 us včetně procedury TstPWM, real (8,2 us) ---------- 
Cek10us 
  movlw 10    
  movwf TMP0
  movlw 1
  movwf TMP1
  nop
  nop
  goto Smycka
;-------- cas = 15,0 ms -------
Cek15m 
  movlw 172    
  movwf TMP0
  movlw 145
  movwf TMP1
  goto Smycka
;---------- cas = 1,61 ms ------
Cek1m6 
  movlw 66    
  movwf TMP0
  movlw 40
  movwf TMP1
  goto Smycka
;----------- cas = 100,2 us -------
Cek100u
  movlw  164   
  movwf TMP0
  movlw 1
  movwf TMP1
  goto Smycka
;-----------cas = 40,2 us --------
Cek40u 
  movlw 64   
  movwf TMP0
  movlw 1
  movwf TMP1
  goto Smycka  
;-------------------------------
Smycka 
  movfw TMP0
  movwf TMP2
;       ------------------------
Smycka1
  decfsz TMP2,F    ;mala smycka
  goto Smycka1
  CLRWDT
;       ------------------------
  decfsz TMP1,F    ;velka smycka
  goto Smycka
;       ------------------------
  Return
org 07E0h
;*************************************************************************
;    Podepsání SW,Created by Petr Nosek 2011 ®
;*************************************************************************  
de 67,114,101,97,116,101,100,32,98,121,32,80,101,116,114,32,78,111,115,101,107,32,32,32,50,48,49,49,32,32,174,32 
;--------------------------------------------------------------------------
end