Hey!!!!
Wait a second... your right!!
Soon iŽll end up looking like a mouse with a red Book in my hands!!![]()
Hey!!!!
Wait a second... your right!!
Soon iŽll end up looking like a mouse with a red Book in my hands!!![]()
Hi Darrel
I made some tests on the ASM handler for my TMR2 interrupt, it works ALMOST fine.
Before posting i double checked this.
First The timer is interrupting correctly every 0.000125uS and taking the samples, how did i checked this? well first i used HSEROUT to my serial port of the whole sample and i got something. At the Same time i needed to check the timing, so i modified the handler to add a toggle of a pin in the uC after each Sample, then i measured it with the oscilloscope and got the correct frequency.
Then here is what i got from my Serial PortCode:<html> <head></head> <body><!--StartFragment--><pre><code><font color="#000000"><b>CLEAR DEFINE OSC </b>4 <b>DEFINE HSER_RCSTA </b>90<b>h </b><font color="#000080"><i>' Set transmit register to transmitter enabled </i></font><b>DEFINE HSER_TXSTA </b>24<b>h </b><font color="#000080"><i>' Set baud rate </i></font><b>DEFINE HSER_BAUD </b>9600 <b>DEFINE HSER_CLROERR </b>1 <b>LCD_DB4 VAR PORTA</b>.6 <font color="#000080"><i>;************LCD_AnyPin declarations </i></font><b>LCD_DB5 VAR PORTB</b>.6 <b>LCD_DB6 VAR PORTB</b>.5 <b>LCD_DB7 VAR PORTB</b>.4 <b>LCD_RS VAR PORTA</b>.0 <b>LCD_E VAR PORTA</b>.7 <b>LCD_Lines CON </b>2 <b>LCD_DATAUS CON </b>50 <b>LCD_COMMANDUS CON </b>2000 <b>INCLUDE </b><font color="#FF0000">"LCD_AnyPin.pbp" </font><b>INCLUDE </b><font color="#FF0000">"DT_INTS-14628.bas" </font><b>INCLUDE </b><font color="#FF0000">"ReEnterPBP.bas" </font><b>INCLUDE </b><font color="#FF0000">"Elapsed_INT.bas" </font><b>PinActivar VAR porta</b>.3 <b>PinDescuelgue VAR porta</b>.5 <b>PinPolaridad VAR porta</b>.4 <b>InZCD VAR porta</b>.2 <b>PinDTMF VAR portb</b>.7 <b>PinOffHook VAR portb</b>.0 <b>Samples VAR BYTE</b>[15] <b>BANK0 SYSTEM SamplePTR VAR BYTE BANK0 SYSTEM SamplesAddr CON EXT </b><font color="#008000">@SamplesAddr = Samples </font><b>BitCount VAR BYTE BANK0 SYSTEM ByteCount VAR BYTE BANK0 SYSTEM FlagSample VAR BIT TMR2ON VAR T2CON</b>.2 <b>NumSamples VAR BYTE ComIn VAR BYTE x VAR BYTE </b><font color="#000080"><i>'Counter Byte </i></font><b>ASM </b><font color="#008000">INT_LIST macro </font><font color="#000080"><i>; IntSource, Label, Type, ResetFlag? ;INT_Handler RX_INT, _Hablar, PBP, yes </i></font><font color="#008000">INT_Handler TMR2_INT, Sample, ASM, yes </font><font color="#000080"><i>;INT_Handler TMR1_INT, _ClockCount, PBP, yes </i></font><font color="#008000">endm INT_CREATE </font><font color="#000080"><i>; Creates the interrupt processor </i></font><b>ENDASM </b><font color="#000080"><i>;@ INT_ENABLE RX_INT ; Enable Timer 1 Interrupts ;@ INT_ENABLE TMR1_INT ; Enable Timer 1 Interrupts </i></font><font color="#008000">@ INT_ENABLE TMR2_INT </font><font color="#000080"><i>; Enable Timer 1 Interrupts </i></font><b>Config</b>: <b>trisb</b>.0=0 <b>trisa</b>.5=1 <b>trisa</b>.4=1 <b>trisa</b>.2=1 <b>trisb</b>.7=0 <b>trisb</b>.3=0 <b>trisa</b>.3=0 <b>CMCON </b>= 5 <b>CMCON</b>.5 = 1 <font color="#000080"><i>'INVERTIDO </i></font><b>VRCON </b>= %11101100 <b>OPTION_REG </b>= %00000000 <b>PAUSE </b>500 : <b>LCDOUT </b>$FE,1 : <b>PAUSE </b>250 <b>HSEROUT </b>[<font color="#FF0000">"7"</font>] <font color="#000080"><i>'gosub ResetTime 'gosub StartTimer ;@ INT_DISABLE TMR1_INT ; Enable Timer 1 Interrupts ;@ INT_DISABLE RX_INT ; Enable Timer 1 Interrupts 'HPWM 1,127,420 </i></font><b>LOW PinDTMF HIGH PinOffHook main1</b>: <b>GOSUB GetSamples WHILE FlagSample </b>= 0 <b>WEND GOTO main1 MAIN</b>: <b>HIGH PinActivar GOSUB GetSamples WHILE FlagSample </b>= 0 <b>WEND HSEROUT </b>[<font color="#FF0000">":"</font>,10,13] <b>FOR x </b>= 0 <b>TO </b>14 <b>HSEROUT </b>[<b>BIN8 Samples</b>[<b>x</b>],10,13] <b>NEXT x PAUSE </b>5000 <b>GOTO MAIN </b><font color="#000080"><i>;----[Start getting the 120 samples]------------------------------------------ </i></font><b>GetSamples</b>: <b>FlagSample </b>= 0 <b>SamplePTR </b>= <b>SamplesAddr ByteCount </b>= 15 <b>BitCount </b>= 8 <b>PR2 </b>= 125 : <b>TMR2 </b>= 0 : <b>TMR2ON </b>= 1 <b>RETURN </b><font color="#000080"><i>;----[TMR2 Handler]----------------------------------------------------------- 'ASM 'Sample ' MOVE?BB SamplePTR, FSR ; Load FSR with pointer to array ' MOVE?TT CMCON,7, STATUS,C ; Put sample in carry flag ' rrf INDF, F ; Shift in the sample bit ' decfsz BitCount, F ; Are all 8 bits in ? ' goto Int_Done ; NO, done for now ' MOVE?CB 8, BitCount ; Yes, reset bitcount ' incf SamplePTR, F ; Point to next byte ' decfsz ByteCount, F ; Are all 15 bytes done ? ' goto Int_Done ; NO, done for now ' MOVE?CT 1, _FlagSample ; Yes, Indicate - Samples Complete ' MOVE?CT 0, _TMR2ON ; stop the timer 'Int_Done ' btfsc PORTA, 3 ; Toggle porta.3 to check Interruption on OScilloscope ' goto Int_DNZ ; this really looks stupid.. longer than the rest of the ' goto Int_DZ ; routine :P ' Int_DZ ' bsf PORTA, 3 ' goto Int_Done1 ' Int_DNZ ' bcf PORTA, 3 ' Int_Done1 ' INT_RETURN 'ENDASM </i></font><b>ASM </b><font color="#008000">Sample MOVE?BB SamplePTR, FSR </font><font color="#000080"><i>; Load FSR with pointer to array </i></font><font color="#008000">MOVE?TT CMCON,7, STATUS,C </font><font color="#000080"><i>; Put sample in carry flag </i></font><font color="#008000">rrf INDF, F </font><font color="#000080"><i>; Shift in the sample bit </i></font><font color="#008000">decfsz BitCount, F </font><font color="#000080"><i>; Are all 8 bits in ? </i></font><font color="#008000">goto Int_Done </font><font color="#000080"><i>; NO, done for now </i></font><font color="#008000">MOVE?CB 8, BitCount </font><font color="#000080"><i>; Yes, reset bitcount </i></font><font color="#008000">incf SamplePTR, F </font><font color="#000080"><i>; Point to next byte </i></font><font color="#008000">decfsz ByteCount, F </font><font color="#000080"><i>; Are all 15 bytes done ? </i></font><font color="#008000">goto Int_Done </font><font color="#000080"><i>; NO, done for now </i></font><font color="#008000">MOVE?CT 1, _FlagSample </font><font color="#000080"><i>; Yes, Indicate - Samples Complete </i></font><font color="#008000">MOVE?CT 0, _TMR2ON </font><font color="#000080"><i>; stop the timer </i></font><font color="#008000">Int_Done btfsc CMCON,7 </font><font color="#000080"><i>; Toggle porta.3 to check Interruption on OScilloscope </i></font><font color="#008000">goto Int_DNZ </font><font color="#000080"><i>; this really looks stupid.. longer than the rest of the </i></font><font color="#008000">goto Int_DZ </font><font color="#000080"><i>; routine :P </i></font><font color="#008000">Int_DZ bcf PORTA, 3 goto Int_Done1 Int_DNZ bsf PORTA, 3 Int_Done1 INT_RETURN </font><b>ENDASM Hablar</b>: <font color="#000080"><i>' FUNCION DE INTERRUPCION DEL PUERTO SERIE, RECIBE CORRECTAMENTE TODOS LOS DATOS </i></font><b>WHILE PIR1</b>.5 <font color="#000080"><i>' If RCIF is set, then read RCREG until it's clear </i></font><b>ComIn </b>= <b>RCREG WEND HSEROUT </b>[<b>ComIn</b>] <font color="#008000">@ INT_RETURN </font></code></pre><!--EndFragment--></body> </html>
11111110
00000011
11111000
00011111
11000000
01111111
00000000
11111110
00000111
11110000
00011111
10000000
11111111
00000000
11111100
My first impression GREAT!! but nono. Why? because The fecuency sampled is 420Hz, considering 0.000125 samples per second the period of the signal should be (1/420Hz)/0.000125uS = 19 samples aproximately. From what i am getting you can see that the period is around 15 samples, which means 533,3 Hz.
So i Though maybe the comparator is not working correctly...but... Another modification to the handler to make porta.3 follow the comparator output showed this picture. Its a DTMF code not the 420Hz i used as sample.
<img src="http://www.picbasic.co.uk/forum/attachment.php?attachmentid=2071&stc=1&d=1 191624484" width="160" height="98" />
So the Comp is working fine, and the sampling is being done a the correct frequency.
Here i took the 420Hz Comparator Output.
<img src="http://www.picbasic.co.uk/forum/attachment.php?attachmentid=2072&stc=1&d=119162493 3" width="160" height="98" />
Could it be... this is my last one... that something is wrong with the Handler... maybe between Byte changes a bit is missing? Obviously i have no idea of what you did there, BY THE WAY you will laugh at my ASM code to check things at porta.3 it has to be awful !!. It works but is longer than the sampling part.
Hope you can give me any ideas.
Last edited by Josuetas; - 6th October 2007 at 01:06.
I think I see the confusion. It depends on how you line up the bytes.
For Binary arrays, they go from Right To Left.
Here's the results again ...<table border=1><tr><td align=center>
11111110
00000011
11111000
00011111
11000000
01111111
00000000
11111110
00000111
11110000
00011111
10000000
11111111
00000000
11111100
</td></tr><tr><td align=left>Correct way.<br>4 bytes Aligned right to left<br>
<pre> 00011111111110000000001111111110<br> |------ 19 -------|</pre>
</td></tr><tr><td>Wrong way.<br>4 bytes Aligned left to right <br>
<pre> 11111110000000111111100000011111<br> |---- 14 ----|</pre>
</td></tr></table>
HTH,
DT
Doh!
Doh!
Doh!
A whole day looking a that
Darrel this is the next question (i havent even look through it), now i have an array of 15 bytes, but i see it has a pointer EXT, is there a way to point to each Bit of this array? i am going to do some math to each bit now and this would be useful.
Something else, this project is short in code Space since i only have 2k of my 628A (no16F88 around here) removing ReEnter could save me 150 instructions? the fact is this piece of code is like 780 words already and i havent done anything :P.
Anyway tomorrow iŽll do the short math, iŽll begin to cry when the word count reaches 1800.
Melanie has provided the answer. See 3. How can I reference a BIT in a BYTE ARRAY? in her very helpful Bits, Bytes Words and Arrays Post....is there a way to point to each Bit of this array?
Thanks again Melanie.
SteveB
Thanks Steve i will be using it.
On the other hand.
Darrel this link
http://www.picbasic.co.uk/forum/show...php?t=3891#LAB ...
Its the post about the EXT modifier, i have been using it as a label to create tables in codespace in the past, BUT: right now i am using 628A wich doesnŽt support READCODE instruction, can i still use it to create a table in codespace? if so (i guess i can) how can i read it?. It is a 14 bits x 120 Word, since the device is 14 bit i guess i could store each word in a memory space? kind of like the code to store strings in codespace? I havent been able to use the last one since i dont know how the data would be stored as Words and not as strings. Again ignorant about asm.
This is my table
Code:</i></font><b>ASM </b><font color="#008000">DataTable DW 11111111111111b DW 01010111111111b DW 00000101010101b DW 00000001010101b DW 10101000000101b DW 11111000000000b DW 01111110000000b DW 01011110101000b DW 00000111101010b DW 10000011111010b DW 11100001111110b DW 11111001011111b DW 01111000010111b DW 00011100010111b DW 10000110000101b DW 10000110000001b DW 11100010100001b DW 01110011100000b DW 00111011111000b DW 00011101111000b DW 10001101111110b DW 11000100011110b DW 11100100011111b DW 01110010000111b DW 00111010000111b DW 10011011100001b DW 10001111100001b DW 11001101100001b DW 01100101111000b DW 00110000111000b DW 00110000011000b DW 10011010011110b DW 11001010001110b DW 01001110000110b DW 01100111000111b DW 00110111100111b DW 10110001100011b DW 11010001110001b DW 11001000111001b DW 01001100011001b DW 00101110011000b DW 10110110011100b DW 10110111001100b DW 11010011001110b DW 01001001100110b DW 01001001100111b DW 00101100110011b DW 10110100110011b DW 11110110110001b DW 11010010011001b DW 01000010011001b DW 00001011001100b DW 10101111001100b DW 10111101101100b DW 11110101100110b DW 01010100100110b DW 00000000110110b DW 00001010110011b DW 10101010010011b DW 11111111011011b DW 01111111011001b DW 01010101001001b DW 00000001001101b DW 10000000101100b DW 11101000100100b DW 11111010110110b DW 01111110110110b DW 00010110110010b DW 00000111010011b DW 10000011010011b DW 11100001001011b DW 01111001001001b DW 01111100101101b DW 00011100101101b DW 10000110101100b DW 11000110110100b DW 11100011110100b DW 01111011010010b DW 00111001010010b DW 10011101000010b DW 10001100001011b DW 11000100001011b DW 01100010101011b DW 00110010101101b DW 00111010111101b DW 10011011110101b DW 11001111010100b DW 11000101010100b DW 01100101010010b DW 00110000000010b DW 10111000001010b DW 10011010101011b DW 11001110101011b DW 01001111111111b DW 00100111111101b DW 00110001111101b DW 10110001010101b DW 11011000010100b DW 01001000000000b DW 01001110000000b DW 00100110100010b DW 10110110101010b DW 11110011101010b DW 11010011111111b DW 01001001111111b DW 00001101011111b DW 10101100010101b DW 10110100000101b DW 11110110000101b DW 01010010000000b DW 01001011100000b DW 00001011101010b DW 10101101111010b DW 11111101111010b DW 11110100111111b DW 01010000011111b DW 00000010010111b DW 10001010000101b DW 10101010000101b DW 11111111100001b </font><b>ENDASM
There's still the 128 Byte EEPROM on board option... but it's way too limited.
LOOKUP(2)?
External EEPROM?
Last edited by mister_e; - 6th October 2007 at 17:50.
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
.
Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
.
There simply is no "Happy Spam" If you do it you will disappear from this forum.
You cant imagine how nice it would be for me to find one around here!
The fact is that 648A is sold out, today i went looking for it with no success.
Not finding supplies around here really makes me sad.
So it seems i will have to upgrade the uC to something like 876A, easily found here. Though more expensive. Its sad because 876A is not improving anything for me, maybe just the speed, but even there i will have to use an external OSC ($$).
What i really need here is 16F88, int OSC 8 Mhz always better than 4 Mhz and 4K memory should be enough.
I am from Colombia South America by the way... wanna switch?
Leaving this discussion Aside... i am not done with 628A you know? i havent reached 1800 words (where i will cry) right now i just need to store the table in code space... do you know the way? the solutions about this given in the forum use READCODE wich 628A cant execute.
Aside from lack of PICs, oh and that thing about the cartels . . .I hear Colombia has many nice things, great coffee, emeralds, cattle ranches, I knew a girl from there who went back and became Miss Colombia, and she was cute too !, but no I am too old to make that big of a change. I did not know from where you are hailing, will U S Suppliers not ship to Colombia? I do not know of any techknowlegy restrictions regarding shipping to your Country, You might check with www.Mouser.com
If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
.
Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
.
There simply is no "Happy Spam" If you do it you will disappear from this forum.
Bookmarks