mark_s
- 9th June 2011, 16:04
Here's another example like aajgss's for the MCP4921. It generates a sine or cosine wave.
Would like to try speeding it up, using the MSSI or MSSp modules. If anyone has an idea for this
please post.
'************************************************* ***************
'* Name : DAC_MCP4921_WAVE.PBP *
'* Author : MARK S *
'* Date : 4/30/2011 *
'* Version : 1.0 *
'* Notes : DEMO 12BIT DAC MCP4921 - OUTPUTS SINE OR COSINE WAVE *
'* : FIXED FREQUENCY SHIFTOUT VERY SLOW, TRY MSSP MODULE *
'************************************************* ***************
'PIC18F4680 PBP2.6, MPASM
DEFINE OSC 20
'REGISTERS
INTCON = %00000000
INTCON2.7 = 0 'weak pullups portB
'ADCON0 = %00000001 'A/D module enabled, channel 0
ADCON1 =%00001111 'ALL DIGITAL
'ADCON2 = %10101011 'Right justified, 12 Tad, Frc clock
CMCON =%00000111 'COMP OFF
T3CON = 0
CCP1CON = 0 'ECCP OFF
ECCP1AS = 0
ECCP1DEL = 0
'PORTS
TRISA = %00000000 ' PORTA ALL OUTPUT
TRISB = %00000000 ' PORTB
TRISC = %00000000 ' PortC TMR1 RC0 = INPUT
TRISD = %00000000
TRISE = %00000111
'VARIABLES & DAC CONNECTIONS VREF PIN6 4921 TIED TO +5V
SCLK VAR PORTD.0 'SPI CLOCK PIN3 4921
SDAT VAR PORTD.1 'SPI DATA PIN4 4921
CS_DAC VAR PORTD.2 'Chip select PIN2 4921
LOAD_DAC VAR PORTD.3 'PIN5 4921
WAVE_INDEX VAR WORD 'TABLE POINTER
DAC_OUT VAR WORD '0-4095 OUTPUT 0 TO 5V, value returned from table
MAIN:
HIGH LOAD_DAC
HIGH CS_DAC
FOR WAVE_INDEX = 0 TO 255
'GOSUB COS_TABLE
GOSUB SINE_TABLE
'PAUSEUS 500 'LOWER OUTPUT FREQ
'----------------------
LOW CS_DAC
SHIFTOUT SDAT,SCLK,1,[%0011,DAC_OUT\12] 'Set DAC out
HIGH CS_DAC
LOW LOAD_DAC
@ NOP
HIGH LOAD_DAC
'----------------------
NEXT WAVE_INDEX
GOTO MAIN
SINE_TABLE:
lookup2 WAVE_INDEX, [0,1,2,6,10,15,22,30,39,50,61,74,88,103,120,137,156 ,_
176, 197,219,242,266,291,318,345,374,403,433,465,497,_
531,565,600,636,673,710,749,788,828,869,910,952,99 5,_
1039,1083,1127,1172,1218,1264,1311,1358,1406,1453, 1502,1550,1599,_
1648,1698,1747,1797,1847,1897,1948,1998,2048,2098, 2148,2199,2249,_
2299,2349,2398,2448,2497,2546,2594,2643,2690,2738, 2785,2832,2878,_
2924,2969,3013,3057,3101,3144,3186,3227,3268,3308, 3347,3386,3423,_
3460,3496,3531,3565,3599,3631,3663,3693,3722,3751, 3778,3805,3830,_
3854,3877,3899,3920,3940,3959,3976,3993,4008,4022, 4035,4046,4057,_
4066,4074,4081,4086,4090,4094,4095,4095,4095,4094, 4090,4086,4081,_
4074,4066,4057,4046,4035,4022,4008,3993,3976,3959, 3940,3920,3899,_
3877,3854,3830,3805,3778,3751,3722,3693,3663,3631, 3599,3565,3531,_
3496,3460,3423,3386,3347,3308,3268,3227,3186,3144, 3101,3057,3013,_
2969,2924,2878,2832,2785,2738,2690,2643,2594,2546, 2497,2448,2398,_
2349,2299,2249,2199,2148,2098,2048,1998,1948,1897, 1847,1797,1747,_
1698,1648,1599,1550,1502,1453,1406,1358,1311,1264, 1218,1172,1127,_
1083,1039,995,952,910,869,828,788,749,710,673,636, 600,_
565,531,497,465,433,403,374,345,318,291,266,242,21 9,_
197,176,156,137,120,103,88,74,61,50,39,30,22,15,10 ,6,_
2,1],DAC_OUT
RETURN
COS_TABLE:
lookup2 WAVE_INDEX, [4095,4095,4094,4090,4086,4081,_
4074,4066,4057,4046,4035,4022,4008,3993,3976,3959, 3940,3920,3899,_
3877,3854,3830,3805,3778,3751,3722,3693,3663,3631, 3599,3565,3531,_
3496,3460,3423,3386,3347,3308,3268,3227,3186,3144, 3101,3057,3013,_
2969,2924,2878,2832,2785,2738,2690,2643,2594,2546, 2497,2448,2398,_
2349,2299,2249,2199,2148,2098,2048,1998,1948,1897, 1847,1797,1747,_
1698,1648,1599,1550,1502,1453,1406,1358,1311,1264, 1218,1172,1127,_
1083,1039,995,952,910,869,828,788,749,710,673,636, 600,_
565,531,497,465,433,403,374,345,318,291,266,242,21 9,_
197,176,156,137,120,103,88,74,61,50,39,30,22,15,10 ,6,_
2,1,0,1,2,6,10,15,22,30,39,50,61,74,88,103,120,137 ,156,_
176, 197,219,242,266,291,318,345,374,403,433,465,497,_
531,565,600,636,673,710,749,788,828,869,910,952,99 5,_
1039,1083,1127,1172,1218,1264,1311,1358,1406,1453, 1502,1550,1599,_
1648,1698,1747,1797,1847,1897,1948,1998,2048,2098, 2148,2199,2249,_
2299,2349,2398,2448,2497,2546,2594,2643,2690,2738, 2785,2832,2878,_
2924,2969,3013,3057,3101,3144,3186,3227,3268,3308, 3347,3386,3423,_
3460,3496,3531,3565,3599,3631,3663,3693,3722,3751, 3778,3805,3830,_
3854,3877,3899,3920,3940,3959,3976,3993,4008,4022, 4035,4046,4057,_
4066,4074,4081,4086,4090,4094,4095],DAC_OUT
RETURN
END
mark_s
- 10th June 2011, 15:25
Okay I hammered out a routine to use the MSSP module. It gave me
a 6x speed increase over shiftout. I'm just a hack so there maybe a
better way to do it.
Results:
Shiftout MSSP
10mhz 10hz 66hz
20mhz 21hz 117hz
40mhz 42hz 2 63hz
80mhz 83hz 526hz
The 80mhz is 20mhz crystal 4xpll, overclocking probably not reliable? but worked!
'************************************************* ***************
'* Name : DAC_12BIT_MSSP *
'* Author : MARK S *
'* Date : 6/9/2011
'* SINE WAVE GENERATOR USING MCP4921 12BIT DAC *
'* USES MSSP MODULE vs SHIFTOUT *
'* PIC18F4680, PBP2.6 MPASM *
'* *
'************************************************* ***************
DEFINE OSC 20
'REGISTER SET
INTCON = %00000000
INTCON2.7 = 0 'weak pullups portB
ADCON1 =%00001111 'ALL DIGITAL
CMCON =%00000111 'COMP OFF
T3CON = 0
CCP1CON = 0 'ECCP OFF
ECCP1AS = 0
ECCP1DEL = 0
SSPSTAT = %00000000 'TX IDLE LOW,SAMPLE MIDDLE
SSPCON1 = %00100000 ' ENABLE MSSP,CLK IDLE LOW,FOSC/4
'-----------------------------------------------------
'PORTS
TRISA = %00000000 ' PORTA ALL OUTPUT '
TRISB = %00000000 ' PORTB
PORTB = %00000000 ' CLEAR PORTB
TRISC = %00000000 ' PortC
TRISD = %00000000
TRISE = %00000000
'----------------------------------------------------
'DAC CONNECTIONS
'VREF PIN6 MCP4921 TIED TO +5V
'CLOCK PIN3 MCP4921 TO PORTC.3 "SCK"
'DATA PIN4 MCP4921 TO PORTC.5 "SDO"
'CS PIN2 MCP4921 TO PORTD.2
'LOAD PIN5 MCP4921 TO PORTD.3 CONNECT THIS TO GROUND TO SAVE A PORT PIN
'--------------------------------------------------
'VARIABLES
CS_DAC VAR PORTD.2
LOAD_DAC VAR PORTD.3 'KEEP LOW
WAVE_INDEX VAR WORD
DAC_OUT VAR WORD
DAC_OUT1 VAR WORD
SSPIF VAR PIR1.3 ' SPI interrupt flag
'----------------------------------------------------
'START
SSPBUF = 0 ' CLEAR SPI BUFFER
SSPIF = 0 ' CLEAR SPI INTERUPT FLAG.
LOW LOAD_DAC
'================================================= ==================
MAIN:
HIGH CS_DAC
FOR WAVE_INDEX = 0 TO 255
GOSUB SINE_TABLE
LOW CS_DAC
DAC_OUT1 =$3000 | DAC_OUT ' Combine table value with dac reg control
SSPBUF = DAC_OUT1.HIGHBYTE 'SEND HIGH
While SSPIF = 0 ' WAIT FOR TX TO COMPLETE
Wend
SSPIF = 0 'RESET INT FLAG
SSPBUF = DAC_OUT1.LOWBYTE 'SEND LOW
While SSPIF = 0 ' WAIT FOR TX TO COMPLETE
Wend
SSPIF = 0 'RESET INT FLAG
HIGH CS_DAC
NEXT WAVE_INDEX
GOTO MAIN
SINE_TABLE:
lookup2 WAVE_INDEX, [0,1,2,6,10,15,22,30,39,50,61,74,88,103,120,137,156 ,_
176, 197,219,242,266,291,318,345,374,403,433,465,497,_
531,565,600,636,673,710,749,788,828,869,910,952,99 5,_
1039,1083,1127,1172,1218,1264,1311,1358,1406,1453, 1502,1550,1599,_
1648,1698,1747,1797,1847,1897,1948,1998,2048,2098, 2148,2199,2249,_
2299,2349,2398,2448,2497,2546,2594,2643,2690,2738, 2785,2832,2878,_
2924,2969,3013,3057,3101,3144,3186,3227,3268,3308, 3347,3386,3423,_
3460,3496,3531,3565,3599,3631,3663,3693,3722,3751, 3778,3805,3830,_
3854,3877,3899,3920,3940,3959,3976,3993,4008,4022, 4035,4046,4057,_
4066,4074,4081,4086,4090,4094,4095,4095,4095,4094, 4090,4086,4081,_
4074,4066,4057,4046,4035,4022,4008,3993,3976,3959, 3940,3920,3899,_
3877,3854,3830,3805,3778,3751,3722,3693,3663,3631, 3599,3565,3531,_
3496,3460,3423,3386,3347,3308,3268,3227,3186,3144, 3101,3057,3013,_
2969,2924,2878,2832,2785,2738,2690,2643,2594,2546, 2497,2448,2398,_
2349,2299,2249,2199,2148,2098,2048,1998,1948,1897, 1847,1797,1747,_
1698,1648,1599,1550,1502,1453,1406,1358,1311,1264, 1218,1172,1127,_
1083,1039,995,952,910,869,828,788,749,710,673,636, 600,_
565,531,497,465,433,403,374,345,318,291,266,242,21 9,_
197,176,156,137,120,103,88,74,61,50,39,30,22,15,10 ,6,_
2,1],DAC_OUT
RETURN
END
Powered by vBulletin® Version 4.1.7 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.