; tohle bude uz opravdu neco delat ; ; pin 19, RA0 - tam to posila ASI PWM, je to videt u PICKIT LOGIC Analyzer ; na RC0 - pin 16 - to vysila obdelniky s periodou 43ms , taktez zmereno PICKITem ; na RC4 - pin 6 - to vysila rychlosti 2400 Bd pismenka ABCD...Z porad dokola ; v seriovem tvaru - pripojit na UART TOOL PICKIT RX, pin 4 ; RA2 blika s periodou 1 sec asi pin 17 ; R RA5 je oscilator vstup - ; na RA4 vystup vnitrniho osc - pin 3 ; RC3 PWM3 ; RC4 vystup UART #include p16f1708.inc code __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF & _CLKOUTEN_ON ; & _CLKOUTEN_OFF timhle se da vypnout vnitrni oscilator na pinu RA4 - pin 3 __CONFIG _CONFIG2, _WRT_OFF & _LVP_OFF & _PPS1WAY_ON & _ZCDDIS_ON & _PLLEN_OFF & _STVREN_ON & _LPBOR_OFF & _BORV_HI & _LPBOR_OFF ; vubec nerozumim ; BORV_HI EQU H'FBFF' ; Brown-out Reset Voltage (Vbor), high trip point selected. ; _BORV_LO EQU H'FFFF' ; Brown-out Reset Voltage (Vbor), low trip point selected. ; _LPBOR_ON EQU H'F7FF' ; Low-Power BOR is enabled ; _PPS1WAY_ON EQU H'FFFF' ; The PPSLOCK bit cannot be cleared once it is set by software ; a leccos dalsiho, nastaveni fuses over #define LEDZLU PORTA,2 #define LEDCERV PORTC,0 CTVRTSEC equ 0x20 SEKUNDA equ 0x21 MINUTA equ 0x22 HODINA equ 0x23 PISMENKO equ 0x24 FLAGPIS equ 0x25 KOPIERA equ 0x26 #define VYSILAMPISMENO FLAGPIS,0 org 0 goto start ; interrupt ; automaticky se ulozi do shadow registru register ; STATUS register (except for TO and PD) ; BSR register • FSR registers PCLATH register org 4 banksel PIR1 btfsc PIR2, TMR6IF call ODTMR6 btfsc PIR2, TMR4IF call ODTMR4 btfsc PIR1, TMR2IF call ODTMR2 retfie ; RETFIE vraci registry z shadow reg. start: ; oscilator 0 1101 x 1x nechci PLL, 4MHz oscil., x, vnitrni oscilator ; 0110 1x1x 0x6a banksel INTCON clrf INTCON banksel ADCON0 movlw 0x6c ; 0110 1100 11011 = Reserved. No channel connected. movwf ADCON0 ; vypinam prevodnik banksel OSCCON movlw 0x6a ; 0110 1010 - 1101 pro delicku - 4MHz movwf OSCCON ; movlw 2E ; 1F je maximalni frekvence ; 2e je -18 , tedy o 1.6 procenta pomaleji movlw 0 ; stredni frekvence movwf OSCTUNE movlw 0xff movwf TRISA movwf TRISB movwf TRISC bcf LEDZLU ; ve stejne bance jako OSCCON , tedy 1 ; a davam RA5 vystupni ; a i kdyz se tojmenuje PORTA, tak je to v tetobance TRIS bcf LEDCERV bcf TRISC,3 ; je tam PWM, ale to asi nema vyznam ; TRIS MUSI byt nastaven spravne, neni to jedno , viz kap. 17.1 ; pro PWM MUSI byt TRIS nastaven jako output ; bcf TRISC,4 ; tohle je prebito nastavenim PSR, ale pro jistotu ... ; je tady UART vystup banksel PIE1 clrf PIE1 banksel PIE2 clrf PIE2 clrf PIE3 ; stejna banka banksel FSR1L movlw low ZACTAB movwf FSR1L movlw high ZACTAB ; a ono samo si to nachysta na nejvyssi bit 1 ; proste prekladac uz pocita s tim, ze to pouziji pro ; pristup do program memory movwf FSR1H ; podivat do Watch , co jsme nacpali do FSR banksel CTVRTSEC movlp 0 ; ***** !!!! Pokud prelezes 2048 slov kodu, problem s CALL apod !!!! ; mov to PCLATH movlw 4 movwf CTVRTSEC movlw .60 movwf SEKUNDA movwf MINUTA movlw .24 movlw HODINA clrf KOPIERA banksel CCPTMRS movlw 0xdf ; 11 01 11 11 1101 1111 01 - PWM3 based on TMR4 jinak od TMR2 movwf CCPTMRS ; 11 -reserved - ale neni jasne, co to je, ale funguje to s tim banksel ANSELA clrf ANSELA clrf ANSELB clrf ANSELC ; vsechny piny jsou digitalni ; UART je ve stejne bance jako ANSEL ; 2400Bd , j znak je tedy 4.2 ms movlw 0x24 ; TX1STA: x010 0100 High speed BRGH = 1 movwf TX1STA movlw 0x08 ; BAUD1CON: 0000 1000 data nejsou inverovana 16bit BRG movwf BAUD1CON ; BAud RATE je FOSC/[4 (n+1)] vychazi 416 tedy 0x1A0 movlw 0x10 ; RC1STA: 1001 0000 Enable receiver movwf RC1STA movlw 0x01 movwf SP1BRGH movlw 0xa0 movwf SP1BRGL bsf RC1STA,7 ; a tady to cele finalne zapinam ; PWM bude PWM3 ; nastavuji TMR6 ; ma to tri TMR2, jmenuji se 2 4 6 ; ???? ALE PWM umi jenom TMR2 nee, kterykoli TMR umi PWM !!!! ; POSTSCALLER 1:16 PRESCALLER 64 PR6 243 delime 249856 ; 1MHZ : 249856 = 4Hz ; x 1111 1 11 = x111 1111 = 0x7f ; postscaller ON/OFF prescaller ; TMR6 vyrabi cas 1sec, a dale minuty, hodiny, dny atd.atd. banksel PR6 ; to je banka 8 movlw .243 movwf PR6 movlw 0x7f ; 0x7f movwf T6CON ; zase vsechno stejna banka 8 banksel PIE2 ; jina banka - 1 bsf PIE2, TMR6IE ; poustim interrupt od TMR6 ; POSTSCALLER 1:16 PRESCALLER 64 PR6 243 delime 249856 ; 1MHZ : 249856 = 4Hz ; x 1111 1 11 = x111 1111 = 0x7f ; postscaller ON/OFF prescaller ; TMR2 , bezi s periodou ASI 1ms - 1kHz ; zatim volny banksel TMR2 movlw .255 movwf PR2 ; x111 1101 movlw 0x7d ; postclaller 16, prescaller deli 4, TMR je ON movwf T2CON ; zase vsechno stejna banka banksel PIE1 bsf PIE1, TMR2IE ; poustim interrupt od TMR6 ; TMR4 bude na PWM , dale za tim postscaller deli 16 ; preruseni s frekvenci 61 Hz - 16 ms banksel TMR4 movlw .255 movwf PR4 ; x111 1101 movlw 0x7d ; postclaller 16, prescaller deli 4, TMR je ON movwf T4CON ; zase vsechno stejna banka banksel PIE2 bsf PIE2, TMR4IE ; poustim interrupt od TMR4 ; tak tohle nefunguje, nemas tam UNLOCK a LOCK !!!! ; UNLOCK PPS bcf INTCON,GIE ; uspend interrupts BANKSEL PPSLOCK ; set bank ; required sequence, next 5 instructions movlw 0x55 movwf PPSLOCK movlw 0xAA movwf PPSLOCK ; Set PPSLOCKED bit to disable writes or ; Clear PPSLOCKED bit to enable writes bcf PPSLOCK,PPSLOCKED ; a zvolime si RC3 jako vystup PWM3 banksel RC3PPS movlw 0x0e ; 01110 = Rxy source is PWM3OUT movwf RC3PPS ; RC4 bude vystup UARTu movlw 0x14 ; 10100 = Rxy source is TX/CK(1) movwf RC4PPS ; stejna stranka jako RC3PPS BANKSEL PPSLOCK ; set bank ; required sequence, next 5 instructions movlw 0x55 movwf PPSLOCK movlw 0xAA movwf PPSLOCK ; Set PPSLOCKED bit to disable writes or ; Clear PPSLOCKED bit to enable writes bsf PPSLOCK,PPSLOCKED ; restore interrupts bsf INTCON,GIE ; LOCK PPS banksel PWM3CON clrf PWM3DCL movlw .200 movwf PWM3DCH ; nejake 3/4 je duty time movlw 0x80 movwf PWM3CON banksel INTCON bsf INTCON, PEIE bsf INTCON,GIE ; vew smycce kdovijaka banka !!!! smycka: nop nop banksel FLAGPIS btfsc VYSILAMPISMENO call VYSLIPIS nop goto smycka ODTMR2: ; a je to 16x preteceni - postscaller na 16 banksel PIR1 ; 53,30Hz podle PICKIT2 bcf PIR1, TMR2IF ; 53,30 x 16 x 255 x 4 = 873262Kz, to je dost jinak nop ; JENOMZE ten PICKIT dost keca !!!!!! nop return ODTMR4: ; vola se s periodou asi 16ms banksel PIR2 bcf PIR2, TMR4IF nop banksel FLAGPIS bsf VYSILAMPISMENO btfss LEDCERV goto ODTMR4A bcf LEDCERV return ODTMR4A: bsf LEDCERV nop return ODTMR6: banksel PIR2 bcf PIR2, TMR6IF banksel PWM3DCH incf PWM3DCH ; za 30 sec to naroste z 0 na 100 procent duty cycle incf PWM3DCH banksel CTVRTSEC ; to je banka 0, tam budou doufam vsecny promenne decfsz CTVRTSEC return movlw .4 movwf CTVRTSEC call ZAVTERINU decfsz SEKUNDA return movlw .60 movwf SEKUNDA call ZAMINUTU decfsz MINUTA return call ZAHODINU decfsz HODINA return call ZADEN movlw .24 movwf HODINA return ; to, co se ma delat 1x za sekundu ; SEKUNDA pritom udava, kolikata je to sekunda v minute, leze dolu 60 az 1 ZAVTERINU: ; movlw B'00000100' ; xorwf PORTA,1 ; neguji RA5 ; btfss LEDZLU goto ZAVTA bcf LEDZLU return ZAVTA: bsf LEDZLU nop return ; to, co se ma delat 1x za minutu ; MINUTA udava, kolikata minuta v hodine, leze dolu 60 az 1 ZAMINUTU: nop return ; to, co se ma delat 1x za hodinu ; HODINA udava, kolikata je hodina - 24 az 1, 0 je prepsana 24 ZAHODINU: nop return ; to, co se ma delat jedenkrat za den ZADEN: nop return VYSLIPIS: moviw ++FSR1 ; mov indirect to w banksel TX1REG movwf TX1REG ; vysilam pismenko banksel FLAGPIS bcf VYSILAMPISMENO movf INDF1,1 ; testuji hodnotu cisla btfss STATUS,Z return banksel FSR1L ; vracim pointer na zacatek tabulky movlw low ZACTAB movwf FSR1L movlw high ZACTAB movwf FSR1H ; podivat do Watch , co jsme nacpali do FSR return ZACTAB: de " To nam ten procesor krasne funguje ! \n" de "Doufam, ze se to druhaci nauci. \n" de "No a pokud ne, tak propadnou ! \n\n" de "\n\n\n \n" de 0,0,0,0 end