;---------------------------------------------------------------------; ; ; ; File: MINISUMO_X.ASM ; ; ; ;---------------------------------------------------------------------; ;Autor: Jiri Bezstarosti ; ;e-mail: jiri@bezstarosti.cz ; ;web: http://www.siliconbrain.biz ; ;---------------------------------------------------------------------; ;PROGRAM JE URCEN PRO MALE ROBOTY, A JE NAPSAN TAK, ZE RESI VESKEROU ; ;REZII SPOJENOU SE CTENIM STAVU SENZORU A OVLADANIM MOTORU ; ; ; ;PROGRAM POCITA SE ZAPOJENIM 2 ODRAZOVYCH SENZORU (SVETELNA ODRAZIVOST; ;MATERIALU POD ROBOTEM (CERNA/BILA), 2 ODRAZOVYCH IR CIDEL PRO DETEKCI; ;PREKAZKY ZADNA/VLEVO/VPRAVO/UPROSTRED A S PRIPOJENIM 2 MOTORU ; ; ; ;PROGRAM JE POLOTOVAREM PRO RYCHLOU APLIKACI VLASTNIHO CHOVANI ROBOTU ; ;TAK JAK JE, JE URCEN PRO OVLADANI ROBOTU SERIOVOU LINKOU, NAPRIKLAD ; ;Z PC ; ; ; ;AUTOR NENESE ZADNOU ZODPOVEDNOST ZA POUZITI TOHOTO SOFTWARE A ANI ; ;ZA JEHO BEZCHYBNOST. ; ; ; ;PROGRAM JE BOHATE KOMENTOVAN, PROTOZE SE PREDPOKLADA JEHO VYUZITI ; ;PREDEVSIM PRO UCELY ZACATECNIKU A VYUKY, ALE NEVYLUCUJE TO JEHO ; ;VYUZITI ANI POKROCILYM V OBLASTI PROGRAMOVANI MCU PIC. ; ;---------------------------------------------------------------------; LIST P=16F818, R=DEC ;URCIME TYP PROCESORU A JINAK NEOZNACENE HODNOTY BUDEME PSAT V DESITKOVEM VYJADRENI #INCLUDE P16F818.INC ;PRIPOJIME SI SOUBOR S DEFINICEMI JMEN REGISTRU A DALSICH CISELNYCH HODNOT __CONFIG _CP_ALL & _CCP1_RB2 & _DEBUG_OFF & _WRT_ENABLE_1024 & _CPD_ON & _LVP_OFF & _BODEN_ON & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC ;PIC ZAMYKAM PROTI CTENI PROGRAMU, ZAKAZUJI DEBUGOVANI, ZAKAZUJI ZAPIS DO PAMETI PROGRAMU, ZAKAZUJI PROGRAMOVANI NIZKYM NAPETIM, ;POVOLUJI RESET PIC PRI PODPETI NA NAPAJENI, POVOLUJI VYVOD RESETU, POVOLUJI PRODLEVU ROZBEHU PO PRIPOJENI NAPAJENI ;ZAKAZUJI HLIDANI BEHU PIC POMOCI WDT A K TAKTOVANI BUDU POUZIVAT KRYSTAL NA FREKVENCI VYSSI NEZ 4MHZ ;PROGRAM JE URCEN K NASLEDUJICIMU ZAPOJENI (ZJEDNODUSENE): ; KRYSTAL 20MHZ ; ; RB0 OUT L_BRIDGE_A ; RB1 IN RXD (PULL-UP) ; RB2 OUT TXD ; RB3 OUT L_BRIDGE_B ; RB4 OUT R_BRIDGE_A ; RB5 OUT R_BRIDGE_B ; RB6 IN PGC (PULL-UP) ; RB7 IN PGD (PULL-UP) ; ; RA0 IN R_BOTTOM ; RA1 IN SFH5110 ; RA2 OUT R_IRLED ; RA3 IN L_BOTTOM ; RA4 OUT L_IRLED ; RA5 IN BUTTON ; RA6 IN XTAL ; RA7 IN XTAL ;NADEFINUJI SI, KAM JE CO PRIPOJENO, ABYCH SI TO NEMUSEL PAMATOVAT CISELNE #DEFINE L_BRIDGE_A PORTB,0 ;VYSTUP PRO RIZENI MUSTKU LEVEHO MOTORU #DEFINE RXD PORTB,1 ;PRIJEM SERIOVEHO PORTU REALIZOVANY SOFTWAREM V UROVNICH CMOS #DEFINE TXD PORTB,2 ;VYSILANI SERIOVEHO PORTU REALIZOVANY SOFTWAREM V UROVNICH CMOS #DEFINE L_BRIDGE_B PORTB,3 ;VYSTUP PRO RIZENI MUSTKU LEVEHO MOTORU #DEFINE R_BRIDGE_A PORTB,4 ;VYSTUP PRO RIZENI MUSTKU PRAVEHO MOTORU #DEFINE R_BRIDGE_B PORTB,5 ;VYSTUP PRO RIZENI MUSTKU PRAVEHO MOTORU #DEFINE R_BOTTOM PORTA,0 #DEFINE SFH5110 PORTA,1 #DEFINE R_IRLED PORTA,2 #DEFINE L_BOTTOM PORTA,3 #DEFINE L_IRLED PORTA,4 #DEFINE BUTTON PORTA,5 ;POKUD BYCH ZAKAZAL MCLR VYVOD (RESET) V __CONFIG POMOCI _MCLR_OFF, ;MOHL BYCH NA NEM MIT TLACITKO ;PROTOZE CHCI RESET, NECHAVAM NA POCATKU PROGRAMU ZA __CONFIG _MCLR_ON, ;ALE TUTO DEFINICI ZDE MOHU NECHAT PRO PRIPADNOU ZMENU ;DALE BUDU NAZYVAT OBSLUHOU PRERUSENI TO CO PROVADIM V PRERUSENI A CO JE NEMENNE A VLASTNI APLIKACI TO, ;CO JE POPSANO JAKO VLASTNI APLIKACE NIZE (KOD, OBSLUHUJICI CHOVANI ROBOTU) A CO JE URCENO KE ZMENAM TIM, ;KDO TENTO POLOTOVAR POUZIJE CBLOCK 0x70 ;NASLEDUJI PROMENNE PRO OBSLUHU PRERUSENI ;TYTO PROMENNE, NEBO CHCETE-LI REGISTRY, JSOU MAPOVANY VE VSECH BANKACH DATOVE PAMETI (REGISTRU) ;AT JE BANKA REGISTRU VE VLASTNI APLIKACI NASTAVENA JAKKOLI, ZDE SI MOHU VZDY ROVNOU CIST A NASTAVOVAT TYTO REGISTRY ;ZDE NIC NEDOPISOVAT A NEMENIT, POKUD PRESNE NEVIM, CO TIM CINIM W_TMP ;SEM SE V PRERUSENI UKLADA W, ABYCH SI JEJ NEPREPSAL PRO BEH PROGRAMU A PO OBSLUZE PRERUSENI JEJ VRATIM STATUS_TMP ;SEM SE V PRERUSENI UKLADA STATUS, STEJNE JAKO VYSE W REGISTR INTCNT ;POCITADLO PRERUSENI, INKREMENTUJE SE KAZDYM PRERUSENIM A LZE POUZIT PRO POTREBY STANOVENI CASU ;JAKO POCTU PROVEDENYCH PRERUSENI ASYNCFLAGS ;BIT0 JE KOPIE VSTUPU RXD PRO ZPRACOVANI ;BIT1 JE PRIZNAK PRIJMU (1=PRIJATO) A MAZE SE JEN VLASTNI APLIKACI, NE PRERUSENIM ;BIT2 V 1 ZNAMENA PRETECENI PRIJMU SERIOVYM PORTEM, TEDY PRIJAL SE DALSI BAJT, ANIZ BY PREDCHOZI BYL VYZVEDNUT ;BIT4 POKUD JE V 1, PAK CHCI VYSILAT ZNAK Z TXBYTE - DO 1 JEJ NASTAVUJE VLASTNI APLIKACE, ; DO 0 SE NASTAVUJE V PRERUSENI PO ODESLANI BAJTU SERIOVOU LINKOU ASYNCBIT_RX ;POZICE PRIJMU, 0 ZNAMENA, ZE JESTE SE VUBEC NIC NEPRIJALO A TO ANI STARTBIT ASYNCBIT_RX_CNT ;POCITADLO PRIJATYCH JEDNICEK - KAZDY BIT SE SAMPLUJE 15X A 1 CI 0 SE PRIJME PODLE PREVAHY 1 NEBO 0 RXBUF ;SEM SE PRIJIMAJI JEDNOTLIVE BITY RXBYTE ;SEM SE DAVA PRIJATY BAJT PRO UCELY VLASTNI APLIKACE, KDYZ JE NAHOZEN ASYNCFLAGS,1 TXCNT ;POCITADLO ODESLANYCH BAJTU TXBUF ;ODESILACI BYTE PRO POTREBY SOFTWAROVEHO SERIOVEHO PORTU - SEM SE KOPIRUJE TXBYTE TXBYTE ;SEM SE DAVA ODESILANY ZNAK NEZ SE VE VLASTNI APLIKACI NASTAVI ASYNCFLAGS,4, ZE JEJ CHCEME ODESLAT PHASE ;POCITADLO 0 AZ 14, ROZDELUJE PRERUSENI NA FAZE A V KAZDE PROBIHA NEJAKA CINNOST IR_LEFT_RIGHT ;TOTO SE KOPIRUJE NA BRANU PRO BLIKANI IR LED A PRERUSENI SI TO PREHAZUJE, KTEROU IR LED SE PRAVE BLIKA SENSORS ;BIT7=BUTTON, BIT3=LEVE SPODNI, BIT2=PRAVE SPODNI, BIT1=LEVE PREDNI, BIT0=PRAVE PREDNI MOTORS ;HODNOTY PRO PWM MOTORU, BIT7 SMER LEVEHO, BIT6 AZ 4 JE LEVY PWM, ;BIT3 SMER PRAVEHO, BIT2 AZ 0 JE PRAVY PWM MOTORS_PHASE ;FAZE PWM MOTORU, POMOCNA PROMENNA PRO RIZENI PWM ENDC CBLOCK 0x20 ;ZDE JSOU PROMENNE VLASTNI APLIKACE A JE MOZNO JE SEM PRIPISOVAT DLE POTREBY ;DO PAMETI DAT (REGISTRU) V ROZSAHU 0X20 AZ 0X6F SI TEDY MOHU DAT PROMENNE DLE SVE LIBOSTI NEJAKAPROMENNA ;NENI VYUZITA, JE TADY JEN PRO UCELY PRIKLADU ENDC ;MAKRA PRO PREHAZOVANI BANK REGISTRU, ABYCH SI NEMUSEL PAMATOVAT, KTERY BIT TO JE A MOHL PSAT JEN BANK0 A BANK1 ;PROGRAM VYUZIVA POUZE BANK0 A BANK1, NERESI POUZITI VYSSICH BANK A TEDY SE PRACUJE POUZE SE BCF STATUS,RP0 ;MOHL BYCH PSAT I BANKSEL, ALE POKUD NEPOUZIVAM VYSSI BANKY, TOTO JE JEN JEDNA INSTRUKCE MISTO DVOU U BANKSEL BANK0 MACRO BCF STATUS,RP0 ENDM BANK1 MACRO BSF STATUS,RP0 ENDM ORG 0 ;PROGRAM ZACINA NA ADRESE 0, SEM SE SKACE PO RESETU PIC NEBO PO PRIPOJENI NAPAJENI GOTO START ;ODSKOCIM SI NA NAVESTI START - PRESKOCIM OBSLUHU PRERUSENI ORG 0X4 ;NA ADRESU 4 SKACE PRERUSENI, UMISTIME SEM TEDY OBSLUHU PRERUSENI ;PRERUSENI OD TIMER0 SE DEJE KAZDYCH 139 INSTRUKCNICH CYKLU ;PRI 20MHz KRYSTALU JE TO 35971 PRERUSENI/SEC ;MOHU TEDY SNADNO BLIKAT IR LED PRO DETEKCI PREKAZEK NA 36KHZ ;BLIKNUTI IR LED JE JEN KRATKY PULS PRO SNIZENI DOSAHU DETEKCE CIDEL ;ZAROVEN PRERUSENI KAZDYCH 139 INSTRUKCNICH CYKLU UMOZNUJE RESENI SERIOVEHO PORTU SOFTWAREM TAK, ;ZE PRI 2400BPS 8N1 MAM NABRAN JEDEN BIT ZA 15 PRERUSENI A ODCHYLKA OD 2400BPS JE MINIMALNI ;ULOZIT KONTEXT MOVWF W_TMP ;SCHOVAM SI W REGISTR, ABYCH SI HO NEPREPSAL VE VLASTNI APLIKACI SWAPF STATUS,W ;TOTEZ SE STATUS REGISTREM, TEDY DAM JEJ NEJPRVE OTOCENY DO W INSTRUKCI SWAPF (NEPOSKODI MI JEJ) MOVWF STATUS_TMP ;A TAKTO OTOCENY JEJ ODLOZIM DO PAMETI REGISTU BANKSEL 0 ;ZVOLIM SI BANKU 0, PROTOZE BUDU PRACOVAT TAKE S ADCON0 A TEN JE V BANCE 0 BCF INTCON,TMR0IF ;UZ VIM, ZE TIMER0 PRETEKL, TEDY TIKL A UZ MOHU VYNULOVAT JEHO PRIZNAK, KTERY VYVOLAL TOTO PRERUSENI MOVLW .129 ;NASTAVIM HODNOTU DO W REGISTR PRO ZAPSANI DO TMR0 NA CAS, ZA JAK DLOUHO CHCI, ABY OPET PRETEKL - TIKL MOVWF TMR0 ;TIMTO DOSAHUJI PRERUSENI JEDNOU ZA 139 INSTRUKCNICH CYKLU ;BLIKNUTI A DETEKCE IR LED MOVF IR_LEFT_RIGHT,W ;ULOZIM DO W REGISTRU OBSAH IR_LEFT_RIGHT MOVWF PORTA ;A VLOZIM TOTO DO PORTA, CIMZ ROZSVITIM LEVOU NEBO PRAVOU IR LED DLE AKTUALNIHO OBSAHU IR_LEFT_RIGHT INCF INTCNT,F ;ZVYSIM SI HODNOTU V INTCNT O 1, JE TO POCITADLO POCTU PRERUSENI ;NABRAT BIT SERIAKU BCF ASYNCFLAGS,0 ;NASTAVIM SI BIT ASYNCFLAGS,0 DO 0 BTFSC RXD ;POKUD JE RXD VSTUP V 0, PAK NASLEDUJICI INSTRUKCI PRESKOCIM BSF ASYNCFLAGS,0 ;RXD VSTUP NEBYL V 0, TEDY NASTAVIM ASYNCFLAGS,0 DO 1 ;NYNI MAM V ASYNCFLAGS,0 KOPII STAVU VSTUPU RXD A RESIT CO S TIM MOHU AZ DALE ;NASLEDUJICI SKOKY JEN SKACI NA DALSI RADEK A NEDELAJI NIC JINEHO, NEZ ZE TRVAJI NEJAKY CAS ;TATO GOTO PRODLUZUJI CAS SVICENI IR LED GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 MOVLW B'00010100' ;DAME JEDNICKY DO BITU W REGISTRU, REPREZENTUJICI VYSTUPY PRO IR LED MOVWF PORTA ;VLOZIME HODNOTU Z W REGISTRU DO PORTA A TIM ZHASNEME IR LED DECF PHASE,W ;ODECTEME JEDNICKU Z REGISTRU PHASE, KTERY URCUJE, CO V TOMTO PRERUSENI BUDEME DELAT BTFSS STATUS,Z ;POKUD PHASE REGISTR PO ODECTENI 1 NEDOSAHNE HODNOTY 0, PAK PROVEDEME NASLEDUJICI INSTRUKCI GOTO NOMOTORS ;PHASE NENI 0, TEDY PRESKOCIME NASLEDUJICI KOD AZ NA NAVESTI NOMOTORS - NENI SPRAVNY CAS PRO RESENI MOTORU ;JE MOTORS_PHASE (0 AZ 6) STEJNA JAKO NASTAVENI MOTORU ? SWAPF MOTORS,W ;VYMENIM HORNI A DOLNI 4 BITY V REGISTRU MOTORS A DAME VYSLEDEK DO W REGISTRU ;HODNOTA PRO LEVY MOTOR JE BIT7 SMER OTACENI A BIT6 AZ 4 HODNOTA PWM ;HODNOTU PWM POTREBUJI V NEJNIZSICH TRECH BITECH, PROTO SI VYMENUJI MEZI SEBOU HORNI A DOLNI 4 BITY ANDLW B'00000111' ;NECHAM SI VE W REGISTRU JEN NEJNIZSI 3 BITY, ZBYTEK JICH VYNULUJI SUBWF MOTORS_PHASE,W ;ODECTU MOTORS_PHASE-MOTORS BTFSC STATUS,C ;POKUD SE MI NASTAVIL PRIZNAK STATUS,C DO 1, JE VHODNY CAS K VYPNUTI LEVEHO MOTORU GOTO ML_OFF ;SKOC NA VYPNUTI LEVEHO MOTORU BTFSC MOTORS,7 ;LEVY MOTOR SE NEMEL VYPNOUT, PODIVAM SE TEDY NA SMER, KTERYM SE MA TOCIT GOTO ML_POSITIVE ;BIT7 V MOTORS JE JEDNICKOVY NOP ;NOP NIC NEDELA, ALE DOROVNAME SI TIM VSECHNY VETVE KODU NA STEJNY CAS PROVADENI BCF L_BRIDGE_A ;VYSTUP L_BRIDGE_A JDE DO 0 BSF L_BRIDGE_B ;VYSTUP L_BRIDGE_B JDE DO 1 GOTO ML_NEGATIVE ;MAME CO JSME CHTELI S MOTOREM, PRESKOCIME NA NAVESTI ML_NEGATIVE ML_POSITIVE BCF L_BRIDGE_B ;VYSTUP L_BRIDGE_B JDE DO 0 BSF L_BRIDGE_A ;VYSTUP L_BRIDGE_A JDE DO 1 GOTO ML_NEGATIVE ;MAME CO JSME CHTELI S MOTOREM, PRESKOCIME NA NAVESTI ML_NEGATIVE ML_OFF GOTO $+1 ;SKOCIME NA NASLEDUJICI INSTRUKCI, CIMZ SI JEN DOROVNAME STEJNY CAS PROVADENI VSECH VETVI KODU BCF L_BRIDGE_A ;VYSTUP L_BRIDGE_A JDE DO 0 BCF L_BRIDGE_B ;VYSTUP L_BRIDGE_A JDE DO 0 - MOTOR JE VYPNUT, OBE STRANY MUSTKU JSOU V 0 ML_NEGATIVE ;LEVY MOTOR JE OBSLOUZEN ;JE MOTORS_PHASE (0 AZ 6) STEJNA JAKO NASTAVENI MOTORU ? MOVF MOTORS,W ;DO W REGISTRU SI DAM HODNOTU Z MOTORS A PRO PRAVY MOTOR MAM HODNOTU PWM PRIMO V NEJNIZSICH TRECH BITECH ANDLW B'00000111' ;OSTATNI BITY (MIMO TY DOLNI 3) SI ZNULUJI SUBWF MOTORS_PHASE,W ;NYNI UZ VSECHNO PROBIHA STEJNE JAKO PRO LEVY MOTOR BTFSC STATUS,C ;TADY ZACATECNICI POZOR, BIT C JE PO INSTRUKCI SUBWF JEDNICKOVY, POKUD NEDOSLO ODECTENIM K PODTECENI GOTO MR_OFF BTFSC MOTORS,3 GOTO MR_POSITIVE NOP BCF R_BRIDGE_A BSF R_BRIDGE_B GOTO MR_NEGATIVE MR_POSITIVE BCF R_BRIDGE_B BSF R_BRIDGE_A GOTO MR_NEGATIVE MR_OFF GOTO $+1 BCF R_BRIDGE_A BCF R_BRIDGE_B MR_NEGATIVE INCF MOTORS_PHASE,F MOVF MOTORS_PHASE,W XORLW 7 BTFSC STATUS,Z CLRF MOTORS_PHASE ;POKUD JE MOTORS_PHASE=7, PAK MOTORS_PHASE=0 NOMOTORS ;SEM SE DOSKOCI, POKUD SE NERESILY V TOMTO PRERUSENI MOTORY A NEBO POKUD JSOU JIZ VYRESENY ;POKUD JE CO VYSILAT, VYSILAM SERIOVYM PORTEM MOVF PHASE,F ;DAM SI PHASE DO SEBE SAMEHO. MA TO TEN EFEKT, ZE POKUD JE 0, PAK SE NASTAVI PRIZNAK STATUS,Z BTFSS STATUS,Z ;POKUD TEDY BYLO PHASE ROVNO 0, NASLEDUJICI INSTRUKCE SE PRESKOCI GOTO NEVYSILAM2 ;PHASE NEBYLO 0, TEDY PRESKOC NA NAVESTI NEVYSILAM2, NENI TED VHODNY CAS ;VYSILA SE JEN KDYZ JE PHASE=0 BTFSS ASYNCFLAGS,4 ;JE VHODNY CAS K VYSILANI, ALE JE VUBEC POZADAVEK NA VYSILANI SERIOVYM PORTEM (LINKOU TXD) GOTO NEVYSILAM2 ;NENAHOZENY ASYNCFLAGS,4, PAK NIC NEDELAM ;JE TXCNT=0 ? MOVF TXCNT,F ;OTESTUJI TXCNT - JE TO MOJE POCITADLO ODESILANYCH BITU. BTFSS STATUS,Z ;ZASE JSEM SI DAL TXCNT SAMO DO SEBE A TED TESTUJI, ZDA BYLO 0 GOTO NEVYSILAM ;TXCNT NEBYLO 0, TEDY PRESKOCIM NA NAVESTI NEVYSILAM ;ANO, TXCNT=0 MOVF TXBYTE,W ;OBSAH TXBYTE (TO JE TO CO VLASTNI APLIKACE CHTELA ODESLAT) SI DAM DO W REGISTRU MOVWF TXBUF ;A W REGISTR SI TED DAM DO TXBUF - PROSTE JSEM SI UDELAL TXBUF=TXBYTE MOVLW 9 ;DO W REGISTRU DAM 9 MOVWF TXCNT ;A TECH 9 Z W REGISTRU SI DAM DO TXCNT REGISTRU GOTO $+1 ;SKOKEM NA NASLEDUJICI INSTRUKCI JEN DOROVNAM CAS PROVADENI BCF TXD ;A VYSLU SI STARTBIT - ZACINAM FYZICKY NA LINKU TXD VYSILAT SERIOVE BAJT GOTO NEVYSILAM2 ;ZBYTEK VYSILANI PRESKOCIM, V TOMTO PRERUSENI JSEM UZ VYSLAL STARTBIT A DALSI VECI AZ V DALSIM PREUSENI NEVYSILAM BSF STATUS,C ;DAM SI DO STATUS,C 1 RRF TXBUF,F ;TED ROTUJI TXBUF K NIZSIM BITUM A DO NEJVYSSIHO NASUNU TU JEDNICKU ZE STATUS,C ;A DO STATUS,C SE MI NASUNUL NEJNIZSI BIT BTFSC STATUS,C ;TED OTESTUJI TEN VYSUNUTY BIT VE STATUS,C A JE-LI 0, PRESKOCIM NASLEDUJICI INSTRUKCI GOTO NOZERO ;STATUS,C NEBYLO 0, SKOCIM SI NA NAVESTI NOZERO NOP ;NOP NIC NEDELA, ALE TRVA JEDEN INSTRUKCNI CYKLUS A JA SI TIM DOROVNAM, ABY AT NULA CI JEDNICKA ;SE VZDY VYSLALY VE STEJNY CAS BCF TXD ;TED DAM FYZICKY 0 NA VYSTUP TXD GOTO YESONE ;A PRESKOCIM ZBYTEK OHLEDNE VYSILANI, MAM TO PRO TOTO PRERUSENI VYRESENO NOZERO BSF TXD ;SEM JSEM SKOCIL, POKUS SE MELA VYSLAT JEDNICKA, TAK JI DAM FYZICKY NA VYSTUP TXD GOTO YESONE ;SKOK NA NASLEDUJICI NAVESTI YESONE DECF TXCNT,F ;SNIZIM O JEDNU OBSAH TXCNT ;(PRO ZACATECNIKY TO ,F ZNAMENA, ZE DAM VYSLEDEK ZPET DO TXCNT ;A KDYBY TAM BYLO W, SEL BY VYSLEDEK DO W REGISTRU, ALE TO TED NECHCI) BTFSC STATUS,Z ;POKUD JSEM PO ODECTENI 1 Z TXCNT NEDOSAHL 0, PRESKOCIM NASLEDUJICI INSTRUKCI BCF ASYNCFLAGS,4 ;UZ JE VYSLANO, TAK SMAZNU PRIZNAK ASYNCFLAGS,4 AT VLASTNI APLIKACE VI, ZE JSEM TO V PRERUSENI ODESLAL CELE NEVYSILAM2 ;VYHODNOCENI PRIJMU SERIOVEHO PORTU, TEDY LINKY RXD ;DRIVE JSEM SI OKOPIROVAL STAV RXD DO ASYNCFLAGS,0 A TED RESIM CO S TIM MOVF ASYNCBIT_RX,F ;ASYNCBIT_RX DAM SAM DO SEBE A NASTAVIM SI TIM STATUS,Z DO 1, POKUD JE ASYNCBIT_RX ROVEN 0. BTFSC STATUS,Z ;POKUD JE STATUS,Z NULOVY, TEDY ASYNCBIT_RX NEBYL 0, PRESKOCIM NASLEDUJICI INSTRUKCI GOTO NOSTARTBIT ;ASYNCBIT_RX JE NULOVY A TEDY VIM, ZE ZATIM NEBYL STARTBIT NA LINCE RXD A PRESKOCIM ZBYTEK ;PRIJEM BEZI, POCITAM DECF ASYNCBIT_RX,W ;ODECTU JEDNICKU Z ASYNCBIT_RX, ALE VYSLEDEK DAM DO W REGISTRU (ASYNCBIT_RX SI TIM NEZMENIM) BTFSC STATUS,Z ;TED OTESTUJI, ZDA BY ODECTENIM 1 Z ASYNCBIT_RX NEDOSLO K VYSLEDKU 0 CLRF ASYNCBIT_RX_CNT ;PROTOZE JE TED JASNE, ZE ASYNCBIT_RX JE ROVNO 1, SMAZU POCET JEDNICEK CO SE VZALY Z RXD VSTUPU BTFSC ASYNCFLAGS,0 ;ZJISTIM, ZDA NA RXD PINU BYLA JEDNICKA NEBO NULA INCF ASYNCBIT_RX_CNT,F ;A POKUD JSEM TOTO NEPRESKOCIL, TAK NA RXD BYLA JEDNICKA A TEDY K ASYNCBIT_RX_CNT PRICTU 1 INCF ASYNCBIT_RX,F ;ZVYSIM SI POCITADLO, TEDY REGISTR ASYNCBIT_RX O 1 BTFSS ASYNCBIT_RX,4 ;ASYNCBIT_RX=16 ? POKUD JE NASTAVEN BIT ASYNCBIT_RX,4, PAK JE HODNOTA V ASYNCBIT_RX ROVNA 16 GOTO YESSTARTBIT ;ASYNCBIT_RX JESTE 16 NEDOSAHL, JE MOC MLADY, TAKZE TO JE PRO TOTO PRERUSENI S PRIJMEM VSECHNO MOVLW 1 ;ASYNCBIT_RX DOSAHL 16, VRATIME JEJ DO HODNOTY 1, TEDY NEJPRVE DAME 16 DO W REGISTRU MOVWF ASYNCBIT_RX ;A W OBSAH REGISTRU ZAPISEME DO ASYNCBIT_RX ;TED VIM, ZE POKUD JSEM ZDE, ABSOLVOVAL JSEM 15 TESTU RXD VSTUPU ;KOLIK BYLO JEDNICEK ZA TECH 15 PRIJMU NA VSTUPU RXD ? ;POKUD ALESPON 8, PAK JE PRIJATA JEDNICKA - TEDY JEDEN BIT S HODNOTOU 1 MOVLW .256-.8 ;ABYCH NEMUSEL POCITAT KOLIK JE 256-8, TAK TO NAPISU TAKTO A DAM TO DO W REGISTRU ADDWF ASYNCBIT_RX_CNT,W ;TED POCET JEDNICEK PRICTU K TOMU, CO JSEM DAL DO W REGISTRU A POKUD TO BYLO 8 A VICE, ;NASTAVI SE MI STATUS,C, PROTOZE HODNOTA CO JSEM SPOCITAL PRETEKLA ROZSAH JEDNOHO BAJTU RRF RXBUF,F ;TED TEN STATUS,C NASUNU DO NEJVYSSIHO BITU RXBUF A OSTATNI SE POSUNOU SMEREM K NIZSIM BTFSC STATUS,C ;TED SE PODIVAM, CO MI VYTEKLO DO STATUS,C Z NEJNIZSIHO BITU RXBUF GOTO YESSTARTBIT ;STATUS,C NENI 0, TEDY NENI PRIJAT CELY BAJT, ALE V TOMTO PRERUSENI UZ MAME VSECHNO HOTOVO ;A POKUD JE VE STATUS,C 0, ;PAK UZ JSEM TAM DOROTOVAL STARTBIT, TEDY RXBUF OBSAHUJE VSECHNY PRIJATE BITY ;PUVODNE JE TOTIZ RXBUF SAME JEDNICKY, TAKZE DO STATUS,C PO INSTRUKCI RRF DSUNE 0 ;AZ V OKAMZIKU, KDY JE TO NASUNUTY PRIJATY STARTBIT ;PRIJEM KOMPLETNI MOVF RXBUF,W ;DO W REGISTRU NAKOPIRUJI PRIJATOU HODNOTU Z RXBUF MOVWF RXBYTE ;A VLASTNI APLIKACI TO POSKYTNU V REGISTRU RXBYTE ;ABYCH MOHL POUZIVAT RXBUF V DOBE, KDY SI JESTE VLASTNI APLIKACE NEVYZVEDNE PRIJATY BYTE ;NASTAVIM PRIZNAK, ZE JE KOMPLETNE PRIJATO ;UZ SI NEKDO VYZVEDL PREDCHOZI PRIJATY BAJT ? BTFSC ASYNCFLAGS,1 ;PODIVAM SE ZDA JE ZNULOVAN BIT ASYNCFLAGS,1, TEDY ZDA SI VLASTNI APLIKACE JIZ VYZVEDLA CO JSEM PRIJAL BSF ASYNCFLAGS,2 ;KDYZ SE PROVEDE TOTO, PAK PREDCHOZI NEVYZVEDNUT A TAK NASTAVIM PRO INFORMACI ASYNCFLAGS,2 BSF ASYNCFLAGS,1 ;NASTAVIM ASYNCFLAGS,1, AT VLASTNI APLIKACE VI, ZE SE NECO PRIJALO ;KDYZ TENTO BIT VLASTNI APLIKACE VYNULUJE, PAK VIM, ZE SI PRIJATY BYTE Z RXBYTE VYZVEDLA ;A TAKY MUSIM CEKAT NA STARTBIT CLRF ASYNCBIT_RX ;VSECHNO JSEM PRIJAL, TAK NASTAVIM, ZE SE ZNOVU CEKA NA STARTBIT, TEDY DALSI PRIJEM NA VSTUPU RXD GOTO YESSTARTBIT ;TED UZ NENI CO DELAT, PRIJEM JE KOMPLET, TO CO JE POD TIMTO K TOMU NEPATRI A TAK TO PRESKOCIM NOSTARTBIT BTFSC ASYNCFLAGS,0 ;ASYNCFLAGS,0 JE CO BYLO NA VSTUPU RXD A TAK ZE PODIVAM, ZDA NEBYL VSTUP RXD V 0 GOTO YESSTARTBIT ;NEBYL V NULE, TEDY NEMAM NA RXD STARTBIT A JE TO VYRESENO, TEDY SKOCIM SI ;JMENO NAVESTI TADY MUZE BYT TROSKU ZAVADEJICI, TAK TO TAK BERME, JE TO JEN NEJAKE SLOVO MOVLW 0XFF ;DO W REGISTRU SI DAM VSECHNY BITY DO 1 MOVWF RXBUF ;A W REGISTR PREKOPIRUJI DO RXBUF REGISTRU - PROSTE NASTAVIM SAME JEDNICKY DO RXBUF REGISTRU INCF ASYNCBIT_RX,F ;A SLYSIM STARTBIT, TEDY ZVYSIM REGISTR ASYNCBIT_RX O 1, ZE UZ TO JEDE A ZE JSEM SLYSEL STARTBIT YESSTARTBIT ;POCITAT CO SE MA DELAT, JEN 0 AZ 15 INCF PHASE,F ;PRICTU DO REGISTRU PHASE JEDNICKU MOVLW .15 ;DO W REGISTRU DAM 15 XORWF PHASE,W ;A KDYZ TED UDELAM XOR MEZI W REGISTREM A PHASE, VYJDE MI NULA, POKUD JSOU STEJNE ;JE TAM ,W, PROTOZE VYSLEDEK DAVAM DO W REGISTRU, ABYCH SI PHASE REGISTR NEPOSKODIL ;S PHASE REGISTREM TEDY NIC NEDELAM, JEN JEJ TESTUJI, ZDA NENI 15 BTFSC STATUS,Z ;POKUD NEBYL PHASE REGISTR 15, PAK NASLEDUJICI INSTRUKCI PRESKOCIM CLRF PHASE ;PHASE REGISTR BYL 15 A JA CHCI JEN 0 AZ 14 A TO STALE DOKOLA, TAK DAM PHASE=0 MOVF PHASE,W ;TED PHASE REGISTR NAKOPIRUJI DO W REGISTRU ADDWF PCL,F ;W REGISTR (OBSAHUJE TED HODNOTU Z PHASE REGISTRU) PRICTU K PCL REGISTRU GOTO PH_00 ;PCL REGISTR JE DOLNICH 8 BITU CITACE INSTRUKCI A KDYZ JEJ ZMENIM, VLASTNE SKOCIM GOTO PH_01 ;A PROTOZE PCL UKAZUJE VZDY ZA PROVADENOU INSTRUKCI, PRICTENIM NULY SKOCIM HNED ZA GOTO PH_02 ;TAKZE TADY PODLE OBSAHU PHASE SKOCIM NA NEKTERE GOTO GOTO PH_03 ;PRIKLADEM POKUD BYLO PHASE=5, PAK SKOCIM NA GOTO PH_05 GOTO PH_04 GOTO PH_05 GOTO PH_06 GOTO PH_07 GOTO PH_08 GOTO PH_09 GOTO PH_10 GOTO PH_11 GOTO PH_12 GOTO PH_13 GOTO PH_14 ;ROZCESTNIK JE TIMTO KOMPLET, SKOCILO SE DLE REGISTRU PHASE PH_00 ;PRI PHASE ROVNO 0 AZ 6 SE DEJE STALE TOTEZ, MOHL JSEM TEDY SKAKAT JEN NA JEDNO NAVESTI PH_01 ;ALE ABY TO BYLO NAZORNE, UDELAL JSEM VSECHNA PH_00 AZ PH_06 NA STEJNE MISTO PH_02 PH_03 PH_04 PH_05 PH_06 GOTO RETFROMINT ;TADY SKOCIME NA UKONCENI OBSLUHY PRERUSENI, NIC VIC UZ TED NECHCEME PH_07 ;LEFT_BOTTOM MOVLW B'10011001' ;DO W REGISTRU NASTAVIME HODNOTU, ZE CHCEME BRAT VSTUP ADC, KDE MAME LEVE SPODNI ODRAZOVE CIDLO MOVWF ADCON0 ;OBSAH W REGISTRU TED DAME DO ADCON0 REGISTRU A TIM SI VSTUP ADC ZVOLIME GOTO RETFROMINT ;TED UZ SKOCIME DO NAVRATU Z OBSLUHY PRERUSENI S OBNOVENIM TOHO CO JSME POSKODILI PH_08 BSF ADCON0,GO ;V PREDCHOZIM PRERUSENI SE NASTAVILO, KTERY ADC VSTUP CHCEME PREVADET A TED SPUSTIME PREVOD GOTO RETFROMINT ;NIC JINEHO UZ NEDELAME, PREVOD CHVILI TRVA, TAK AZ ZASE V DALSIM PRERUSENI PH_09 ;PROTOZE PRERUSENI PROBIHA KAZDYCH 139 INSTRUKCNICH CYKLU, VIME ZDE S JISTOTOU, ZE PREVOD ADC JE ZDE JIZ HOTOV BSF SENSORS,3 ;NASTAVIME SI BIT SENSORS,3 DO 1 MOVLW .256-.64 ;DO W REGISTRU DAME 256-64, PROTOZE 64 BEREME JAKO MEZ PREKLAPENI CIDLA, ;COZ JE PRI 5V NAPAJENI ZHRUBA 1.25V, COZ JE PRO ODRAZOVE CIDLO TAK AKORAT ADDWF ADRESH,W ;PROTOZE PREVODNIK JE 10BITOVY, MAME NASTAVENO, ZE CHCEME DO ADRESH NEJVYSSICH 8 BITU PREVODU ;A DO ADRESL NEJNIZSI 2 BITY PREVODU, VELKORYSE NEJNIZSI DVA BITY PREVODU OZELIME A BUDEME ;AD PREVODNIK POVAZOVAT JEN ZA OSMIBITOVY A PRACOVAT JEN S ADRESH ;PRICTEME K ADRESH TEDY OBSAH W REGISTRU A POKUD VYSLEDEK PRETECE PRES ROZSAH JEDNOHO BAJTU, ;NASTAVI NAM TO PRIZNAK STATUS,C DO 1. BTFSS STATUS,C ;NASTAVIL SE PRIZNAK STATUS,C DO 1 ? POKUD ANO, NASLEDUJICI INSTRUKCI PRESKOCIME BCF SENSORS,3 ;STATUS,C JE 0, TEDY ZNULUJEME SENSORS,3 ;NYNI MAME V BITU SENSORS,3 STAV LEVEHO SPODNIHO ODRAZOVEHO CIDLA A VLASTNI APLIKACE SI JEJ MUZE CIST. ;RIGHT_BOTTOM MOVLW B'10000001' ;NASTAVIME SE NA PRAVE SPODNI ODRAZOVE CIDLO A VSECHNO SE DALE DEJE STEJNE JAKO PRO LEVE MOVWF ADCON0 ;ADC NYNI BUDE BRAT HODNOTU Z PRAVEHO SPODNIHO ODRAZOVEHO CIDLA GOTO RETFROMINT ;DALE NEVYZADUJE KOMENTAR, JE TO STEJNE JAKO VYSE PH_10 BSF ADCON0,GO GOTO RETFROMINT PH_11 BSF SENSORS,2 ;JEN S TIM ROZDILEM, ZE VYSLEDEK PREVODU DAVAME DO BITU SENSORS,2 MOVLW .256-.64 ADDWF ADRESH,W BTFSS STATUS,C BCF SENSORS,2 ;SFH5110 MOVLW B'10001001' ;PREPNEME ADC STEJNE JAKO VYSE, NYNI OVSEM NA VSTUP ADC, KAM PRIVADIME SIGNAL Z SFH5110 MOVWF ADCON0 GOTO RETFROMINT PH_12 BSF ADCON0,GO GOTO RETFROMINT PH_13 BTFSC IR_LEFT_RIGHT,4 ;NYNI POSOUDIME, ZDA JSME BLIKALI LEVOU CI PRAVOU IR LED, ABYCHOM VEDELI ;ZDA SE IR SVETLO ODRAZELO (POKUD SE ODRAZELO) OD LEVE CI PRAVE PREKAZKY GOTO PH13R ;BLIKALO SE PRAVOU IR LED, SKOCIME SI NA PH13R BSF SENSORS,1 ;NASTAVIME BIT SENSORS,1 NEJPRVE DO JEDNICKY MOVLW .128 ;W REGISTR DAME DO POLOVINY ROZSAHU, TEDY DO 128 ADDWF ADRESH,W ;PRICTEME K W REGISTRU VYSLEDEK ADC PREVODU BTFSS STATUS,C ;A POKUD PO SECTENI JE VYSLEDEK VETSI NEZ 255, TEDY PRES ROZSAH BAJTU, PRESKOCIME NASLEDUJICI INSTRUKCI BCF SENSORS,1 ;ROZSAH BAJTU PREKROCEN NEBYL, ZNULUJEME BIT SENSORS,1 ;NYNI MAME V SENSORS,1 ZDA BYL ODRAZ OD LEVE PREKAZKY PRED ROBOTEM CI NIKOLI GOTO RETFROMINT ;OBSLUHA PRERUSENI UZ MUZE SKONCIT PH13R BSF SENSORS,0 ;TOTEZ JAKO VYSE, JEN PRO PRAVOU PREKAZKU PRED ROBOTEM MOVLW .128 ADDWF ADRESH,W BTFSS STATUS,C BCF SENSORS,0 ;TED UZ VIME, ZDA JE PREKAZKA VLEVO PRED ROBOTEM ;POKUD JSOU BITY SENSORS,0 I SENSORS,1 OBA V 0, PAK JE PREKAZKA PRIMO PRED ROBOTEM ;POKUD JSOU OBA BITY V 1, PAK NEVIDIME ZADNOU PREKAZKU ;VSECHNA CIDLA FUNGUJI TAK, ZE POKUD MAJI ODRAZ, JE PRISLUSNY BIT V REGISTRU SENSORS NULOVY GOTO RETFROMINT ;TED SE MUZEME VRATIT Z OBSLUHY PRERUSENI PH_14 ;PREHOD BLIKANI NA DRUHOU IR LED MOVLW B'00010000' ;NASTAVIME SI DO W REGISTRU, ZE SE MA ROZSVECET PRAVA IR LED BTFSC IR_LEFT_RIGHT,4 ;PODIVAME SE, KTEROU IR LED JSME BLIKALI (ROZSVECELI, ZHASEJI SE VZDY OBE) V PREDCHOZIM KOLE PRERUSENI MOVLW B'00000100' ;A POKUD SE TOTO PROVEDE, PAK SE MA NYNI ROZSVECET LEVA IR LED MOVWF IR_LEFT_RIGHT ;W REGISTR TED OBSAHUJE TO, CO SE MA PRI ROZSVECENI IR LED KOPIROVAT NA PORTA ;A TAK TO ULOZIME DO REGISTRU IR_LEFT_RIGHT A PODLE NEJ BUDE PRISTE BLIKAT LEVA CI PRAVA IR LED ;GOTO RETFROMINT ;OD OBSLUHY PRERUSENI VICE NECHCEME, SKOCIME NA UKONCENI S NAVRACENIM HODNOT ;PROTOZE ALE NAVESTI RETFROMINT JE TED PRIMO NASLEDUJICI INSTRUKCE, JE ZBYTECNE SKAKAT ;A PROGRAM TAM BUDE I TAK POKRACOVAT - PROTO JE TO GOTO RETFROMINT ZAREMOVANO RETFROMINT ;VRATIT WREG A STATUS REG - OBNOVIT KONTEXT SWAPF STATUS_TMP,W ;STATUS_TMP OBSAHUJE STATUS REGISTR PRED PRERUSENIM, OVSEM S VYMENENYMI HORNIMI A DOLNIMI BITY ;TEDY JE OTOCIME ZPET A DAME TO DO W REGISTRU MOVWF STATUS ;W REGISTR DAME DO STATUS REGISTRU A STATUS JE TED STEJNY, JAKO BYL PRED OBSLUHOU PRERUSENI SWAPF W_TMP,F ;TED OVSEM NESMIME STATUS REGISTR POSKODIT, TAKZE POUZIJEME INSTRUKCI SWAPF, KTERA STATUS NEOVLIVNI ;W_TMP TED OBSAHUJE STAV W REGISTRU PRED OBSLUHOU PRERUSENI A MA PREHOZENY DOLNI A HORNI 4 BITY SWAPF W_TMP,W ;A TED KONECNE VRATIME DO W REGISTRU CO TAM BYLO PRED OBSLUHOU PRERUSENI RETFIE ;INSTRUKCE NAVRATU Z PRERUSENI, SKACE SE ZPET DO VLASTNI APLIKACE. SEND ;VYSLE SERIAKEM OBSAH W REGISTRU BTFSC ASYNCFLAGS,4 ;UZ BYL VYRESEN PREDCHOZI POZADAVEK NA VYSILANI, TEDY ZNULOVAL SE ASYNCFLAGS,4 ? GOTO $-1 ;JESTE NE, SKOCIM ZPET A CEKAM AZ BUDE ZNULOVAN, TEDY PREDCHOZI VYSILANI HOTOVO MOVWF TXBYTE ;DO TXBYTE VLOZIM OBSAH W REGISTRU, TEDY CO CHCI VYSLAT BSF ASYNCFLAGS,4 ;NASTAVIM BIT ASYNCFLAGS,4 DO 1, TEDY ZE SE MA VYSLAT TO CO JSEM VLOZIL DO TXBYTE RETURN ;NAVRAT Z PODPROGRAMU RECEIVE ;CEKA NA PRIJEM A PRIJATY BYTE DA DO W REGISTRU BTFSS ASYNCFLAGS,1 ;BIT ASYNCFLAGS SE NASTAVI DO 1 V OKAMZIKU, KDY SE NECO PRIJALO GOTO $-1 ;SKAKEJ ZPET, DOKUD SE ASYNCFLAGS,1 NENASTAVI DO 1, ZE SE NECO PRIJALO MOVF RXBYTE,W ;RXBYTE NYNI OBSAHUJE PRIJATY BYTE ZE SERIOVEHO PORTU BCF ASYNCFLAGS,1 ;ASYNCFLAGS,1 SMAZU, UZ JSEM SI VZAL CO SE PRIJALO BCF ASYNCFLAGS,2 ;POKUD JSEM SI NEVYZVEDL BYTE PRIJATY SERIOVYM PORTEM NEZ PRISEL DALSI, ;NASTAVIL SE BIT ASYNCFLAGS,2 DO 1 ;ZDE TUTO SITUACI POMIJIM A JEN BIT NULUJI RETURN ;NAVRAT Z PODPROGRAMU START MOVLW B'00010100' ;DAM DO W REGISTRU NASTAVENI JEDNOTLIVYCH VYSTUPNICH PINU PORTA MOVWF PORTA ;W REGISTR VLOZIM DO PORTA REGISTRU A TIM SI VYSTUPY NASTAVIM MOVLW B'00000100' ;DAM DO W REGISTRU NASTAVENI JEDNOTLIVYCH VYSTUPNICH PINU PORTB MOVWF PORTB ;W REGISTR VLOZIM DO PORTB REGISTRU A TIM SI VYSTUPY NASTAVIM MOVLW B'10000001' ;DO W REGISTRU VLOZIM HODNOTU PRO ADCON0 REGISTR MOVWF ADCON0 ;ULOZIM JI DO ADCON0 REGISTRU BANK1 ;PREPNU SI BANKU REGISTRU, TY KTERE BUDU DALE NASTAVOVAT JSOU V BANCE 1 MOVLW B'00000100' ;DO W REGISTRU VLOZIM HODNOTU PRO ADCON1 REGISTR MOVWF ADCON1 ;ULOZENIM HODNOT DO ADCON0 A ADCON1 JSEM SI NASTAVIL VSTUPY DO ADC ;TAKTOVANI ADC=FOSC/32, ZAROVNANI VLEVO, ANALOGOVE VSTUPY JSOU AN0,AN1,AN3, REFERENCNI NAPETI JE NAPAJENI MOVLW B'11101011' ;DAM DO W REGISTRU DO BITU HODNOTU 1 TAM, KDE CHCI MIT NA PORTA VSTUPY A 0 KDE CHCI MIT VYSTUPY MOVWF TRISA ;W REGISTR VLOZIM DO PORTA REGISTRU A TIM SI NASTAVIM CO JE VSTUP A CO VYSTUP NA PINECH PORTA ;AZ NYNI SE NA VYSTUPNICH PINECH PORTU A FYZICKY OBJEVI HODNOTA VLOZENA DO PORTA MOVLW B'11000010' ;DAM DO W REGISTRU DO BITU HODNOTU 1 TAM, KDE CHCI MIT NA PORTB VSTUPY A 0 KDE CHCI MIT VYSTUPY MOVWF TRISB ;W REGISTR VLOZIM DO PORTB REGISTRU A TIM SI NASTAVIM CO JE VSTUP A CO VYSTUP NA PINECH PORTB ;AZ NYNI SE NA VYSTUPNICH PINECH PORTU B FYZICKY OBJEVI HODNOTA VLOZENA DO PORTB MOVLW B'00001000' ;DAM DO W REGISTRU HODNOTU PRO OPTION REGISTR MOVWF OPTION_REG ;VLOZIM W DO OPTION REGISTRU A TIM SI POVOLIM PULL-UP ODPORY NA VSTUPECH PORTUB ;TAKTOVACI KMITOCET PODELENY 4 TAKTUJE TIMER0, TEDY KAZDY INSTRUKCNI CYKLUS SE TIMER0 ZVYSI O 1 BANK0 ;PREPNU SI BANKU REGISTRU, TY KTERE BUDU DALE NASTAVOVAT JSOU V BANCE 0 CLRF ASYNCBIT_RX ;VYNULUJI POCITADLO BITU ZE SERIOVEHO PORTU MOVLW B'00000100' ;DO W REGISTRU DAM HODNOTU, KTERA ZNAZORNUJE ROZSVICENI LEVE IR LED PRI VLOZENI DO PORTA MOVWF IR_LEFT_RIGHT ;W REGISTR VLOZIM DO IR_LEFT_RIGHT REGISTRU, JAKO POCATECNI STAV JEHO HODNOTY MOVLW B'11111111' ;VLOZIM DO W REGISTRU HODNOTU, KTERA VYPOVIDA O STAVU SENZORU MOVWF SENSORS ;VLOZIM OBSAH W REGISTU DO SENSORS REGISTRU, A RIKAM TIM, ZE ZADNY SENZOR ZATIM NIC NEDETEKUJE MOVWF RXBUF ;VLOZIM HODNOTU SAMYCH JEDNICEK JAKO POCATECNI HODNOTU DO RXBUF REGISTRU, ;KTERY SLOUZI PRO PRIJEM ZE SERIOVE LINKY CLRF ASYNCFLAGS ;SMAZU VSECHNY BITY HLASICI A OVLADAJICI SOFTWAROVY SERIOVY PORT CLRF TXCNT ;VYNULUJI POCITADLO ODESILANYCH BITU SERIOVYM PORTEM CLRF MOTORS_PHASE ;VYNULUJI POCITADLO PRO GENEROVANI PWM NA PINECH OVLADANI MUSTKU MOTORU CLRF MOTORS ;VYNULUJI STAV MOTORU, TEDY MOTORY BUDOU NYNI STAT CLRF INTCNT ;VYNULUJI POCITADLO PRERUSENI CLRF PHASE ;VYNULUJI POCITADLO, URCUJICI CO SE MA PRI KTEREM PRERUSENI ODEHRAT ;NASTAVIT PRERUSENI CASOVACEM ;VESKERE OBSLUZNE ZALEZITOSTI SE DEJI V PRERUSENI OD TIMER0 CLRF TMR0 ;VYNULUJI HODNOTU TIMERU0, ABY JEL OD ZACATKU BCF INTCON,TMR0IF ;SMAZU BIT, KTERY URCUJE, ZE JIZ TIMER0 PRETEKL MAXIMALNI HODNOTU BSF INTCON,TMR0IE ;POVOLIM PRERUSENI PRI PRETECENI HODNOTY V TMR0, TEDY KDYZ TIMER0 DOJEL NA KONEC - TIKNUL BSF INTCON,GIE ;POVOLIM GLOBALNI PRERUSENI A OD TED MUZE TIMER0 PRETECENIM HODNOTY V TMR0 VYVOLAVAT PRERUSENI ;=====VLASTNI APLIKACE===== ;ODTUD MUZETE PSAT VLASTNI KOD ;NYNI SE VSECHNY CINOSTI SPOJENE S OVLADANIM PERIFERII DEJI V PRERUSENI ;MOHU TADY RESIT JEN VECI SOUVISEJICI SE SAMOTNYM CHOVANIM CELEHO SYSTEMU ;JE POTREBA SI UVEDOMIT, ZE SE HODNOTY SPOJENE S OBSLUHOU PRERUSENI MOHOU BEHEM PROVADENI PROGRAMU SAMOVOLNE MENIT ;POKUD NAPRIKLAD PRACUJEME SE STAVY SENZORU, TEDY REGISTREM SENSORS NA VICE MISTECH V PROGRAMU, JE BUD NUTNE SI ;JEHO STAV NAKOPIROVAT DO SVEHO REGISTRU A PAK JEJ VYHODNOCOVAT A NEBO POCITAT S JEHO ZMENAMI BEHEM DALSI PRACE S NIM ;TENTO PROGRAM POUZE ODESLE STAV SENZORU A CEKA NA ZADANI HODNOTY SERIOVYM PORTEM ;PO JEJIM OBDRZENI TUTO HODNOTU NASTAVI JAKO STAV PWM MOTORU ;TAK JAK PROGRAM JE, JE TEDY VHODNY NAPRIKLAD PRO OVLADANI ROBOTU SERIOVOU LINKOU Z PC ;ZISKAVAME TEDY STAVY SENZORU PO SERIOVE LINCE A NA JEJICH ZAKLADE MUZEME NASTAVOVAT RYCHLOST A SMER OTACENI MOTORU ;PROTOZE PRERUSENI PROBIHA VELICE CASTO A JEHO OBSLUHA JE POMERNE SLOZITA ;ZABIRA OBSLUHA PRERUSENI ZNACNOU CAST VYPOCETNIHO VYKONU ;NAHRAZENIM TETO CASTI KODU LZE APLIKOVAT VLASTNI INTELIGENCI ROBOTU, TEDY CHOVANI V ZAVISLOSTI NA STAVU CIDEL ;A TO I BEZ OVLADANI PO SERIOVE LINCE ;PONECHANIM PROGRAMU JAK JE SE STAVA Z TOHOTO POUZE SENZOROVA A MOTOROVA CAST ROBOTU A JE NUTNO JI CIST A OVLADAT ;SERIOVOU LINKOU NADRIZENEHO POCITACE NEBO MCU LOOP MOVF SENSORS,W ;DAM CO NABRALY SENZORY DO W REGISTU CALL SEND ;A ODESLU TO SERIOVYM PORTEM CALL RECEIVE ;PRIJMU BAJT DO W REGISTRU MOVWF MOTORS ;CO SE PRIJALO DAM DO MOTORS A NASTAVIM TIM PWM PRO MUSTKY GOTO LOOP ;SKOCIM ZPET NA PRIJEM BAJTU ;MNOHO USPECHU VAM PREJE AUTOR ;KONEC MISTA PRO PSANI VLASTNIHO KODU ;=====KONEC VLASTNI APLIKACE===== ;END JE INFORMACE PRO KOMPILATOR, ZE TO JE VSECHNO END