hoi jongens, ik ben kijhard aan het werken om mijn uart comunicatie zo snel mogelijk werkende te krijgen, eerder wil ik niet slapen 
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:
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
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.
Belleblaas
BelleBlazer4Life
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?