Printrutin för 16F690 kan inte fås fungera på 16F676
Postat: 1 december 2010, 10:41:24
Har ett fungerande program för en 16F690 som skriver ut Hello world till ett PC terminalprogram vis PC serieporten. Kör det i Low Pin count demokortet. Samma program vägrar att fungera på en 16F676. Här skrivs bara skräptecken ut. Använder terminalprogrammet Realterm:serial capture and binary terminal med samma inställningar i båda fallen 9600 baud 8N1. Och med 676 indikeras error i Realterm förutom att tecken mottages. Enligt databladen är båda default klockfrekvenserna 4 MHz. En simulering i MPLAB sim ger samma resultat på TX pinnen för båda programmen. Så jag förstår ingenting. Samma hårdvara samma programdelar bara specifika PIC skiljer. Både det på 16F690 fungerande programmet och den icke fungerande 16F676 implementeringen listas nedan
Kod: Markera allt
include <p16f690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
BAUD EQU .39
BAUD1 EQU .30
BAUDX EQU .29
BAUDY EQU .30
BAUDS EQU .32
cblock 0x20
XmtReg
Count
DlyCnt
offset
W_temp
endc
org 0
main
BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTC ;Init PORTC
BSF STATUS,RP1 ;BANK 2
CLRF ANSEL
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1
MOVLW b'11010000' ;Set RC5 as output and all DS to output
MOVWF TRISC ;
BCF STATUS,RP0 ;Bank 0
bsf PORTC,5
clrf offset
loop
Call HelloWorld
goto loop
HelloWorld
nextchar
movlw HIGH Text
movwf PCLATH
movf offset,0
Call Text
Call Printbyte
incf offset,1
movf offset,0
sublw .13
btfsc STATUS,Z
goto break
goto nextchar
break
clrf offset
return
Printbyte
movwf W_temp
movwf XmtReg
Xmtr
movlw 8
movwf Count
bcf PORTC,5
Call Delay1
X_next
bcf STATUS,C
rrf XmtReg,1
btfsc STATUS,C
bsf PORTC,5
btfss STATUS,C
bcf PORTC,5
Call DelayX
Decfsz Count,1
goto X_next
X_stop
bsf PORTC,5
Call DelayS
movf W_temp,0
return
DelayS
movlw BAUDS
goto SAVE
DelayY
movlw BAUDY
goto SAVE
DelayX
movlw BAUDX
goto SAVE
Delay1
movlw BAUD1
goto SAVE
Delay
movwf BAUD
SAVE
movwf DlyCnt
redo_1
decfsz DlyCnt,1
goto redo_1
return
org 0x300
Text
addwf PCL,1
retlw 'H'
retlw 'e'
retlw 'l'
retlw 'l'
retlw 'o'
retlw ' '
retlw 'W'
retlw 'o'
retlw 'r'
retlw 'l'
retlw 'd'
retlw '\r'
retlw '\n'
end
Kod: Markera allt
include <p16f676.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _BODEN_OFF )
BAUD EQU .39
BAUD1 EQU .30
BAUDX EQU .29
BAUDY EQU .30
BAUDS EQU .32
cblock 0x20
XmtReg
Count
DlyCnt
offset
W_temp
endc
org 0
main
bcf STATUS,RP0 ;Bank 0
clrf PORTC ;Init PORTC
bsf STATUS,RP0 ;Bank 1
clrf ANSEL ;digital I/O
MOVLW b'11010000' ;Set RC5 as output and all DS to output
movwf TRISC
bcf STATUS,RP0 ;Bank 0
bsf PORTC,5
clrf offset
loop
Call HelloWorld
goto loop
HelloWorld
nextchar
movlw HIGH Text
movwf PCLATH
movf offset,0
Call Text
Call Printbyte
incf offset,1
movf offset,0
sublw .13
btfsc STATUS,Z
goto break
goto nextchar
break
clrf offset
return
Printbyte
movwf W_temp
movwf XmtReg
Xmtr
movlw 8
movwf Count
bcf PORTC,5
Call Delay1
X_next
bcf STATUS,C
rrf XmtReg,1
btfsc STATUS,C
bsf PORTC,5
btfss STATUS,C
bcf PORTC,5
Call DelayX
Decfsz Count,1
goto X_next
X_stop
bsf PORTC,5
Call DelayS
movf W_temp,0
return
DelayS
movlw BAUDS
goto SAVE
DelayY
movlw BAUDY
goto SAVE
DelayX
movlw BAUDX
goto SAVE
Delay1
movlw BAUD1
goto SAVE
Delay
movwf BAUD
SAVE
movwf DlyCnt
redo_1
decfsz DlyCnt,1
goto redo_1
return
org 0x300
Text
addwf PCL,1
retlw 'H'
retlw 'e'
retlw 'l'
retlw 'l'
retlw 'o'
retlw ' '
retlw 'W'
retlw 'o'
retlw 'r'
retlw 'l'
retlw 'd'
retlw '\r'
retlw '\n'
end