Well my program needs to read the data from a serial connection and than it should save that data into a string. The only problem that I have is that if the date comes too quickly the PIC just discards that data. Any ideea why is that?
Well my program needs to read the data from a serial connection and than it should save that data into a string. The only problem that I have is that if the date comes too quickly the PIC just discards that data. Any ideea why is that?
Possibly because you are sending anything received back out at the same speed within the interrupt handler.
You should get in and out of the handler as quick as possible.
Then let the mainloop empty the buffer when it has time.
Preferably at a higher speed.
Also, T0CON is different than T1CON.
TMR0ON is bit 7, and bit 0 is part of the prescaler setting.
<br>
DT
I tried this code:
and it still doesn't work any ideea why.Code:ReadSerial: DataRec var byte[5] : DataRec = 0 KP var byte : KP = 0 While CounterA <= 70 IF index_in > (buffer_size-1) Then index_in = 0 'Reset pointer if outside of buffer HSerin [buffer[index_in]] ' Read USART and store character to next empty location if buffer(index_in) = $20 then index_in = 0 for CounterB=0 to buffer_size buffer(CounterB) = 0 next CounterB KP = 1 ENDIF if ((KP = 1) AND (index_in=4)) THEN SerData(CounterA)=buffer(4) CounterA = CounterA + 1 KP = 1 ENDIF index_in = index_in + 1 WEND
PS: Is it better than the old one?
Last edited by johnmiller; - 11th May 2007 at 19:30.
I modified one of my old programs. This works for me, always has.Code:@ DEVICE PIC16F628A , HS_OSC , WDT_OFF , PWRT_ON , MCLR_ON , BOD_ON , LVP_OFF , PROTECT_OFF 'HS 20mhz external, watchdog off, powerup timer on, mclr external, brown out detect on, low volt program off , code protect off resetplaceholder: 'wordpad, arial black, size 8, reg, 1600x1200 screen, 16f628A code DEFINE OSC 20 '20mhz serdata var byte : serialbuffer var byte[255] : bufferpointer var byte bufferdata var byte : temp var byte startupholder: goto skipsubs 'skip over all the commonly used subroutines ON INTERRUPT GOTO INTHANDLER DISABLE INTERRUPT INTHANDLER: if pir1.5 = 1 then 'if serial data rx'd serdata = rcreg 'save serial port data right away pir1.5 = 0 'reset the RX flag if ( rcsta.1 = 1 ) or ( rcsta.2 = 1 ) then 'check for err, if frame/overrun error, rcsta.4 = 0 : rcsta.4 = 1 : serdata = rcreg : serdata = 0 else if bufferpointer = 255 then goto intfinish 'buffer is full serialbuffer[bufferpointer] = serdata : bufferpointer = bufferpointer + 1 'save data in buffer, bump pointer goto INTHANDLER 're-check serial port just in case another character came in while saving data '...not likely endif endif intfinish: RESUME ENABLE INTERRUPT getcharacterfrombuffer: if bufferpointer = 0 then return 'no data in buffer in the first place! buffereddata = serialbuffer[0] 'get oldest data from buffer for temp = 0 to 254 : serialbuffer[temp] = serialbuffer[temp+1] : next temp 'shift data down one byte serialbuffer[255]=0 'set last byte in buffer to zero since it's meaningless bufferpointer = bufferpointer - 1 'one less byte in buffer return skipsubs: option_reg=8 : pie1=32 : trisa=0 : porta=0 : trisb=$ef : portb=16 : t1con=0 : t2con=0 cmcon=7 : ccp1con=0 : vrcon=0 : txsta=0 : rcsta=$90 : pir1.5=0 : spbrg=33 : intcon=$e0 '9600 baud for temp = 0 to 255 : serialbuffer[temp] = 0 : next temp mainloop: goto mainloop 'do it all over again END
I've left the character handling and the modifications of the program to you to make work for your PIC.
Last edited by skimask; - 11th May 2007 at 20:15.
I tried your code, and now I tried the one above and still does not work
I tried this one as well and it doesn't work either:Code:ReadSerial: DataRec var byte[5] : DataRec = 0 While CounterA <= 55 HSERIN [serdata2] 'save serial port data right away if serdata2 = $13 THEN i = 0 KP = 1 ENDIF if KP = 1 then IF i=5 THEN SerData(CounterA) = serdata2 CounterA = CounterA + 1 KP = 0 endif i = i + 1 endif wend FOR COUNTERB=42 to COUNTERA SEROUT2 SerWRT,16416,[hex2 SerDATA(COUNTERB), 10, 13] NEXT COUNTERB Goto ReadReadyLoop
PS: it doesn't work it's like the pic is not reading the data fast enough. It is supposed to read the data from a keyboard that than sends data over a serial link at 19200 (not inverted).Code:SERIN2 [WAIT($20), SKIP 4, serdata2]
All the above codes work if I press a key once per second or so, but they don't work any faster. Anybody can tell me why
Last edited by johnmiller; - 12th May 2007 at 08:23.
I think I can reasonably assume that what you posted isn't all of your code that you are trying to make work.
And if it is...well, where's the beef?
Post the whole thing if you want any useful help...
Well this is the only part where I have problems and I don't think pasting 80 pages will do any good
I really don't understand what's wrong with my code
Bookmarks