Sida 1 av 1

PIC 16F628A USART vägrar bara att funka! why oh why? (ASM)

Postat: 20 februari 2005, 16:20:02
av jonkers
Jag tror jag blir galen på detta.

Går rakt på koden som är förkortad för eran pleasure.

först:

Kod: Markera allt


	include 	<P16F628A.inc>

__CONFIG        _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC





sen:

Kod: Markera allt

                org      0x00
		goto	reset


reset
		movlw	B'00000111'		;Komparatorer = av
		movwf	CMCON			;


		banksel TRISA 			;Bank 1
        
		movlw	B'11010111'		;PIC options
		movwf	OPTION_REG		;

		clrf	INTCON			;Intterupt AV!!!!!!


		movlw 	B'11111111' 	;PORTA = ingångar
		movwf 	TRISA 			;
		movlw	B'00000010'		;PORTB = utgångar samt USART
		movwf	TRISB			;bits 1/2 = (RX/TX)

		banksel	TXSTA
		movwf	B'00100100'		;Initsierar USART TX
		movwf  	TXSTA			;

		banksel RCSTA
		movlw	B'10010000'		;Initsierar USART RX
		movwf	RCSTA

		banksel	SPBRG
		movwf	D'207'			;Baudrate = 19200
		movlw	SPBRG			;

		banksel	TXREG
		clrf	TXREG


		banksel PORTA 			;Bank 0



		goto	mainloop



sen mainloopen som scannar knappar.

Jag trycker jag på en knapp som är korrekt software-avstudsad och då hoppar programmet till en rutin som först tänder en debug-LED för att veta att knapptrycket registrerades sen slänger jag in ett värde i W och kallar på rutinen send som ser ut så här:

Kod: Markera allt


send 
	   movwf 	TXREG            ; Sänd data i W

	   banksel      TXSTA        	 ; 

wthere  btfss 	        TXSTA,TRMT      ; Vänta på TRMT flaggan (1=klar)
           goto 	   wthere

        banksel PORTA       	 ; 

        return 


och det är här skiten fastnar. loopar förevigt.

jag har provat 1000 olikka varianter och tom bytt PIC men till ingen nytta. det verkar som att den inte sänder det som finns i TXREG och TRMT-bitten alltid är 0.

I koden som jag nu har lämnat så har jag satt TRISB,TX biten till 0 men jag har provat att ha den som ett också. hur ska det vara igentligen? i databladet står det att den ska vara confad som input men i alla kodsnuttar jag hittar på nätet så är den output.

jag har juh uppenbarligen gjort ngn stor tabbe men var?

TXSTA och RCSTA registrerna måste vara rätt för jag har quadruppel-kollat inställningarna utav dom.

har jag ngt fel i __config månne?

jaja hoppas ngn kan hjälpa en trött stackars sate.

kram kram

/jonkers

Postat: 20 februari 2005, 18:06:43
av dawe
Vilken klockfrekvens kör du i? Skulle kunna va din baudrate som är fel.

SPBRG = (klockfrekvens/(16*baudrate)) - 1


/dawe

Postat: 20 februari 2005, 18:46:10
av jonkers
Jag kör i 4Mhz.

Jag har både räknat själv och kollat i datasheet-tabellerna. 19200 ska vara D'207' om BRGH = 1.

Men problemet är att inget sänds över huvudtaget, TXSTA,TRMT bitten verkar vara fast i 0. (någonstans har jag kodat fel men kan inte hitta det)

Postat: 20 februari 2005, 18:46:57
av Icecap
__config har inget med det att göra!

Tydligen har UARTen inte startat TX samt baud-rate generatorn, jag initierar såhär:
SetBank 0
movlw d'5' ; Set comm. data to 9K6 baud
SetBank 1
movwf SPBRG ; 2K4/9K6 Baud @ X-tal 3.686.400 Hz
bcf TXSTA,BRGH ; BRGH = '0'
bcf TXSTA,SYNC ; Set to async.
bsf TXSTA,TXEN ; Enable USART Tx
SetBank 0 ; Select Bank 0
bsf RCSTA,SPEN ; Enable USART in general
Och då kör TX!

Postat: 20 februari 2005, 19:11:33
av cyr
Jag vet att jag läst något om en PIC USART-flagga som inte var pålitlig, i någon errata eller datablad, nånstans....

Lösningen där var iaf att titta på interrupt-flaggan istället, dvs (om det har något med det här att göra) kolla på PIR1,TXIF för att se när sändningen är klar.

Postat: 20 februari 2005, 20:04:24
av jonkers
Har nu provat att kika på txif-flaggan i PIR1 och använder samma init som icecap rekommenderade men till ingen nytta.

jag har massa leds som tänder på lämpliga ställen i programmet och kommenterar jag bort sändrutinen så funkar allt som smort.

om jag skiter i att kolla om TXREG är tomt och bara slänger in bytes där med lite delay mellan så tuffar programmet på men det hamnar nada på TX-pinnen.

jag har en krets med MAX233 kopplad till datorn och jag slängde bara för skojs skull ihop ett klassiskt USART-test progg i mikroBasic som ekar allt den tar emot och det funka utan problem.

vill verkligen få det att funka i asm......

:cry: :cry:

Postat: 20 februari 2005, 20:14:22
av jonkers
AAAARGGGHHH!!!!!

Jag hittade felet!!!!

Kod: Markera allt


      banksel   SPBRG
      movwf   D'207'         ;Baudrate = 19200
      movlw   SPBRG         ; 


skrev jag..... notera det idiotiska movwf "värde" movlw "register"

ska juh vara tvärtom!!!!


detta är ngt jag har kämpat med sen 2-tiden idag


hatar mig själv just nu men ÄNTLIGEN

Postat: 20 februari 2005, 20:52:52
av Icecap
Välkommen i programmörens värld! :oops:

Det har väl hänt en eller annan gång för oss alla skulle jag tro :?