<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=24&amp;t=7083&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-05-16T13:54:55+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=24&amp;t=7083&amp;mode</id>
<entry>
<author><name><![CDATA[matrix]]></name></author>
<updated>2014-05-16T13:54:55+01:00</updated>
<published>2014-05-16T13:54:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81305#p81305</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81305#p81305"/>
<title type="html"><![CDATA[Re: Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81305#p81305"><![CDATA[
Dzięki za niesamowite źródło wiedzy. Tyle już czytałem a jeszcze nie trafiłem w necie na ten artykuł.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=689">matrix</a> — 16 maja 2014, o 13:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sonix]]></name></author>
<updated>2014-05-16T13:31:32+01:00</updated>
<published>2014-05-16T13:31:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81302#p81302</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81302#p81302"/>
<title type="html"><![CDATA[Re: Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81302#p81302"><![CDATA[
Żeby niepotrzebnie się nie rozpisywać, polecam poczytać pdf'a który opisuje kod stały i zmienny, w tym dosyć dobrze KEELOQ'a.<br />Jakiś czas temu na stronie Proximy było o ile pamiętam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=127">Sonix</a> — 16 maja 2014, o 13:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matrix]]></name></author>
<updated>2014-05-16T13:16:18+01:00</updated>
<published>2014-05-16T13:16:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81299#p81299</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81299#p81299"/>
<title type="html"><![CDATA[Re: Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81299#p81299"><![CDATA[
Z tego co zrozumiałem z helpa to keeloq tool służy do wygenerowania kodów do pilota jak i do odbiornika, żeby na podstawie kodu manufaktury stworzyć soft do odkodowywania klucza wysyłanego przez pilota podczas transmisji.<br />Tylko do czego na przykład jest seed ? Jest on też użyty w sofcie który przedstawiłem na początku,<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=689">matrix</a> — 16 maja 2014, o 13:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sonix]]></name></author>
<updated>2014-05-16T13:03:36+01:00</updated>
<published>2014-05-16T13:03:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81295#p81295</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81295#p81295"/>
<title type="html"><![CDATA[Re: Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81295#p81295"><![CDATA[
No tak... nie ma to jak pytać o coś co mam pod nosem  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> <br /><br />Mój Program Files\Microchip:<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/127/7d995cc078820a1bb61f84f6fb3b86ec.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/127/7d995cc078820a1bb61f84f6fb3b86ec.jpg" alt="Obrazek" /></a><br /><br />Do KeeloqTool nigdy nie zaglądałem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /> <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" />  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" />  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=127">Sonix</a> — 16 maja 2014, o 13:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matrix]]></name></author>
<updated>2014-05-16T12:03:08+01:00</updated>
<published>2014-05-16T12:03:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81285#p81285</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81285#p81285"/>
<title type="html"><![CDATA[Re: Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81285#p81285"><![CDATA[
Nie pamiętam skąd mam ten programik. Jak ściągnąłem coś ze strony Microchip'a to się ściągnął ten program i kilkanaście pdf'ów z notami aplikacyjnymi i zdaje się kodami źródłowymi.<br />Całość zapisała się w program files jako C:\Program Files\Microchip\KeeLoq Decryption Software<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=689">matrix</a> — 16 maja 2014, o 12:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sonix]]></name></author>
<updated>2014-05-16T11:40:48+01:00</updated>
<published>2014-05-16T11:40:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81282#p81282</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81282#p81282"/>
<title type="html"><![CDATA[Re: Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81282#p81282"><![CDATA[
Pierwszy raz widzę ten programik, podejrzewam że jakiś emulator HCS'a. <br />Podrzuć jakiegoś linka to zobaczę przy okazji <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=127">Sonix</a> — 16 maja 2014, o 11:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matrix]]></name></author>
<updated>2014-05-16T11:35:08+01:00</updated>
<published>2014-05-16T11:35:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81280#p81280</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81280#p81280"/>
<title type="html"><![CDATA[Re: Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81280#p81280"><![CDATA[
Tak myślałem tylko jakoś nie potrafię tego ogarnąć. Ale z czasem może coś się uda zdziałać.<br /><br />Pytanie dodatkowe, co to jest ?<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/689/026c1d7ad9d467ce05e5d83949f5256e.PNG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/689/026c1d7ad9d467ce05e5d83949f5256e.PNG" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=689">matrix</a> — 16 maja 2014, o 11:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sonix]]></name></author>
<updated>2014-05-16T11:32:55+01:00</updated>
<published>2014-05-16T11:32:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81279#p81279</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81279#p81279"/>
<title type="html"><![CDATA[Re: Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81279#p81279"><![CDATA[
<div class="quotetitle">matrix napisał(a):</div><div class="quotecontent"><br />....A gdybym chciał samodzielnie wykonać programator na podstawie schematu który pokazany jest wyżej, to czym skompilować i wgrać wsad który przedstawiłem na początku ?<br /></div><br /><br />Na przykład MPLAB IDE od Microchipa, ostatnia wersja np. tutaj:<br /><br /><!-- m --><a class="postlink" href="http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_IDE_8_92.zip" >http://ww1.microchip.com/downloads/en/D ... E_8_92.zip</a><!-- m --><br /><br />Teraz jest MPLABX IDE ale tego jakoś nie trawię....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=127">Sonix</a> — 16 maja 2014, o 11:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matrix]]></name></author>
<updated>2014-05-16T11:03:50+01:00</updated>
<published>2014-05-16T11:03:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81276#p81276</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81276#p81276"/>
<title type="html"><![CDATA[Re: Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81276#p81276"><![CDATA[
Sądzę że dowiedziałem się wszystkiego co było mi potrzebne. Dziękuję za wyczerpującą odpowiedź.<br /><br />A gdybym chciał samodzielnie wykonać programator na podstawie schematu który pokazany jest wyżej, to czym skompilować i wgrać wsad który przedstawiłem na początku ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=689">matrix</a> — 16 maja 2014, o 11:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sonix]]></name></author>
<updated>2014-05-16T10:50:46+01:00</updated>
<published>2014-05-16T10:50:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81273#p81273</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81273#p81273"/>
<title type="html"><![CDATA[Re: Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81273#p81273"><![CDATA[
<div class="quotetitle">matrix napisał(a):</div><div class="quotecontent"><br />Mam takie myślę ciekawe pytanie.<br />Ostatnio chciałem się dowiedzieć czegoś więcej na temat systemu zabezpieczeń keeloq firmy Microchip, tylko tak bardziej od strony programowania.<br />Naczytałem się że sam keeloq jako taki dostępny jest za darmo, żeby zaprogramować procesor HCS200 trzeba dysponować kodem manufaktury oraz kluczem producenta.<br /></div><br /><br />Kod manufaktry i klucz producenta to jest to samo.<br />Do zaprogramowania HCS (200,300, 301) potrzebujesz 'wbić' do niego numer seryjny, klucz producenta i jeszcze kilka parametrów (np. timingi transmisji, tryb pracy SIMPLE lub NORMAL itp), to właśnie parametry z sekcji MODIFYABLE PROGRAMMING DEFINE.<br /><br />Klucz producenta jest zawsze stały. Jeżeli analizowałeś cały kod programatora HCS'ów na PIC16F84a to pewnie zauważyłeś że serial jest zwiększany po każdym zaprogramowaniu i zapisywany w eeprom PIC'a programatora.<br /><br /><div class="quotetitle">matrix napisał(a):</div><div class="quotecontent"><br />Wiadomo że kluczy tych nikt (FAAC, Nice czy Beninca) nie udostępni, ale co jeśli chciałbym sam sobie zrobić własnego pilota opartego o keeloq i mój wymyślony kod manufaktury i mój wymyślony klucz producenta?<br />Jak przygotować plik gotowy do wgrania w układ HCS200 ?<br />Czym skompilować ?<br />Skąd wziąć czysty keeloq pod HCS'a ?<br /></div><br /><br />Nie przygotowujesz żadnego pliku. Kupujesz HCS200 i programujesz mu parametry opisane powyżej.<br />w HCS'ach jest zaszyty program, a Ty programujesz tylko jego parametry, które są przechowywane w eeprom.<br /><br />Najsensowniej jest kupić gotowy pilot na 433MHZ lub 868MHz (zależy jaki odbiornik zastosujesz) z układem HCS na pokładzie i zaprogramować go swoim danymi.<br />Ten kod asm który podałeś, jest to program do PIC16F84A który służy jako programator HCS'ów w takim układzie:<br /><br /><img src="http://forum.atnel.pl/_obrazki/o/127/d3bb8751cc7701d7b3aa64bce29df298.jpg" alt="Obrazek" /><br /><br /><div class="quotetitle">matrix napisał(a):</div><div class="quotecontent"><br />Firma bodajże Modernsoft (nie reklamuję jej tylko u nich znalazłem) ma w swojej ofercie programator HCS:<br /><br /><!-- m --><a class="postlink" href="http://www.modernsoft.pl/upload/Programator200.pdf" >http://www.modernsoft.pl/upload/Programator200.pdf</a><!-- m --><br /><br />Czy tym programatorem kompleksowo zaprogramuję pilota opartego o HCS200 ?<br /><br />Pisząc ten temat wpadła mi do głowy taka myśl że keeloq wpisany jest w dany programator (w PIC'a danego programatora) stąd nie mogę znaleźć czystego keeloq dedykowanego właśnie dla HCS200.<br /><br />Czy dobrze myślę że to co poniżej jest keeloq'iem właśnie wpisanym w PIC16f84A który to jest użyty jako programator ?<br />Podanie kodu manufaktury i klucza producenta następuje w sekcji MODIFYABLE PROGRAMMING DEFINE co zresztą napisane jest na początku tego programu.<br /></div><br /><br />Jest to programator bazowany na tym kodzie który podałeś, ale rozszerzony o procedury odbiorcze i wyświetlanie informacji na LCD.<br />Tak czy inaczej zaprogramujesz nim HCS'y.<br />Jeżeli nie potrzebujesz 'bajerów', zmontuj układ który podałem wyżej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Na resztę pytań powinieneś znaleźć odpowiedź wyżej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=127">Sonix</a> — 16 maja 2014, o 10:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matrix]]></name></author>
<updated>2014-05-16T09:51:27+01:00</updated>
<published>2014-05-16T09:51:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81269#p81269</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81269#p81269"/>
<title type="html"><![CDATA[Keeloq i HCS200 - jak zaprogramować ?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7083&amp;p=81269#p81269"><![CDATA[
Mam takie myślę ciekawe pytanie.<br />Ostatnio chciałem się dowiedzieć czegoś więcej na temat systemu zabezpieczeń keeloq firmy Microchip, tylko tak bardziej od strony programowania.<br />Naczytałem się że sam keeloq jako taki dostępny jest za darmo, żeby zaprogramować procesor HCS200 trzeba dysponować kodem manufaktury oraz kluczem producenta. Wiadomo że kluczy tych nikt (FAAC, Nice czy Beninca) nie udostępni, ale co jeśli chciałbym sam sobie zrobić własnego pilota opartego o keeloq i mój wymyślony kod manufaktury i mój wymyślony klucz producenta?<br />Jak przygotować plik gotowy do wgrania w układ HCS200 ?<br />Czym skompilować ?<br />Skąd wziąć czysty keeloq pod HCS'a ?<br /><br />Firma bodajże Modernsoft (nie reklamuję jej tylko u nich znalazłem) ma w swojej ofercie programator HCS:<br /><br /><!-- m --><a class="postlink" href="http://www.modernsoft.pl/upload/Programator200.pdf" >http://www.modernsoft.pl/upload/Programator200.pdf</a><!-- m --><br /><br />Czy tym programatorem kompleksowo zaprogramuję pilota opartego o HCS200 ?<br /><br />Pisząc ten temat wpadła mi do głowy taka myśl że keeloq wpisany jest w dany programator (w PIC'a danego programatora) stąd nie mogę znaleźć czystego keeloq dedykowanego właśnie dla HCS200.<br /><br />Czy dobrze myślę że to co poniżej jest keeloq'iem właśnie wpisanym w PIC16f84A który to jest użyty jako programator ?<br />Podanie kodu manufaktury i klucza producenta następuje w sekcji MODIFYABLE PROGRAMMING DEFINE co zresztą napisane jest na początku tego programu.<br /><br />[syntax=asm];===========================================================================<br />; MICROCHIP KEELOQ HCS200 - HCS300 - HCS301 STANDALONE PROGRAMMER<br />;===========================================================================<br /><br />; THIS STANDALONE PROGRAMMER APPLY THE NORMAL LEARN SCHEME TO GENERATE THE<br />; ENCRYPTION KEY STARTING FROM THE MANUFACTURER CODE AND THE SERIAL NUMBER.<br />; THE SERIAL NUMBER IS INCREMENTED EVERY TIME A HCS PROGRAMMING HAPPEN<br />; AND IS STORED IN THE INTERNAL DATA EEPROM OF THE PIC16F84A<br />;<br />; THE HCS MANUFACTURER CODE AND THE CONFIGURATION WORD CAN BE CHANGED<br />; IN THE SECTION BELOW NAMED &quot;MODIFYABLE PROGRAMMING DEFINE&quot;<br /><br />;===========================================================================<br />;VERSION1.0,09/03/99<br />;===========================================================================<br /><br />        PROCESSOR       PIC16F84A<br />        RADIX           DEC<br /><br />        INCLUDE         &quot;P16F84A.INC&quot;<br /><br />        __CONFIG        _XT_OSC &amp; _CP_OFF &amp; _WDT_ON &amp; _PWRTE_ON<br /><br />;========================================================================================<br />;<br />;                        PIC16F84A<br />;                    -------_--------        <br />;            HCSVDD | 1 RA2    RA1 18| CLK      (to HCS slave: S2)<br />;            | 2 RA3TC  RA0 17| DATA     (to HCS slave: PWM)<br />;                   | 3 RA4   OSC1 16| OSCin<br />;             reset | 4 MCLR  OSC2 15| OSCtest  <br />;               Vss | 5 Vss    Vdd 14| Vdd<br />;                   | 6 RB0    RB7 13| PROG<br />;                 | 7 RB1    RB6 12| LED <br />;                   | 8 RB2    RB5 11|<br />;                   | 9 RB3    RB4 10|<br />;     ----------------<br />;<br />;========================================================================================<br />; MACROS<br /><br />#DEFINE BANK0   bcf     STATUS,RP0<br />#DEFINE BANK1   bsf     STATUS,RP0<br /><br />;========================================================================================<br />; I/O PORT ASSIGNEMENT<br /><br />; PORTA BIT DEFINITIONS<br />#DEFINE DATA    PORTA,0                 ; (IN/OUT) Data (PWM) for Programming HCS<br />#DEFINE CLK     PORTA,1                 ; (OUT)Clock (S2) for Programming HCS<br />#DEFINE HCSVDD  PORTA,2                 ; (OUT) HCS Vdd line<br /><br />; PORTB BIT DEFINITIONS<br />#DEFINE LED     PORTB,6                 ; (OUT) Program/failure led indicator<br />#DEFINE PROG    PORTB,7                 ; (IN)Programming Key<br />#DEFINE SWRES   PORTB,7                 ; (IN)Sw reset Key on programming failure<br />#DEFINE COFNIJ  PORTB,5                 ; (IN)COFA NUMER SERYJNY O JEDEN<br /><br />;---------------<br />; PORT DIRECTION DEFINE REG<br />#DEFINE K_MASKPA        B'11111000'; PORTA: TRI-STATE VALUE<br />#DEFINE K_MASKPB        B'10111111'; PORTB: TRI-STATE VALUE<br />#DEFINE K_MASKPA_PROG   B'11111000'; PORTB: TRI-STATE FOR PROGRAMMING HCS <br />#DEFINE K_MASKPA_VERI   B'11111001'; PORTB: TRI-STATE FOR VERIFY HCS <br /><br />#DEFINE K_OPTION        B'00000111'     ; OPTION REGISTER SETTING<br />                                        ; PORTB PULL-UP ON, TMR0 associated to Tcy, Prescaler=1:256<br /><br />;========================================================================================<br /><br />; GENERAL PURPOSE RAM REGISTERS<br /><br />        CBLOCK0x0C<br /><br />; Word clocked into HCS<br />                WRD_HI,WRD_LO<br />; Words to be programmed into HCS (HCS MEMORY MAPPING)<br />                WORD0:2, WORD1:2, WORD2:2, WORD3:2<br />                WORD4:2, WORD5:2, WORD6:2, WORD7:2<br />                WORD8:2, WORD9:2, WORD10:2, WORD11:2<br />; Other Variable for programming HCS<br />                TXNUM                                   ; Number of bit clocked<br />                TMP_CNT                                 ; Temporary Counter<br />                MYCONT                                  ;       &quot;<br />                COUNT_HI, COUNT_LO                      ; Counter for Timing<br /><br />; Generated Encryption KEY<br />                KEY7, KEY6, KEY5, KEY4<br />                KEY3, KEY2, KEY1, KEY0<br />; Circular Buffer used in decryption routine<br />                CSR4, CSR5, CSR6, CSR7<br />                CSR0, CSR1, CSR2, CSR3<br />; Counter used in decryption routine<br />                CNT0, CNT1<br />; Mask register used in decryption routine<br />                MASK<br />; Temporary Register<br />                TMP0, TMP1, TMP2, TMP3                  ; Temp register<br /><br />        ENDC<br /><br />; End of define general purpose RAM register <br /><br />;========================================================================================<br />; **************  DECRYPTION REGISTER RE-MAPPINGS *******************<br />; NOTE : INDIRECT ADDRESSING USED, DO NOT CHANGE REGISTER ASSIGNMENT <br />; ******************************************************************<br />; 32 BIT HOPCODE BUFFER<br /><br />#DEFINE HOP1    CSR0<br />#DEFINE HOP2    CSR1<br />#DEFINE HOP3    CSR2<br />#DEFINE HOP4    CSR3<br /><br />; 28 BIT SERIAL NUMBER<br /><br />SER_3   EQU     CSR7                    ; LSB<br />SER_2   EQU     CSR6<br />SER_1   EQU     CSR5<br />SER_0   EQU     CSR4                    ; MSB<br /><br />;========================================================================================<br />; MODIFYABLE PROGRAMMING DEFINE<br />;========================================================================================<br /><br />#DEFINE KEY_METHOD 1            ; MUST BE 1 IF NORMAL KEY GENERATION METHOD TO BE USED<br />                                ; MUST BE 0 IF SIMPLE KEY GENERATION METHOD TO BE USED<br />                                ; (ENCRYPTION KEY= MANUFACTURER KEY)<br /><br />#DEFINE HCS30X  0               ; MUST BE 1 IF PROGRAMMING HCS300-301,<br />                                ; MUST BE 0 IF PROGRAMMING HCS200<br /><br />#DEFINE MCODE_0 0xCDEF          ; MANUFACTURER CODE, LSWORD<br />#DEFINE MCODE_1 0x89AB<br />#DEFINE MCODE_2 0x4567<br />#DEFINE MCODE_3 0x0123          ; MSWORD<br /><br />#DEFINE SYNC    0X0000          ; SYNCRONOUS COUNTER<br /><br />#DEFINE SEED_0  0x0000          ; 2 WORD SEED VALUE<br />#DEFINE SEED_1  0x0000  <br />#DEFINE ENV_KEY 0x0000          ; ENVELOPE KEY                  ( NOT USED FOR HCS200)<br /><br />#DEFINE AUTOFF  1               ; AUTO SHUT OFF TIMER           ( NOT USED FOR HCS200)<br /><br />#DEFINE DISC70  0x00            ; DISCRIMINATION BIT7-BIT0<br />#DEFINE DISC8   0               ; DISCRIMINATION BIT8<br />#DEFINE DISC9   0               ; DISCRIMINATION BIT9<br />#DEFINE OVR0    0               ; OVERFLOW BIT0                 (DISC10 for HCS200)<br />#DEFINE OVR1    0               ; OVERFLOW BIT1                 (DISC11 for HCS200)<br />#DEFINE VLOW    1               ; LOW VOLTAGE TRIP POINT SELECT BIT (1=High voltage)<br />#DEFINE BSL0    0               ; BAUD RATE SELECT BIT0<br />#DEFINE BSL1    0               ; BAUD RATE SELECT BIT1         (RESERVED for HCS200)<br />#DEFINE EENC    0               ; ENVELOPE ENCRYPTION SELECT    (RESERVED for HCS200)<br /><br />#DEFINE DISEQSN1               ; IF DISEQSN=1 SET DISCRIMINANT EQUAL TO SERNUM BIT10-0<br />                                ; IF DISEQSN=0 SET DISCRIMINANT AS DEFINED ABOVE<br /><br />;========================================================================================<br />; OTHER EQUATE<br />;========================================================================================<br /><br />#DEFINE NUM_WRD .12             ; NUMBER OF WORD TO PROGRAM INTO HCS<br />#DEFINE RES     0X0000          ; RESERVED WORD<br /><br />#DEFINE CONF_HI ((EENC&lt;&lt;7)|(BSL1&lt;&lt;6)|(BSL1&lt;&lt;5)|(VLOW&lt;&lt;4)|(OVR1&lt;&lt;3)|(OVR0&lt;&lt;2)|(DISC9&lt;&lt;1)|DISC8)<br /><br />; ****** HCS TIME PROGRAMMING EQUATE ********<br />#DEFINE Tps     .4              ; PROGRAM MODE SETUP TIME 4mS   (3,5mS min, 4,5 max)<br />#DEFINE Tph1    .4              ; HOLD TIME 1             4mS   (3,5mS min)<br />#DEFINE Tph2    .19             ; HOLD TIME 2             62uS  (50uS min)<br />#DEFINE Tpbw    .3              ; BULK WRITE TIME         3mS   (2,2mS min)<br />#DEFINE Tclkh   .10             ; CLOCK HIGH TIME         35uS  (25uS min)<br />#DEFINE Tclkl   .10             ; CLOCK LOW TIME          35uS  (25uS min)<br />#DEFINE Twc     .40             ; PROGRAM CYCLE TIME      40mS  (36mS min)<br /><br /><br />; NOTE: FOR mS TIME DELAY USE WAIT_WMSEC SUBROUTINE ( W * 1mSec )<br />;       FOR uS TIME DELAY USE WAIT_uS SUBROUTINE ( 5 + Txxx*3 uS )<br /><br /><br />;========================================================================================<br />;========================================================================================<br /><br />;========================================================================================<br />; FUNCTION     : RESET ()      <br />; DESCRIPTION  : PROGRAM RESET ROUTINE<br />;=======================================================================================================================================  0000000000<br /><br />        ORG     0x00<br />RESET_VECTOR<br />        goto    START<br /><br />;========================================================================================<br />; FUNCTION     : ISR_VECTOR ()      <br />; DESCRIPTION  : INTERRUPT SERVICE ROUTINE VECTOR<br />;========================================================================================<br /><br />        ORG     0x04<br />ISR_VECTOR<br />                retfie<br /><br />;========================================================================================<br /><br />;========================================================================================<br />;========================================================================================<br />; SUBROUTINES   SUBROUTINES     SUBROUTINES     SUBROUTINES     SUBROUTINES<br />;========================================================================================<br />;========================================================================================<br /><br />;========================================================================================<br />; FUNCTION     : INITREG      <br />; DESCRIPTION  : REGISTER INIZIALIZATION<br />;========================================================================================<br /><br />INITREG         clrfSTATUS<br />clrfINTCON                  ; INTERRUPT DISABLED<br />clrfPORTA                   ; RESET PORTA<br />clrfPORTB                   ; RESET PORTB<br />BANK1<br />movlwK_OPTION                ; INT CLK, PRESCALER TO TMR0, ON PULL-UP<br />movwfOPTION_REG<br />movlwK_MASKPA                ; SETUP PORTA<br />movwfTRISA<br />movlwK_MASKPB                ; SETUP PORTB<br />movwfTRISB<br />BANK0<br />clrfTMR0<br />return<br /><br />;========================================================================================<br />; FUNCTION     : INITREG      <br />; DESCRIPTION  : REGISTER INIZIALIZATION<br />;========================================================================================<br /><br />CLEAR_RAM       movlw0x0C<br />movwfFSR<br />CLEAR_RAM_LOOP  clrfINDF<br />incfFSR,F<br />movlw0x50<br />xorwfFSR,W<br />skpz<br />gotoCLEAR_RAM_LOOP<br />return<br /><br />;========================================================================================<br />; FUNCTION     : WAIT_uS ()      <br />; DESCRIPTION  : WAIT 5+W*3 MICROSECOND SUBROUTINE<br />;========================================================================================<br /><br />WAIT_uS         movwfCOUNT_LO<br />WAIT_uS_A       decfszCOUNT_LO, F<br />gotoWAIT_uS_A<br />return<br /><br />;========================================================================================<br />; FUNCTION     : DEBOUNCE - WAIT_16MSEC - WAIT_WMSEC ()      <br />; DESCRIPTION  : WAIT 16mSec or W mSec SUBROUTINE <br /><br /><br /><br /><br /><br />;======================================================================================================================================22222222<br /><br />DEBOUNCE<br />WAIT_16MSEC     movlw.16<br />WAIT_WMSEC      movwfCOUNT_HI<br />WAITSET         movlw.250<br />movwfCOUNT_LO<br />WAITLOOP        clrwdt<br />decfszCOUNT_LO,F<br />gotoWAITLOOP<br />decfszCOUNT_HI,F<br />gotoWAITSET<br />return<br /><br />;========================================================================================<br />; FUNCTION     : BUTTON RELEASE ()      <br />; DESCRIPTION  : WAIT FOR BUTTON RELEASE <br />;========================================================================================<br /><br />BUTTON_RELEASE  clrwdt<br />btfssPROG<br />gotoBUTTON_RELEASE<br />callDEBOUNCE<br />return<br /><br />;========================================================================================<br />; FUNCTION     : READ_SN ()      <br />; DESCRIPTION  : READ LAST SERIAL NUMBER STORED IN THE PIC16F84A EEPROM DATA,<br />;  AND INCREMENT IT INTO NEW SER_x<br /><br /><br /><br /><br /><br /><br />;========================================================================================<br /><br />read_eprom:<br /><br />READ_SN         movlwSER_3<br />movwfFSR<br />clrfMYCONT; COUNTER OF BYTE <br />; READ FROM DATA EEPROM<br />READ_SN_A       clrwdt<br />movfMYCONT,W<br />movwfEEADR<br />BANK1<br />bsfEECON1, RD; do a read<br />clrwdt<br />btfscEECON1, RD; Read done ?<br />goto$-2<br />BANK0<br />movfEEDATA,W<br />movwfINDF<br />incfMYCONT, F<br />movlw.4<br />xorwfMYCONT, W; TEST IF 4 BYTE READ<br />bzREAD_SN_INC<br />decfFSR, F<br />gotoREAD_SN_A<br /><br />READ_SN_INC     incfszSER_3, F; LOW BYTE: INCREMENT SN<br />gotoREAD_SN_X<br />incfszSER_2, F<br />gotoREAD_SN_X<br />incfszSER_1, F<br />gotoREAD_SN_X<br />incfSER_0, F<br /><br />READ_SN_X       return<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />save_eprom:<br /><br />;========================================================================================<br />; FUNCTION     : WRITE_SN ()      <br />; DESCRIPTION  : SAVE INTO PIC16F84A  EEPROM DATA THE LAST PROGRAMMED SERIAL<br />;               : NUMBER<br />;========================================================================================<br /><br />WRITE_SN        clrwdt<br />movlwSER_3<br />movwfFSR<br />clrfMYCONT; COUNTER OF BYTE <br />; WRITTEN TO DATA EEPROM<br />WRITE_SN_BYTE   clrwdt<br />movfMYCONT, W<br />movwfEEADR<br />movfINDF, W<br />movwfEEDATA<br />BANK1<br />bcfEECON1, EEIF<br />bsfEECON1, WREN; enable Write<br />movlw0x55<br />movwfEECON2<br />movlw0xAA<br />movwfEECON2<br />bsfEECON1, WR<br />WRITE_SN_A      clrwdt<br />btfscEECON1, WR; Write complete ?<br />gotoWRITE_SN_A<br />bcfEECON1, WREN; disable Write<br />VERIFY_WRITE<br />BANK0<br />movfEEDATA, W<br />BANK1<br />bsfEECON1, RD; do a read<br />clrwdt<br />btfscEECON1, RD; Read done ?<br />goto$-2<br />BANK0<br />xorwfEEDATA, W<br />BNZEE_ERR; EEPROM WRITE ERROR<br /><br />incfMYCONT, F<br />movlw.4<br />xorwfMYCONT, W; TEST IF WRITTEN ALL THE 4 BYTES<br />BZWRITE_SN_X<br />decfFSR, F<br />gotoWRITE_SN_BYTE<br />WRITE_SN_X      return<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />;========================================================================================<br />; FUNCTION     : MEM_MAP ()      <br />; DESCRIPTION  : PREPARE THE WORDS TO BE PROGRAMMED INTO HCS<br />;========================================================================================<br /><br />MAP_SET         movlwWORD0<br />movwfFSR<br />WORD_0                                          ; ENCRYPTION KEY (4 WORD)<br />WORD_0_LO       movfKEY0,W<br />movwfINDF<br />incfFSR, F<br />WORD_0_HI       movfKEY1,W<br />movwfINDF<br />incfFSR, F<br />WORD_1<br />WORD_1_LO       movfKEY2,W<br />movwfINDF<br />incfFSR, F<br />WORD_1_HI       movfKEY3,W<br />movwfINDF<br />incfFSR, F<br />WORD_2<br />WORD_2_LO       movfKEY4,W<br />movwfINDF<br />incfFSR, F<br />WORD_2_HI       movfKEY5,W<br />movwfINDF<br />incfFSR, F<br />WORD_3<br />WORD_3_LO       movfKEY6,W<br />movwfINDF<br />incfFSR, F<br />WORD_3_HI       movfKEY7,W<br />movwfINDF<br />incfFSR, F<br />WORD_4                                          ; SYNC COUNTER (1 WORD)<br />WORD_4_LO       movlwLOW(SYNC)<br />movwfINDF<br />incfFSR, F<br />WORD_4_HI       movlwHIGH(SYNC)<br />movwfINDF<br />incfFSR, F<br />WORD_5                                          ; RESERVED (1 WORD)<br />WORD_5_LO       movlwLOW(RES)<br />movwfINDF<br />incfFSR, F<br />WORD_5_HI       movlwHIGH(RES)<br />movwfINDF<br />incfFSR, F<br />WORD_6                                          ; SERIAL NUMBER (2 WORD)<br />WORD_6_LO       movfSER_3, W                ; LSByte<br />movwfINDF<br />incfFSR, F<br />WORD_6_HI       movfSER_2, W<br />movwfINDF<br />incfFSR, F<br />WORD_7<br />WORD_7_LO       movfSER_1, W<br />movwfINDF<br />incfFSR, F<br />WORD_7_HI       movfSER_0, W                ; MSByte<br />andlwB'00001111'<br />iorlw(AUTOFF&lt;&lt;7)             ; SET THE AUTO SHUT-OFF TIMER<br />movwfINDF<br />incfFSR, F<br />WORD_8                                          ; SEED VALUE ( 2 WORD)<br />WORD_8_LO       movlwLOW(SEED_0)<br />movwfINDF<br />incfFSR, F<br />WORD_8_HI       movlwHIGH(SEED_0)<br />movwfINDF<br />incfFSR, F<br />WORD_9<br />WORD_9_LO       movlwLOW(SEED_1)<br />movwfINDF<br />incfFSR, F<br />WORD_9_HI       movlwHIGH(SEED_1)<br />movwfINDF<br />incfFSR, F<br />WORD_10                                         ; ENVELOPE KEY (1 WORD)<br />                                                ; (RESERVED FOR HCS200 SET TO 0x0000)<br />WORD_10_LO      movlw(LOW(ENV_KEY) * HCS30X)<br />movwfINDF<br />incfFSR, F<br />WORD_10_HI      movlw(HIGH(ENV_KEY) * HCS30X)<br />movwfINDF<br />incfFSR, F<br />WORD_11<br />WORD_11_LO      movfSER_3, W                ; CONFIGURATION WORD<br />movwfINDF                    ; LOWER BYTE=LOWEST BYTE OF SERIAL NUMBER<br />incfFSR, F<br />WORD_11_HI      movfSER_2, W<br />ANDLWB'00000011'             ; MASK BIT OF SER. NUM.<br />IORLWCONF_HI                 ; MASK OTHER BIT OF CONFIG WORD<br />movwfINDF<br />incfFSR, F<br />return<br /><br /><br /><br /><br /><br /><br /><br /><br />;========================================================================================<br />; FUNCTION     : PREPARE_WRD ()      <br />; DESCRIPTION  : PUT IN WRD_LO &amp; WRD_HI THE WORD TO BE CLOCKED OUT (PWM)<br />;========================================================================================<br /><br />PREPARE_WRD     movfINDF, W<br />movwfWRD_LO<br />incfFSR, F<br />movfINDF, W<br />movwfWRD_HI<br />incfFSR, F<br />return<br /><br /><br /><br /><br /><br /><br /><br />;========================================================================================<br />; FUNCTION     : DECRYPT ()      <br />; DESCRIPTION  : DECRYPTS 32 BIT &#91;HOP1:HOP4&#93; USING &#91;CSR0:CSR7&#93;<br />;========================================================================================<br /><br />DECRYPT<br />        movlw   .11 +.1; OUTER LOOP 11+1 TIMES <br />movwfCNT1; OUTER LOOP 11+1 TIMES <br />DECRYPT_OUTER<br />        movlw   .48; INNER LOOP 48 TIMES<br />        movwf   CNT0; INNER LOOP 48 TIMES<br />DECRYPT_INNER<br />clrwdt; RESET WATCHDOG TIMER<br />        movfw   CNT1; LAST 48 LOOPS RESTORE THE KEY<br />        xorlw   .1; LAST 48 LOOPS RESTORE THE KEY<br />        skpnz; LAST 48 LOOPS RESTORE THE KEY<br />        goto    ROTATE_KEY; LAST 48 LOOPS RESTORE THE KEY<br /><br />        ; THE LOOKUP TABLE IS COMPRESSED INTO IN 4 BYTES TO SAVE SPACE<br />        ; USE THE 3 LOW INDEX BITS TO MAKE UP AN 8-BIT BIT MASK<br />        ; USE THE 2 HIGH INDEX BITS TO LOOK UP THE VALUE IN THE TABLE<br />        ; USE THE BIT MASK TO ISOLATE THE CORRECT BIT IN THE BYTE<br />        ; PART OF THE REASON FOR THIS SCHEME IS BECAUSE NORMAL TABLE <br />        ; LOOKUP REQUIRES AN ADDITIONAL STACK LEVEL<br /><br />        clrc; CLEAR CARRY (FOR THE LEFT SHIFT)<br />        movlw   .1; INITIALISE MASK = 1<br />        btfsc   HOP3,3; SHIFT MASK 4X IF BIT 2 SET<br />        movlw   b'10000'; SHIFT MASK 4X IF BIT 2 SET<br />        movwf   MASK; INITIALISE MASK = 1<br /><br />        btfss   HOP2,0; SHIFT MASK ANOTHER 2X IF BIT 1 SET<br />        goto    $+3<br />        rlf     MASK,F<br />        rlf     MASK,F            <br /><br />        btfsc   HOP1,0; SHIFT MASK ANOTHER 1X IF BIT 0 SET<br />        rlf     MASK,F<br /><br />        ; MASK HAS NOW BEEN SHIFTED 0-7 TIMES ACCORDING TO BITS 2:1:0<br /><br />        movlw   0; TABLE INDEX = 0<br />        btfsc   HOP4,1<br />        iorlw   .2; IF BIT 3 SET ADD 2 TO THE TABLE INDEX<br />        btfsc   HOP4,6<br />        iorlw   .4; IF BIT 4 SET ADD 4 TO THE TABLE INDEX<br /><br />        addwf   PCL,F; ADD THE INDEX TO THE PROGRAM COUNTER<br />;  &#91; MUST BE IN LOWER HALF OF PAGE &#93;<br />TABLE<br />        movlw   0x2E; BITS 4:3 WERE 00<br />        goto    TABLE_END; END OF LOOKUP<br /><br />        movlw   0x74; BITS 4:3 WERE 01<br />        goto    TABLE_END; END OF LOOKUP<br /><br />        movlw   0x5C; BITS 4:3 WERE 10<br />        goto    TABLE_END; END OF LOOKUP<br /><br />        movlw   0x3A; BITS 4:3 WERE 11<br />                                 <br />TABLE_END<br />        andwf   MASK,F; ISOLATE THE CORRECT BIT<br />        movlw   .0; COPY THE BIT TO BIT 7<br />        skpz; COPY THE BIT TO BIT 7<br />        movlw   b'10000000'; COPY THE BIT TO BIT 7<br /><br />        xorwf   HOP2,W; ONLY INTERESTED IN BIT HOP2,7<br />        xorwf   HOP4,W; ONLY INTERESTED IN BIT HOP4,7<br />        xorwf   KEY1,W; ONLY INTERESTED IN BIT KEYREG1,7<br /><br />        movwf   MASK; STORE W TEMPORARILY (WE NEED BIT 7)<br />        rlf     MASK,F; LEFT ROTATE MASK TO GET BIT 7 INTO CARRY<br /><br />        rlf     HOP1,F; SHIFT IN THE NEW BIT<br />        rlf     HOP2,F<br />        rlf     HOP3,F<br />        rlf     HOP4,F<br /><br />ROTATE_KEY<br />        clrc; CLEAR CARRY<br />        btfsc   KEY7,7; SET CARRY IF LEFTMOST BIT SET<br />        setc; SET CARRY IF LEFTMOST BIT SET<br /><br />        rlf     KEY0,F; LEFT-ROTATE THE 64-BIT KEY <br />        rlf     KEY1,F<br />        rlf     KEY2,F<br />        rlf     KEY3,F<br />        rlf     KEY4,F<br />        rlf     KEY5,F<br />        rlf     KEY6,F<br />        rlf     KEY7,F         <br /><br />        decfsz  CNT0,F; INNER LOOP 48 TIMES<br />        goto    DECRYPT_INNER; INNER LOOP 48 TIMES<br /><br />        decfsz  CNT1,F; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)<br />        goto    DECRYPT_OUTER; OUTER LOOP 12 TIMES (11+1 TO RESTORE KEY)<br /><br />        retlw.0; RETURN <br /><br /><br /><br /><br /><br /><br /><br />;========================================================================================<br />; FUNCTION     : CALC_KEY ()      <br />; DESCRIPTION  : GENERATE 32 BITS ENCRYPTION KEY USING THE MANUFACTURER CODE STORED IN ROM<br />;========================================================================================<br /><br />CALC_KEYiorwfSER_0,W; PATCH 28 BIT SERIAL NUMBER<br />movwfCSR3; ... AND COPY TO DECRYPT BUFFER<br />movfSER_1,W<br />movwfCSR2<br />movfSER_2,W<br />movwfCSR1<br />movfSER_3,W<br />movwfCSR0<br />CALC_KEY2callDECRYPT ; DECRYPT 32 BIT USING MASTER KEY<br />return<br /><br />;========================================================================================<br />; FUNCTION     : NORMAL_KEY_GEN ()      <br />; DESCRIPTION  : GENERATE THE 64 BITS ENCRYPTION KEY USING THE MANUFACTURER CODE STORED IN ROM<br />;========================================================================================<br /><br />NORMAL_KEY_GEN; COPY THE MANUFACTURER CODE INTO<br />movlwHIGH(MCODE_3); ENCRYPTION KEY (BYTE)<br />movwfKEY7<br />movlwLOW(MCODE_3)<br />movwfKEY6<br />movlwHIGH(MCODE_2)<br />movwfKEY5<br />movlwLOW(MCODE_2)<br />movwfKEY4<br />movlwHIGH(MCODE_1)<br />movwfKEY3<br />movlwLOW(MCODE_1)<br />movwfKEY2<br />movlwHIGH(MCODE_0)<br />movwfKEY1<br />movlwLOW(MCODE_0)<br />movwfKEY0<br />;---------------<br />NORMAL_KEY_GEN_PATCH1; DERIVE LOWER 32 BITS OF DECRYPTION KEY FROM SN<br />movlw0x20; PATCH REQUIRED FOR HCS NORMAL ENCODER<br />callCALC_KEY<br />movfCSR3,W; TEMPORARY STORE LOWER 32 BITS<br />movwfTMP3<br />movfwCSR2<br />movwfTMP2<br />movfwCSR1<br />movwfTMP1<br />movfwCSR0<br />movwfTMP0<br />;---------------<br />NORMAL_KEY_GEN_PATCH2; PATCH REQUIRED FOR HCS NORMAL ENCODER<br />movlw0x60<br />callCALC_KEY<br />movfwCSR3; STORE UPPER 32 BITS OF DERIVED KEY <br />movwfKEY7; .... IN 64 BIT KEY BUFFER<br />movfwCSR2<br />movwfKEY6<br />movfwCSR1<br />movwfKEY5<br />movfwCSR0 <br />movwfKEY4<br />;---------------<br />NORMAL_KEY_GEN_REC<br />movfwTMP3; RECOVER LOWER 32 BITS OF DERIVED KEY<br />movwfKEY3; ... AND STORE IN 64 BIT KEY BUFFER<br />movfwTMP2<br />movwfKEY2<br />movfwTMP1<br />movwfKEY1<br />movfwTMP0<br />movwfKEY0<br />return<br /><br />;========================================================================================<br /><br /><br /><br /><br /><br />;=========================================================================================================================================   11<br /><br />START           callINITREG<br />callCLEAR_RAM<br /><br />bsfLED; LED ON PWUP<br />movlw.250; WAIT 250Msec with LED ON<br />callWAIT_WMSEC<br />bcfLED; LED OFF<br />gotoM_LOOP<br /><br /><br /><br /><br /><br /><br />;========================================================================================<br />; FUNCTION     : M_LOOP ()      <br />; DESCRIPTION  : MAIN PROGRAM ROUTINE<br />;=========================================================================================================================================   22<br /><br />M_LOOP          clrwdt; WAIT FOR PROGRAMMING BUTTON PRESS<br />btfscPROG<br />gotoM_LOOP<br />                call    read_eprom  ;dopisałem bo nie działał                          <br />                call    save_eprom  ;dopisałem bo nie działał                          <br />       callDEBOUNCE <br /><br /><br /><br /><br /><br /><br /><br /><br />;-------------------------------------------------------------------------------------------------------------------------------------------  33<br />; PROGRAMMING ROUTINES<br />;----------------------------------------------------------------------------------------<br />M_KEY_GEN       callREAD_SN; odczytaj numer z eeproma ( numer serial)<br />clrwdt<br />callNORMAL_KEY_GEN          ; wylicz normal key gen<br />callMAP_SET; PREPARE EEPROM MEMORY MAP<br /><br /><br /><br /><br />;---------------; ENTER IN PROGRAMMING MODE AND BULK ERASE<br />M_PROGRAMMING<br />M_PROG_INIT     bcfDATA; DATA=0<br />bcfCLK; CLK=0<br />bsfHCSVDD; HCS POWER ON<br />BANK1<br />movlwK_MASKPA_PROG<br />movwfTRISA<br />BANK0<br />callWAIT_16MSEC<br /><br />M_PROG_SETUP    bsfCLK; DATA=0, CLK=1<br />movlwTps; WAIT Program mode Setup Time (Tps)<br />callWAIT_WMSEC<br /><br />bsfDATA; DATA=1, CLK=1<br />movlwTph1; WAIT Program Hold Time 1 (Tph1)<br />callWAIT_WMSEC<br /><br />bcfDATA; DATA=0, CLK=1<br />movlwTph2; WAIT Program Hold Time 2 (Tph2)<br />callWAIT_uS<br /><br />M_PROG_BULK_ER  bcfCLK; DATA=0, CLK=0<br />movlwTpbw; WAIT Program Bulk Write Time (Tpbw)<br />callWAIT_WMSEC<br /><br />;---------------; CLOCK INTO HCS THE WORDS TO BE PROGRAMMED <br />clrfTMP_CNT; NUMBER OF WORD TRASMITTED<br />movlwWORD0; SET INDIRECT PONTER TO INIT EE MAP<br />movwfFSR<br /><br />M_NEW_WORD      callPREPARE_WRD<br /><br />;---------------; OUTPUT WORD ROTATE<br />clrfTXNUM; NUMBER OF BIT TRASMITTED FOR EACH WORD<br /><br />M_TX_BIT        bsfCLK; CLK=1<br />clrc<br />rrfWRD_HI, F; ROTATE BIT TO OUTPUT<br />rrfWRD_LO, F;  into CARRY FLAG<br />skpnc<br />gotoM_PROG_DHI<br />nop<br />M_PROG_DLO      bcfDATA; DATA=0<br />gotoM_PROG_BIT<br />M_PROG_DHI      bsfDATA; DATA=1<br /><br />M_PROG_BIT      movlwTclkh<br />callWAIT_uS; DELAY<br />bcfCLK; CLK=0<br />movlwTclkl<br />callWAIT_uS; DELAY<br />;---------------<br />M_PROG_CHK_WORD incfTXNUM, F; INCREMENT NUMBER OF BIT TRASMITTED<br />movlw.16; CHECK IF END OF WORD TRASMITTED (16 BITS)<br />xorwfTXNUM, W<br />skpz<br />gotoM_TX_BIT; TRASMIT NEXT BIT<br /><br />;---------------; END OUTPUT WORD<br />M_END_WORD      bcfDATA; DATA=0<br />movlwTwc; WAIT FOR WORD Write Cycle Time (Twc)<br />callWAIT_WMSEC<br /><br />;---------------<br />M_CECHK_PRG_END incfTMP_CNT, F; INCREMENT NUMBER OF WORD PROGRAMMED<br />movlwNUM_WRD; CHECK NUMBER OF WORD TRASMITTED<br />xorwfTMP_CNT, W<br />skpz<br />gotoM_NEW_WORD; PROGRAM NEW WORD<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />;----------------------------------------------------------------------------------------<br />; VERIFY ROUTINE<br />;----------------------------------------------------------------------------------------<br /><br />weryfikacja:<br />M_VERIFY<br />BANK1<br />movlwK_MASKPA_VERI           ; I/O TRISTATE FOR VERIFY<br />movwfTRISA<br />BANK0<br />clrwdt<br />movlwWORD0; SET INDIRECT POINTER TO INIT EE MAP<br />movwfFSR<br /><br />clrfTMP_CNT; NUMBER OF WORDS RECIVED<br />clrfTXNUM; NUMBER OF BIT RECEIVED FOR EACH WORD<br />;---------------<br />M_VER_BITIN     clrc; RECIVE DATA BIT FROM HCS FOR VERIFY<br />btfscDATA; TEST and ROTATE RECEIVED BIT INTO WORD BUFFER<br />setc<br />rrfWRD_HI, F<br />rrfWRD_LO, F<br />incfTXNUM, F<br />movlw.16<br />xorwfTXNUM, W; TEST IF RECEIVED A COMPLETE WORD<br />skpz<br />gotoM_VER_CLKHI<br />;---------------<br />M_VERIFY_WORD   movfWRD_LO, W; 16th BIT RECIVED (WORD) -&gt; VERIFY WORD<br />xorwfINDF, W<br />skpz<br />gotoPROG_ERR; WORD LOW VERIFY ERROR<br />incfFSR, F<br />movfWRD_HI, W<br />xorwfINDF, W<br />skpz<br />gotoPROG_ERR; WORD HIGH VERIFY ERROR<br /><br /><br /><br /><br />incfFSR, F<br />incfTMP_CNT, F<br />movlwNUM_WRD<br />xorwfTMP_CNT, W; TEST IF RECEIVED ALL THE WORDS PROGRAMMED<br />skpnz<br />gotoPROG_SUCCESS; ALL 12 WORDS VERIFIED WITH SUCCESS<br /><br /><br /><br /><br /><br />clrfTXNUM<br />;---------------<br />M_VER_CLKHI     bsfCLK; CLK=1<br />movlwTclkh; WAIT TIME CLOCK HIGH<br />callWAIT_uS<br /><br />M_VER_CLKLO     bcfCLK; CLK=0<br />movlwTclkl; WAIT TIME CLOCK LOW<br />callWAIT_uS<br />gotoM_VER_BITIN<br /><br /><br /><br /><br /><br /><br /><br /><br />;-----------------------------------------------------------------------------------------------------------------------------------------<br />PROG_SUCCESS   ; callWRITE_SN; WRITE LAST SN PROGRAMMED INTO<br />; PIC16F84A EEPROM DATA<br />bsfLED; LED ON FOR 0,4SEC<br />movlw.200<br /><br />callWAIT_WMSEC; DELAY<br /><br />  ;              call    save_eprom                            ;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; dopisano<br /><br /><br />gotoPROG_END<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />;----------------------------------------------------------------------------------------<br />; HCS PROGRAMMING ERROR<br />; WAIT FOR BUTTON PRESS<br /><br />PROG_ERR        clrfPORTA<br />movlw.20; 20 * 0,2SEC = 4SEC LED BLINKING<br />movwfTMP_CNT<br />PROG_ERR_LEDON  bsfLED; LED ON FOR 0,1SEC<br />movlw.100<br />callWAIT_WMSEC; DELAY<br /><br />PROG_ERR_LEDOFF bcfLED; LED OFF FOR 0,1SEC<br />movlw.100<br />callWAIT_WMSEC; DELAY<br />decfszTMP_CNT,F<br />gotoPROG_ERR_LEDON<br /><br />PROG_ERR_X      bcfLED<br />gotoPROG_END<br /><br /><br /><br /><br /><br /><br /><br /><br />;----------------------------------------------------------------------------------------<br />PROG_END        bcfLED<br />bcfHCSVDD<br />callBUTTON_RELEASE<br />gotoM_LOOP<br /><br /><br /><br /><br /><br /><br />;----------------------------------------------------------------------------------------<br />; PIC16F84A DATA EEPROM WRITE ERROR; LED ON FOREVER<br /><br />EE_ERR          clrfPORTA<br />bsfLED; LED ON<br />clrwdt<br />goto$-1<br /><br />;----------------------------------------------------------------------------------------<br />; INIZIALIZE THE SER NUM STORED IN THE FIRST 4 BYTES OF THE INTERNAL EE DATA MEMORY<br />;----------------------------------------------------------------------------------------<br />        ORG     0x2100<br />                DE0x00<br />                DE0x00<br />                DE0x00<br />                DE0x00<br /><br />;----------------------------------------------------------------------------------------<br /><br />;========================================================================================<br />; END OF FILE<br />;========================================================================================<br /><br /><br />        END[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=689">matrix</a> — 16 maja 2014, o 09:51</p><hr />
]]></content>
</entry>
</feed>