hoi jongens, ik ben kijhard aan het werken om mijn uart comunicatie zo snel mogelijk werkende te krijgen, eerder wil ik niet slapen :-D
ik heb 2 pics aan elkaar geknoopt, 20mhz,19200baudrate, de pic die zend laat een lichtje branden als hij gezonden heeft.
hij zend maarik zie geen reactie, ik heb dus het signaal op de scope gehangen en zie dat geen data= tx hoog(5v), en als ik 'U'(01110101) stuur krijg ik dit te zien:
http://www.uploadarchief.com/Bestanden/320722549d1751cf3f247855f937b982.JPG
um naar mijn idee kan ik hiermee aannemen dat ik wel verzend, maar waarom doet mijn ontvang programma niks??
hier is de code:


receive         btfss PIR1,RCIF         ; (5) check for received data
                goto receive

                movf    RCREG,W            ; save received data in W
		BSF	PORTB,0X03
DELAY_ROUTINE   MOVLW	d'200'
		MOVWF	TIMER3
DEL_LOOP0	MOVLW   D'200'         ;
                MOVWF   TIMER2
DEL_LOOP1       MOVLW   D'200'	       ;60	
                MOVWF   TIMER1
DEL_LOOP2 	DECFSZ  TIMER1,F
                GOTO    DEL_LOOP2
                DECFSZ  TIMER2,F
                GOTO    DEL_LOOP1
	        DECFSZ	TIMER3,F
                GOTO    DEL_LOOP0

		BCF	PORTB,0X03
        	RETLW   0

ik krijg het idee dat PIR1,RCIF nooit veranderd, zou dat kunnen?
*update* hij doet wel iets! alleende eerste keer...
en ik heb eenfout in de timer ontdekt, logisch datie daarin bleef hangen. die is gefixed (ook hierboven) maar hij doet het nogsteeds maar1 keer:-(

Het foutje zal wel in de initialisatie zitten, en die heb je niet gepost !
edit: Blinde gok: Waarschijnlijk ben je vergeten CREN te zetten

[Bericht gewijzigd door JoWi op ]

mijn sourcecode is niet echt netjes aangezien het maar voor testen is (comentaar klopt niet en somige loops worden niet gebruikt, maar ze staan klaar voor het geval dat. . en stukken code zijn schaamteloos gekopieerd, wel aangepast maar nog met oude comentaar soms)
de continues receive staat aan.(bit4 in rcsta)
zonder mijncode is het voor jullie ook een mysterie dus hier is het dan:


;*******************************************************************
; Function:  ontvangt een uartteken en laat dan rb3 eventjes oplichten
; Processor: PIC16F628 at 20 MHz
; Hardware:  
; Filename:  uartnewtb
; Author:    johan
; Website:   sourcecode: www.qsl.net/oz1bxm/PIC/pic.htm
; Credit:    Lars Petersen, oz1bxm@qsl.net
;			 Tony Nixon's test program at
;            www.piclist.com/techref/microchip/16f877/setup.htm
;*******************************************************************

        LIST P=16F628, R=DEC    ; Use the PIC16F628 and decimal system

        #include "P16F628.INC"  ; Include header file

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

        CBLOCK 0x20             ; Declare variable addresses starting at 0x20
        dataL			;0x00 t/m 0x19 kunnen niet gebruikt worden
	timer1
	timer2
	timer3
        ENDC

        ORG    0x000            ; Program starts at 0x000
;
; --------------------------------
; 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	B'00011100'
	MOVWF	TRISA			;ra2,3,4in
	MOVLW	B'10000110'		;rb1 en2 moeten voor uart beiden inputs zijn
	MOVWF	TRISB			;RB1in(rx), rb2(tx),3(led),4,5,6 out

; ------------------------------------
; SET BAUD RATE TO COMMUNICATE WITH PC
; ------------------------------------
; Boot Baud Rate = 19200, No Parity, 1 Stop Bit
;
        movlw 0x40              ; h40 bij20mhz/19200
        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
; ---------
;
       
loop    goto receive            ; wait for a char
        goto loop               ; geupdate na een post hierover
;
; -------------------------------------------
; 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
 	        BSF	PORTB,0X03
DELAY_ROUTINE   MOVLW	d'10'
				MOVWF	TIMER3
DEL_LOOP0	MOVLW   D'200'         
                MOVWF   TIMER2
DEL_LOOP1       MOVLW   D'200'	       
                MOVWF   TIMER1
DEL_LOOP2 	DECFSZ  TIMER1,F
                GOTO    DEL_LOOP2
                DECFSZ  TIMER2,F
                GOTO    DEL_LOOP1
		DECFSZ	TIMER3,F
		GOTO	DEL_LOOP0
		BCF	PORTB,0X03
    		MOVF 	RCREG,W            ; save received data in W
    		goto	loop

;
; -------------------------------------------------------------
; 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


        END 

*kick*
um als jullie vinden dat ik mijn post te onduidelijk heb gemaakt ofzo moet je het zeggen.

Heb je misschien een max233 of max232 chippie liggen?
Dan kun je de zendende PIC verbinden met een terminal programma op je PC.
Als het vervolgens klopt wat je in je terminal binnenkrijgt, weet je zeker dat de fout niet daarligt.

Je kunt de terminal ook gebruiken om te zenden. Op deze manier kun je de ontvangende PIC testen.

Met twee blokjes waar software inzit, is het lastig foutzoeken..

Je hebt een werkend programma stuk gemaakt !!!!!
Hoe vaak zend je karakters uit ? Zeker vaker dan 4* per seconde ? Dan genereer je overruns in de receiver.
(Of er is een draadje los, maar dan zou ook het eerste karakter niet aankomen). Maar Hyperterm is een makkelijke manier om te testen.

Baudrate 19200?

Xtal frequentie nazien!

http://ww1.microchip.com/downloads/en/DeviceDoc/40300C.pdf

Error calcualtion!

[Bericht gewijzigd door Belleblaas op ]

yay, um thanks guys
lemme see,
@bellebaas ik heb mijn error calculatie getal uit de tabellen gehaald, moet 64 decimaal zijn = 40h. ik neem aan dat die tabellen kloppen.
@jowi je wil niet weten hoe blij ik ben dat te horen, ik zal er een timer inzetten zodat hij niet zovaak meer kan sturen dan probeer ik opnieuw. morge laat ik van me horen.
maar hyperterm is iets wat ik nu voor het eerst hoor. (ik moet nu snel naar bed, maar een snelle search vertelde mij dat het een programma is, kan die de error calculeren of luisterd die alleen en laat de characters zien?)
als de timer niet werkt ga ik er een max232 tussendoen, die heb ik van stage meegepikt (wist dat ik het nodig zou hebben voor het project!)
als ik dit alles heb uitgeprobeerd laat ik weer van me horen.

vanmorgen heb ik er een timer van ruim 3seconden ingezet maar hij hangt nogsteeds na 1 keer draaien . vervolgens de max232 aangesloten zoals op dit schema:
http://www.oz1bxm.dk/PIC/628uart.htm maar hij doet niks (moet wel zeggend at de 1uf voor 10uf verwisseld zijn omdat ik niet beter had, maar het werkte zo met een ander apparaat dus waarom niet met deze).is er mischien een goed programma waarin ik mijn uart programma kan simuleren?

Wat ik zo zie in je laatst geposte code (en in de vorige niet?):

loop    call receive            ; wait for a char
        goto loop

Je doet een call naar receive, en vervolgens in je receive weer een goto naar loop. Er volgt weer een call naar receive, enz. Omdat je niet returned, krijg je een stack overflow. Vervang de call eens door een goto, dat zak iig al iets schelen.

Als je met je scope ziet dat er iets verzonden wordt, maar in je terminal programma niets ziet, zou ik toch nog even de verbindingen en instellingen van je terminal programma nakijken. Als er iets verzonden wordt, zou je eigenlijk altijd wel iets moeten zien binnenkomen in je terminal programma. (Probeer anders deze eens, daar zie je het ook als het geen ASCII waarde is)

thx wouter, het is veranderd nu, ik heb dat prog op jou link ook gedownload en geprobeerd maar nog niks. ik zie alleen nergens die optie om de spanning op de rx te zien bewegen.
ik heb de scoop achterde de max232 gezet en krijg netjes het -12volt signaal wat naar boven en terug schiet als ik een signaal stuur. de opties staan op 19200bps, 8bits, no parity, 1 stop bit.
bij mijn receive programma (die hier gepost staat) heb ik het ligje nu laten knipperen als hij de main loop doorloopt (zo)

;
; ---------
; MAIN LOOP
; ---------
;
       
loop    BSF	PORTB,0X03
	CALL	DELAY_ROUTINE
	CALL	DELAY_ROUTINE
	CALL	DELAY_ROUTINE
	BCF	PORTB,0X03
	CALL	DELAY_ROUTINE
	goto    receive            ; wait for a char
        goto    loop

daarbij zag ik dat als mijn programma de eerste keer mijn led laat oplichten hij NIET eerst de main loop heeft doorlopen. nou ben ik ff de kluts kwijt hoe dat mogelijk is.
nu bedenkt ik me dat ik het verzend programma nog niet gepost heb, de code is precies hetzelfde als die van de ontvanger tot aan de main loop daar is het als volgt:

;
;
; ------------------------------------
; 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
; ---------
;
    
loop    BTFSS	PORTA,0X03         ; als de knop ingedrukt word
        goto 	send               ; ga dan naar send
        goto 	loop               ;anders wacht je
;
; -------------------------------------------------------------
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING
; -------------------------------------------------------------
;
send            BTFSS	PORTA,0X03
                goto 	send               ; send the char
		movlw	'u'
		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
		BSF		PORTB,0X03
DELAY_ROUTINE   MOVLW	d'10'
		MOVWF	TIMER3
DEL_LOOP0	MOVLW   D'200'         
                MOVWF   TIMER2
DEL_LOOP1       MOVLW   D'200'	       	
                MOVWF   TIMER1
DEL_LOOP2 	DECFSZ  TIMER1,F
                GOTO    DEL_LOOP2
                DECFSZ  TIMER2,F
                GOTO    DEL_LOOP1
		DECFSZ	TIMER3,F
		GOTO	DEL_LOOP0
		BCF	PORTB,0X03
EENKEER	        BTFSC	PORTA,0X03
		GOTO	EENKEER
		goto	loop
 

[Bericht gewijzigd door gohan127 op ]

okay, jongens ik ben een stuk verder gekomen, ik ontdekte eerst dat als het ontvang programma nadat het iets ontvangen had en ik dan de UART poort dicht liet maken en weer openen(BCF RCSTA,CREN ; (Schakel USART UIT)
BSF RCSTA,CREN ; (Schakel USART IN ) dat hij dan wel een 2de signaal wou ontvangen. na wat zoeken kwam ik erachter dat ik nogsteeds overrun errors krijg(RCSTA,OERR bekeken) ik heb mijn huidige zend programma in het vorige bericht geupdate. ik zie dat hij 1xverzend als ik de knop indruk, weer 1x als ik de knop loslaat terwijl ik zo alles dichtgespijkerd (dacht) te hebben dat 1x de knop indrukken het programma maar 1x de verzend routine laat doorlopen. hoe komt het datie blijft zenden?