EUSART på 16F887 jävlas

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

EUSART på 16F887 jävlas

Inlägg av ToPNoTCH »

Begriper inte vad jag gör för fel.

Jag får inte in några tecken med EUSART Asynchronus reception

RCREG är konstant tomt, men trots detta går interupten hög (RCIF).

Dessutom får jag OERR för varje tecken som går in.

Det känns som baudrate problem, men jag har kollat värdena upprepade gånger och
kör jag Transmit med samma riggning av baudgeneratorn funkar det fint.

uC'n går i 8 MHz

Snälla !

Kod: Markera allt

	list      p=16f887
	#include <p16F887.inc>
	__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
	errorlevel -302
;############## Definitioner ###############################
	#define E	PORTC,7
w_temp		EQU	0x7D		; variable used for context saving
status_temp	EQU	0x7E		; variable used for context saving
pclath_temp	EQU	0x7F		; variable used for context saving

;################# Gå till start ###########################
	ORG		0x000         ; processor reset vector
	goto	start         ; go to beginning of program
;################# ISR #####################################
	ORG		0x004			; interrupt vector location
	movwf	w_temp			; save off current W register contents
	movfw	STATUS			; move status register into W register
	movwf	status_temp		; save off contents of STATUS register
	movfw	PCLATH			; move pclath register into W register
	movwf	pclath_temp		; save off contents of PCLATH register
	banksel	PIR1
	bcf		PIR1,5			; Clear RCIF flag
	movfw	RCREG
	retfie					; return from interrupt
;############## Konfigurera PIC ############################
	cblock	0x20
	d1
	d2
	d3
	dataL
	endc
start:
	banksel PORTC
	clrf	PORTC
	banksel	TRISC
	movlw	b'10111111'		;Sätter PORTC till output
	movwf	TRISC
;######## Interrupt på RECIEVE ########
	banksel	INTCON			
	movlw	b'00000000'
	movwf	INTCON
	banksel	PIE1
	movwf	b'00100000'
	movwf	PIE1
;######### BAUD 2400  #########
	banksel	SPBRGH
	movlw 	b'00000000'    ; brgh = 0
	movwf	SPBRGH
	banksel	SPBRG
	movlw	b'00110011'	; 51 = 2,403.85 (2400 -0.1%)
	movwf	SPBRG
	banksel	TXSTA
	bcf		TXSTA,2		; Sätt BRGH
	banksel	BAUDCTL
	bsf		BAUDCTL,3	; Sätt BRG16
;######### Enable #########
	banksel	RCSTA
	movlw	b'10010000'
	movwf	RCSTA

	clrf	dataL 
settle:
	decfsz	dataL,F 
	goto	settle 

	movf	RCREG,W 
	movf	RCREG,W 
	movf	RCREG,W			; flush receive buffer


	
Main:
	call	Delay1000
	banksel	RCSTA
	btfsc	RCSTA,1
	goto	rcv_err
	goto	Main

rcv_err:
	bcf		RCSTA,4
	bcf		RCSTA,1
	bsf		RCSTA,4
	goto	Main


Delay1000:
			;19998 cycles
	movlw	0x9F
	movwf	d1
	movlw	0x10
	movwf	d2
Delay_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	Delay_0

			;2 cycles
	goto	$+1
	return
	END
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: EUSART på 16F887 jävlas

Inlägg av sodjan »

Felkopplat ?
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

Re: EUSART på 16F887 jävlas

Inlägg av ToPNoTCH »

Det är ju aldrig uteslutet :roll:

Men det är inte särskilt många kopplingar i mitt försök.

En sändande 12F683 som via 1K är kopplad till RX på 16F887.

Sändaren skickar en "1" en gång i sekunden och sätter jag en terminal itället för 16F887/RX så ploppar tecknet upp fint.

Har även provat att sända inverterat men det blev samma resultat (OERR biten sätts när tecknet når 16F887)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: EUSART på 16F887 jävlas

Inlägg av sodjan »

OERR betyder att du har fyllt mottagningsbufferten utan att läsa
från den (2 eller 3 tecken). Vid baudrate problem får man ofta FERR
istället.

Jag ser inte att du enablar interrupt (GIE=1).

Din ISR verkar inte återställa context.

Skriv om utan interrupt eller se till att interrupt fungerar.
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

Re: EUSART på 16F887 jävlas

Inlägg av ToPNoTCH »

Framgång.

SPBRGH = 0
SPBRG =51

Ger inte 2400 i baudrate om man sätter BRG16 :humm:

Med SPBRG på 207 hoppade det igång.

Helt otroligt att man inte kan få rätt på tre små värden :roll:

Nu pollar jag manuellt utan interrupt, som inte vill lira.

Jag jävlas vidare med interrupten och postar om jag kör fast med den.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: EUSART på 16F887 jävlas

Inlägg av sodjan »

OK, kul att det "fungerar", men du kan väl svara på frågorna, eller ?
Var slog du på GIE (eller missade jag bara det) ?
Och hur var det med återställandet av context i ISR'en ?
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

Re: EUSART på 16F887 jävlas

Inlägg av ToPNoTCH »

Du såg helt rätt GIE var av, och context spardes undan snyggt och återställdes aldrig :lol:

Som vanligt när man kladdar så kopierar man koden i ett läge när man bara "testar något"
Jag hade glömt att slå tillbaka GIE'n (och GPIE). Dock var återställningen av context helt missad (tack för att du såg det).

Nu funkar allt som det skall :)

Den sista felande länken med interrupten var att jag manuellt blankade RCIF biten i PIR1 under initieringen.
Jag inbillade mig att den skulle vara blank vid uppstarten, men tydligen sabbade det allt.
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: EUSART på 16F887 jävlas

Inlägg av bos »

GPIE? Menar du PEIE?

Jag har inga datablad till hands men jag vill mig minnas att jag enbart hört GPIE i PIC10/12-sammanhang.
ToPNoTCH
Inlägg: 5158
Blev medlem: 21 december 2009, 17:59:48

Re: EUSART på 16F887 jävlas

Inlägg av ToPNoTCH »

Jo det menar jag. :?

Gäller att hålla isär PIC'ar & morötter. :humm:
Skriv svar