Jsem našel dva programy pro hodiny a na sériový přenos dat do PC a potřeboval bych je spojit v jedno aby hodiny šly a po stisku tlačítka byl ten aktuální čas přenesen pomocí seriového portu do PC přikládám zdrojový kód
Kód: Vybrat vše
; Zakladni nastaveni procesoru PIC16F628 (10.7.2003)
;**************************************************************************
;* http://www.cmail.cz/doveda *
;**************************************************************************
;* PIC16F628 *
;* --------\/-------- *
;* -|RA2 RA1|- *
;* -|RA3 RA0|- *
;* -|RA4ck osc1|- \ Krystal 4,00MHz *
;* +5V -|MCLR osc2|- / *
;* 0V -|Vss Vdd|- +5V *
;* -|RB0/INT PGD/RB7|- *
;* -|RB1/Rx PGC/RB6|- *
;* -|RB2/Tx RB5|- *
;* -|RB3 PGM/RB4|- *
;* ------------------ *
;* DOVEDA BOYS (c) 1997-2003 *
;**************************************************************************
list p=16f628A, R=DEC
include "p16f628A.inc"
W EQU D'0'
F EQU D'1'
W_save equ 30h ; zaloha pri preruseni
Sta_sav equ 31h ; zaloha pri preruseni
PCL_sav equ 32h ; zaloha pri preruseni
FSR_sav equ 33h ; zaloha pri preruseni
dataL equ 35h
CISLO equ 34h
;BLOK RAM PAMĚTI
#define RAM_Start 20h
CBLOCK RAM_Start
RAM ; prvni adresa pameti RAM pro PIC16F628 - 224bajtu (20h-7Fh)
TMP_W ; temp preruseni
TMP_S ; temp preruseni
TMP_PCL
TMP0 ; pomocny MP1 ; pomocny registr
TMP2 ; pomocny registr
EE_ADR ; pomocný registr zápisu a čtení EEPROM
EE_DATA
MIN
HOD
SEC
TMR
endc
#define Q_OUT1 PORTA,0 ; vystup 1
#define Q_OUT2 PORTA,1 ; vystup 2
#define Q_OUT3 PORTA,2 ; vystup 3
#define Q_OUT4 PORTA,3 ; vystup 4
#define Q_OUT5 PORTA,4 ; vystup 5
org 0x2007 ; adresa nastaveni pojistek pro PIC16F627 a PIC16F628
dw _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _HS_OSC
; _BODEN_OFF & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _HS_OSC {default)
; typ oscilatoru
; _LP_OSC EQU H'3FEC'
; _XT_OSC EQU H'3FED'
; _HS_OSC EQU H'3FEE'
; _ER_OSC_CLKOUT EQU H'3FFF'
; _ER_OSC_NOCLKOUT EQU H'3FFE'
; _INTRC_OSC_CLKOUT EQU H'3FFD'
; _INTRC_OSC_NOCLKOUT EQU H'3FFC'
; _EXTCLK_OSC EQU H'3FEF'
; Code Protect (ochrana proti precteni)
; _CP_ALL EQU H'03FF'
; _CP_75 EQU H'17FF'
; _CP_50 EQU H'2BFF'
; _CP_OFF EQU H'3FFF'
; Power Up Timer (casovac pro nabeh napeti 72ms)
; _PWRTE_ON EQU H'3FF7'
; _PWRTE_OFF EQU H'3FFF'
; WatchDog (hlidaci pes)
; _WDT_ON EQU H'3FFF'
; _WDT_OFF EQU H'3FFB'
; _BODEN_ON EQU H'3FFF'
; _BODEN_OFF EQU H'3FBF'
; _LVP_ON EQU H'3FFF'
; _LVP_OFF EQU H'3F7F'
; _MCLRE_ON EQU H'3FFF'
; _MCLRE_OFF EQU H'3FDF'
;************************ Nastavení dat v EEPROM **************************
org 0x2100 ; tabulka v pameti EEPROM (128 bytu)
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
de 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
;************************ Reset procesoru *************************
org 0x0000 ; zacatek programu
goto INIT ; skok na pocatecni inicializaci
org 0x0004 ; vektor preruseni
goto PRERUS
;**************************************************************************
;* preruseni *
;**************************************************************************
PRERUS movwf TMP_W ; (ulozeni hodnot registru W a STATUS)
movf STATUS,W ; prohodi nibble STATUS a ulozi do W
clrf STATUS ; nastaveni banky 0
movwf TMP_S ; ulozit STATUS
movf PCLATH,W
movwf TMP_PCL
clrf PCLATH ; nastaveni banky 0
; ------------------------
bcf INTCON,T0IF ; vynulovat priznak preruseni (pretekl casovac TMR0)
;-------------------------------
MOVLW 4 ; první proměnnná menšitele
MOVWF TMR0
INCF TMR,1
MOVFW TMR
;Při krystalu 20 MHz 155 a při 4 MHz 31 druhá část menšitele
XORLW 31 ;31 155 druhá proměnná menšitele
BTFSS 03,2 ; aktuální nastavení má odchylku 0,000432s , tzn. za jeden den se čas
GOTO CAS_1 ; odchýlí od skutečnosti o 37,3 sekundy , za měsíc to činí 18,6 minuty
CLRF TMR ; toto velmi jemné donastavení můžeš provést kapacitním trimrem u krystalu
INCF SEC,1 ; A PŘEDEVŠÍM SI VŠIMNI , JAK SE PÍŠOU POZNÁMKY !
MOVFW SEC
XORLW 60
BTFSS 03,2
goto CAS
CLRF SEC
INCF MIN,1
MOVFW MIN
XORLW 60
BTFSS 03,2
GOTO CAS
CLRF MIN
INCF HOD,1
MOVFW HOD
XORLW 24
BTFSC 03,2
CLRF HOD
goto CAS_1
CAS
MOVLW 132
CAS_1
;------------------------------- (obnovení hodnot registru W a STATUS)
INT_END movf TMP_PCL,W
movwf PCLATH ; obnova PCLATH
movf TMP_S,W ; prohodi nibble TMP_S a ulozi do W
; swapf TMP_S,W ; prohodi nibble TMP_S a ulozi do W
movwf STATUS ; obnova STATUS
swapf TMP_W,F ; prohodi nibble TMP_W a ulozi do W
swapf TMP_W,W ; obnova W
retfie
;************************ Inicializace procesoru *************************
INIT
movlw b'00000'
movwf PORTA
movlw b'00000000'
movwf PORTB
movlw b'00000111' ; digitalni vstupy na PORTu A (PIC16F627 a 628)
movwf CMCON
; ------------------------
bcf STATUS,RP1
bsf STATUS,RP0 ; banka registru 1
movlw b'11111' ; portA 4-0, 5*vstupy
movwf TRISA
movlw b'11010110' ; PULL-UPy OFF, preddelic=1:128 pripojen k TMR0
movwf OPTION_REG ;
movlw b'11111011' ; portB 7-0, 7*vstupy, 1*vystupy
movwf TRISB
bcf STATUS,RP0 ; banka registru 0
; ------------------------
movlw b'10100000' ; povolena všechna přerušení a od přetečení TMR0
movwf INTCON
bsf INTCON,T0IE; 1=povoleno přerušení při přetečení TMR0
; bsf INTCON,INTE ; 1=povoleno přerušení z portu RB0/INT
; bsf INTCON,GIE ; 1=povolena všechna nemaskovaná přerušení
; !!! zde napiste vynulovani a nastaveni promenych !!!
clrf MIN
clrf HOD
clrf SEC
clrf TMR
MOVLW 4 ; pre-set timeru
MOVWF TMR0
goto MAIN
;************************ Hlavní program *************************
MAIN
call auart
; !!! zde napiste vlasni hlavní program !!!
nop
goto MAIN
;************************ PIC16F628 *************************
READ bsf STATUS,RP0 ; banka 1 !!! nastav EE_ADR !!!
movf EE_ADR,W
movwf EEADR
bsf EECON1,RD ; cteni EEPROM
movf EEDATA,W ; nactena data z pameti EEPROM do registru W
bcf STATUS,RP0 ; banka 0
;-------------------------------
return ; !!! data v registru W !!!
;************************ PIC16F628 *************************
WRITE bsf STATUS,RP0 ; banka 1 !!! nastav EE_ADR !!!
movwf EEDATA ; prepsat W -> EEDATA
movf EE_ADR,W
movwf EEADR
bsf EECON1,WREN ; povolit zapis do EEPROM
bcf INTCON,GIE ; zakazat vsechna preruseni
; ------------------------; aktivace zapisu
movlw 0x55 ; odblokovani zapisu (povinna povolovaci sekvence)
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR ; spustit zapis
; ------------------------; konec aktivace
bsf INTCON,GIE ; povolit vsechna preruseni
btfsc EECON1,WR ; pockat na konec zapisu
goto $-1 ; =1
bcf EECON1,WREN ; zakazat zapis do EEPROM
bcf STATUS,RP0 ; banka 0
;-------------------------------
return
;-----------------------------Seriovy prenos-----------------------------
;************************ Konec programu *************************
auart
; --------------------------------
; SET ANALOG/DIGITAL INPUTS PORT A
; --------------------------------
;
movlw 7
movwf CMCON ; CMCON=7 set comperators off
;
; ----------------
; INITIALIZE PORTS
; ----------------
;
movlw b'00000000' ; set up portA
movwf PORTA
movlw b'00000100' ; RB2(TX)=1 others are 0
movwf PORTB
bsf STATUS,RP0 ; RAM PAGE 1
movlw 0xFF
movwf TRISA ; portA all pins input
movlw b'11110010' ; RB7-RB4 and RB1(RX)=input, others output
movwf TRISB
; ------------------------------------
; SET BAUD RATE TO COMMUNICATE WITH PC
; ------------------------------------
; Boot Baud Rate = 9600, No Parity, 1 Stop Bit
;
movlw 0x19 ; 0x19=9600 bps (0x0C=19200 bps)
movwf SPBRG
movlw b'00100100' ; brgh = high (2)
movwf TXSTA ; enable Async Transmission, set brgh
bcf STATUS,RP0 ; RAM PAGE 0
movlw b'10010000' ; enable Async Reception
movwf RCSTA
;
; ------------------------------------
; PROVIDE A SETTLING TIME FOR START UP
; ------------------------------------
;
clrf dataL
settle decfsz dataL,F
goto settle
movf RCREG,W
movf RCREG,W
movf RCREG,W ; flush receive buffer
;
; ---------
; MAIN LOOP
; ---------
;
call message ; send "16F628 alive"
loop call receive ; wait for a char
call send ; send the char
goto loop
;
; -------------------------------------------
; RECEIVE CHARACTER FROM RS232 AND STORE IN W
; -------------------------------------------
; This routine does not return until a character is received.
;
receive btfss PIR1,RCIF ; (5) check for received data
goto receive
movf RCREG,W ; save received data in W
return
;
; -------------------------------------------------------------
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING
; -------------------------------------------------------------
;
send movwf TXREG ; send data in W
TransWt bsf STATUS,RP0 ; RAM PAGE 1
WtHere btfss TXSTA,TRMT ; (1) transmission is complete if hi
goto WtHere
bcf STATUS,RP0 ; RAM PAGE 0
return
;
; -------
; MESSAGE
; -------
;
message movlw '1'
call send
movlw '6'
call send
movlw 'F'
call send
movlw '6'
call send
movlw '2'
call send
movlw '8'
call send
movlw ' '
call send
movlw 'a'
call send
movlw 'l'
call send
movlw 'i'
call send
movlw 'v'
call send
movlw 'e'
call send
movlw 0x0D ; CR
call send
movlw 0x0A ; LF
call send
return
END
ale vyhazuje mě to toto
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
kde dělám chybu? díky.