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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
jonkers
Inlägg: 37
Blev medlem: 16 oktober 2004, 15:04:52

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

Inlägg 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
dawe
Inlägg: 1
Blev medlem: 20 februari 2005, 17:49:03

Inlägg av dawe »

Vilken klockfrekvens kör du i? Skulle kunna va din baudrate som är fel.

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


/dawe
jonkers
Inlägg: 37
Blev medlem: 16 oktober 2004, 15:04:52

Inlägg 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)
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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!
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg 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.
jonkers
Inlägg: 37
Blev medlem: 16 oktober 2004, 15:04:52

Inlägg 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:
jonkers
Inlägg: 37
Blev medlem: 16 oktober 2004, 15:04:52

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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 :?
Skriv svar