; Mazani programove FLASH LIST P=PIC16F88 #include p16F88.inc ; nacucne uvedeny file ; podivejte se, co je v nem #define bitik STATUS,0 #define str1 bsf STATUS,6 #define bit0 STATUS, RP0 #define bit1 STATUS, 6 pocitatko equ 20 cotampisu equ 21 ; ********** NASTAVENI F U S E S ; a tohle nadefinuje fuses pro programovatko ; vsecnny potrebne konstanty jsou v include file, oddil ; Configuration Bits ; procesor ma dva konfiguracni registry, proto je to tam dvakrat ;Program Configuration Register 1 __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF ; tady je dulezite _WRT_PROTECT_OFF ; nebo nejaka castecna varianta, odblokovat cast pameti ; jinak ta pamet flash nepujde smazat ;Program Configuration Register 2 __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF org 0 ; org nasledujici instrukce je na adrese ..... nop nop ; tohle NOIP je tady kvuli in-circuit-debuggeru ; PICKIT2 - viz file pickit2_pouziti.doc - ; nebo datasheet 16F88 -kap. 15.14 goto start org 4 bcf PIR1, TMR2IF ; tady s periodou 65 ms retfie start: bsf bit0 bcf bit1 banksel TRISB ; nasledujici kod je zbytek minuleho programu ; je vicemene nezajimavy, preskakejte to F7 ; az do mista, kde zacinaji NOPy movlw 00 ; 0110 0000 - port B skoro cely vystupni krome bitu 5 a 6 - movwf TRISB ; tam je PICKIT movlw 0f0 ; horni polovina portu A je vstyupni, dolni vystupni movwf TRISA movlw 66 ; x110 x100 ; 4Mhz , z vnitrniho oscilatoru , frkvrnce 8MHz / 2 movwf OSCCON ; stranka 1 movlw 07 movwf CMCON ; vypinam komparatory clrf ANSEL ; nastavuji port A jako digitalni, vypinam prevodnik ; jeste vypinam registr ADCON0, ale ten je na strance 0 movlw .255 movwf PR2 ; registr periody pro citac PR2 bsf PIE1,TMR2IE ; poustim preruseni pro TMR2 bcf bit0 ; stranka 0 bcf ADCON0,ADON ; a cely modul A/D prevodniku vypinam ; T2CON je x111 111x napriklad ff postscaller deli 16 prescaller deli 16 citac zapnut movlw 0ff movwf T2CON clrf PIR1 ; pri jistotu nuluji vsechny pozadavky na preruseni clrf INTCON clrf PORTA ; muluji porty clrf PORTB movlw .15 movwf pocitatko BSF STATUS,RP0 BSF STATUS,RP1 ; stranka 3 BSF EECON1, EEPGD ; pamet PROGRAMU FLASH !!! BSF EECON1,WREN ; MUSIM povolit zapis stejne jako u datove EEPROM BSF EECON1, FREE ; a budu mazat BCF STATUS,RP0 ; stranka 2 movlw 00 MOVWF EEADR ; zápis dolni pulky adresy , ta je v registru W ; bity 4-0 jsou ignorovany ; (musi se to zarovnat na blok 32 slov) movlw 02 MOVWF EEADRH ; zapis horni pulky adresy ; tady je jiny zpusom zadani adresy - primo cislem. ; budeme pouzivat pamet od adresy 0x200 bcf INTCON, GIE ; zakazuji preruseni BSF STATUS,RP0 ; stranka 3 ; startovaci sekvence pro zapis MOVLW 55h ; tady to samozrejme jenom maze 32 slov z FLASH MOVWF EECON2 MOVLW 0AAh MOVWF EECON2 BSF EECON1, WR nop ; tady jsou zase 2 NOPy, stejne jako u read, proste se preskoci nop ; A TADY PROCESOR CHCIPNE, DOKUD SE PAMET NEVYMAZE !!!! ; alespon to tvrdi manual. ; simulator ale bezi dal hned nop stalemazu: nop nop btfsc EECON1, WR goto stalemazu ; tady jsem smazali blok 32 slov od aderesy 200 ; pred zapisem se MUSI ta pamet smazat !!!!! ; tady startuje vlastni zapis ; registry EEADR a EEADRH jsou jiz nastaveny z predchoziho erase ; a posledni dva bity EEADR MUSI byt 00 ; WREN je stale povolen ; EEPGD nastaven na zapis do FLASH BSF STATUS,RP0 BSF STATUS,RP1 ; stranka 3 BCF EECON1, FREE ; a NEBUDU mazat BCF STATUS, RP0 ; stranka 2 MOVLW 'A' ; zacina zapis do prvniho ze 4 bufferu MOVWF EEDATA CLRF EEDATH ; samozrejme, muzeme dat i neco jineho ; nez 0 - tohkle je hornich 6 bitu BSF STATUS,RP0 ; stranka 3 ; startovaci sekvence pro zapis MOVLW 55h ; tady to zapisuje do bufferu MOVWF EECON2 MOVLW 0AAh MOVWF EECON2 BSF EECON1, WR ; tady se nemusi na nic cekat. Tenhle zapis jenom presunul ; pismenko A nekam do pozdemniho bufferu NOP ; dve instrukce procesor ignoruje NOP ; stejne jako ve vsech akcich s FLASH BCF STATUS, RP0 ; stranka 2 INCF EEADR ; pro zapis do 2. bufferu MUSIME zvysit ; adresu tak, aby koncila 01 MOVLW 'H' ; zacina zapis do druheho ze 4 bufferu MOVWF EEDATA CLRF EEDATH ; samozrejme, muzeme dat i neco jineho BSF STATUS,RP0 ; stranka 3 MOVLW 55h ; tady to zapisuje do druheho bufferu MOVWF EECON2 MOVLW 0AAh MOVWF EECON2 BSF EECON1, WR ; tady se nemusi na nic cekat. Tenhle zapis jenom presunul ; pismenko H nekam do pozdemniho bufferu NOP ; ale stejne v programu MUSI byt dve instrukce, NOP ; ktere procesor ignoruje BCF STATUS, RP0 ; stranka 2 INCF EEADR ; pro zapis do 3. bufferu MUSIME zvysit ; adresu tak, aby koncila 10 MOVLW 'O' ; zacina zapis do prvniho ze 4 bufferu MOVWF EEDATA CLRF EEDATH ; samozrejme, muzeme dat i neco jineho BSF STATUS,RP0 ; stranka 3 ; startovaci sekvence pro zapis MOVLW 55h ; zapis do 3. bufferu MOVWF EECON2 MOVLW 0AAh MOVWF EECON2 BSF EECON1, WR ; tady se nemusi na nic cekat. Tenhle zapis jenom presunul ; pismenko 0 nekam do pozdemniho bufferu NOP NOP BCF STATUS, RP0 ; stranka 2 INCF EEADR ; pro zapis do 4. bufferu MUSIME zvysit ; adresu tak, aby koncila 11 MOVLW 'J' ; zacina zapis do prvniho ze 4 bufferu MOVWF EEDATA CLRF EEDATH ; samozrejme, muzeme dat i neco jineho ; nez 0 - tohkle je hornich 6 bitu BSF STATUS,RP0 ; stranka 3 ; startovaci sekvence pro zapis MOVLW 55h ; tady to MOVWF EECON2 MOVLW 0AAh MOVWF EECON2 BSF EECON1, WR ; tady se nemusi na nic cekat. Tenhle zapis jenom presunul ; pismenko A nekam do pozdemniho bufferu NOP ; tyto dve instrukce procesor ignoruje NOP ; ale MUSI tu byt, stejne jako u ostatnich akci s FLASH ; tady procesor chcipne a pocka, az se 4 slova yapisi do FLASH ; melo by to trvat asi 2ms ; simulator pokracuje hned dal, neni to uplne korektni ; tento stav NENI sleep, citace atd. bezi ! NOP ; no a tady mame zapsano - podivejte se do NOP ; ProgramMemory od adresy 0200 NOP ; samozrejme, to nahore se da zacyklit, ; ale nezapomente, ze vzdy MUSITE udelat najednou ; ctyri zapisy !!!!! BCF STATUS,RP0 ; stranka 2 movlw 0C MOVWF EEADR ; zápis dolni pulky adresy , ta je v registru W ; bity 1-0 MUSI byt 00 ; (musi se to zarovnat na blok 4 slov) ; kousek pameti jsme vynechali movlw 02 MOVWF EEADRH ; zapis horni pulky adresy movlw .20 movwf pocitatko ; pocitatko nmam na strance 2 ; aby se to lepe a radostneji delalo ; 20 = 4 x 5 ; budeme zapisovat do 5 bloku po 4 slovech ; to je prave do konce smazaneho kusu pameti movlw 'A' movwf cotampisu ; pismenko je v bunce dalsiwr: BCF STATUS, RP0 ; stranka 2 MOVF cotampisu,0 ; odsah bunky cpu do EEDATA MOVWF EEDATA CLRF EEDATH ; samozrejme, muzeme dat i neco jineho ; nez 0 - tohkle je hornich 6 bitu BSF STATUS,RP0 ; stranka 3 ; startovaci sekvence pro zapis MOVLW 55h ; tady to MOVWF EECON2 MOVLW 0AAh MOVWF EECON2 BSF EECON1, WR NOP ; tyto dve instrukce procesor ignoruje NOP ; ale MUSI tu byt, stejne jako u ostatnich akci s FLASH BCF STATUS,RP0 ; stranka 2 INCF EEADR incf cotampisu ; kod dalsiho ASCII znaku decfsz pocitatko goto dalsiwr NOP ; sem si dejte breakpoint a podivejte se do ProgramMemory NOP ; pokud chcete zapisovat do dalsiho bloku 32 slov ; MUSITE ho napred smazat BCF STATUS,RP0 BCF STATUS,RP1 ; stranka 0 bsf INTCON, PEIE ; a povoluji preruseni od periferii bsf INTCON, GIE ; finalne poustim preruseni smycka: nop nop nop goto smycka end ; end znamena : a tady prestan prekladat ; NENI !!!! to konec programu pro PICa, ; ve funkcnim PICovi ZADNY KONEC PROGRAMU neni, musi to stale neco delat ; end equ define org navesti jsou prikazy pro PREKLADAC, ; tedy pro program, ktery ze slov dela instrukce (cisla !!!! ) ; proto take po techto instrukcich nenajdete ; v hex file ani stopy ; a take je samozrejme neuvidite ve Watch - Program Memory