Hello, if you need only one channel and not very high freq, you could use the PWM modules in a PIC. They do a pretty good job I tested, and the fine thing they run automagically i. e. the software must only intervenied if level changes. Regards, Imre +-----------------------------------------------------------------------+ | The information transmitted is intended only for the person or entity | | to which it is addressed and may contain confidential and/or | | privileged material. Any review, retransmission, dissemination or | | other use of, or taking of any action in reliance upon, this =09 | | information by persons or entities other than the intended recipient | | is prohibited. If you received this in error, please contact the | | sender and delete the material from any computer. | +-----------------------------------------------------------------------+ On Sat, 17 Mar 2001, [iso-8859-1] Osvaldo Le=F3n Delgado wrote: > Do I sit down it but although this microcontroller is very astonishing, i= s > not it gotten here in the city of Mexico, is what I need to make some > modifications in my current program, is somebody able to please to help m= e > with my convertor of digital to similar DAC??? > Thank you !!!............Osvaldo > > > ----- Original Message ----- > From: "Dinho AeS" > To: > Sent: Wednesday, March 27, 2002 7:45 AM > Subject: RES: DAC > > > Try to check the PSoC uC from Cypress. It is really amazing!! > > www.cypressmicro.com > > -----Mensagem original----- > De: pic microcontroller discussion list [mailto:PICLIST@MITVMA.MIT.EDU] > Em nome de Osvaldo Lesn Delgado > Enviada em: sexta-feira, 16 de margo de 2001 17:55 > Para: PICLIST@MITVMA.MIT.EDU > Assunto: DAC > > > Please, I need a DAC, do you have any? Tanks!!!............Osvaldo > > I using the PIC16F628 am at the moment but it doesn't work me, here > this the program...... > > http://www.microchip.com/download/appnote/devspec/16cxx/00655a.pdf > > ERRORLEVEL 0, -302 > ;*********************************************************************** > ************************************************** > TITLE "PWM based sine wave generator" > LIST P=3D16F628, R=3DDEC > > INCLUDE > LIST > ; P16F628.INC Standard Header File, Versisn 1.01 Microchip Technology, > Inc. LIST __CONFIG _BODEN_OFF&_CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC > ; > ;*********************************************************************** > ************************************************** > ; File: SINE.ASM > ; Author: Rob Stein > ; Date: 12/20/95 > ; Assembler: MPASM V01.40 > ; Xtal: 20 Mhz > ; Inst Clk: 5 Mhz (200nSec) > ;*********************************************************************** > ************************************************** > ; Description: > ; Outputs a 60 hz sythesized sine wave (32 step) via a general ; purpose > I/O pin (RB1) into a low pass filter. A software PWM ; routine is used > to create 32 separate sinewave steps. This ; software was prototyped > whith the PICDEM1 board. ; ; Circuit Diagram: ; > ; 2.7k 2.7k > ; RB1 __/\ /\ /\_____/\ /\ /\_____ Analog Output > ; \/ \/ | \/ \/ | > ; | | > ; ----- 0.15F ----- 0.15F > ; > ; ----- ----- > ; | | > ; | | > ; GND GND > ; > ; ROM Usage: 98 words > ; > ; RAM Usage: 6 bytes > ; > ;*************************** Constant Definition > *********************************************************************** > > FXTAL EQU .20000000 ; Crystal Frecuency > FINST EQU FXTAL/4 ; Instruction Cycle Frecuency > FSINE EQU .60 ; Sine Function Frecuency > STEP# EQU .32 ; Number of steps > FSTEP EQU FSINE * STEP# ; Step frecuency > > ;*************************** Register definition > ********************************************************************** > > TEMPW EQU 0x20 ; Temporary interrup storage for w > DELAYCNT1 EQU 0x21 ; Delay routine counter low > DELAYCNT2 EQU 0x22 ; Delay routine counter high > STEPCOUNT EQU 0x23 ; Sine step counter > OUTLOW EQU 0x24 ; PWM low cycle load TMR0 > OUTHIGH EQU 0x25 ; PWM high cycle load for TMR0 > OPTION_REG EQU 0x81 > TRISA EQU 0X85 > TRISB EQU 0X86 > > ;******************************* Bit Definition > ************************************************************************ > > PWM EQU 0x01 ; RB1 used for PWM output > > ;*********************************************************************** > ************************************************** > ; Reset Vector > ;*********************************************************************** > ************************************************** > > org 0x000 > goto Start ; Begining of Program > > ;*********************************************************************** > ************************************************** > ; Interrup Vector and Service Routine > ; This interrup routine is entered via an overflow of TMR0 from ; 0xFF > to 0x00. A test of RB1 deteermines if the next time state ; is a high > or low cycle. The next interrupt will occur based the ; TMR0 reload > value (OUTLOW or OUTHIGH). ; ; The interrup routine was designed to use > a minimial number of ; instruction cycles. This was doen to maximize > the PWM duty cycle ; range (ie. a 5% to 95% range is achievable with > this ISR). Note > ; that 'swapf' instructions are used to perform register moves without > ; effecting the STATUS flags (this saves instruction cycles by > ; eliminating the need to temporarily save the STATUS register). ; > ;*********************************************************************** > ************************************************** > > org 0x004 ; Interrupt vector location > IntVector > movwf TEMPW ; Temporary save W > btfsc PORTB, PWM ; Was this a low cycle ? > goto PWMLow ; No... > PWMHigh > swapf OUTHIGH,W ; Yes...Load hi-time w/o affecting STATUS flags > > bsf PORTB, PWM > nop ; Delay to equalize high/low TMR0 lload cycles > movwf TMR0 ; Load next edge interrupt time > bcf INTCON, T0IF ; Clear TMR0 overflow flag > swapf TEMPW,F ; Swap saved W > swapf TEMPW,W ; Restore W > IntEndHi > retfie ; Return from Interrupt > PWMLow > bcf PORTB, PWM > swapf OUTLOW,W ; Load low time > movwf TMR0 ; Load next edge interrupt time > bcf INTCON,T0IF ; Clear TMR0 overflow flag > swapf TEMPW,F ; Swap saved w > swapf TEMPW,W ; Restore W > IntEndLo > retfie ; Return from Interrupt > > ;*********************************************************************** > ************************************************** > ; Main Routine > ;*********************************************************************** > ************************************************** > Start > clrf STATUS ; Initialize STATUS & select bank 0 > bsf STATUS,RP0 ; Select register bank 1 > movlw 0x88 > movwf OPTION_REG ; 1:1 TMR0 prescaler, PORTB pull-ups disabled > movlw 0xFF > movwf TRISA ; Set Port_A as inputs > clrf TRISB ; Set Port_B as outputs > bcf STATUS,RP0 ; Select register bank 0 > movwf PORTB ; PORT_B pins high > clrf TMR0 ; Initialize TMR0 > movlw 0xA0 > movwf INTCON ; Enable TMR0 and global interrupt > ResetStep > movlw STEP# > movwf STEPCOUNT ; Load counter for 32 steps > StepLoop > call Delay ; Software delay > movf STEPCOUNT,W ; Pass table offset via w > call SineTable ; Get table value > call SetPWM ; Set-Up low & high PWM values > decfsz STEPCOUNT,F ; Next step > goto StepLoop > goto ResetStep > > ;*********************************************************************** > ************************************************** > ; Set PWM Subrutine * > ; The followin calculates the next low and high PWM time values. > * > ; The two time values, OUTLOW and UOTHIGH, will be passed to the > * > ; interrupt service routine. * > ;*********************************************************************** > ************************************************** > SetPWM > bcf INTCON,GIE ; Disable interrupts to protect ISR from.... > ; corrrupting OUTLOW & OUTHIGH values > movwf OUTLOW ; Set PWM Duty Cycle > comf OUTLOW,W > > addlw IntEndHi-IntVector ; Adjust for Int Service time > movwf OUTHIGH > movf OUTLOW,W > addlw IntEndHi-IntVector ; Adjust for Int Service time > movwf OUTLOW > > swapf OUTLOW,F ; Swap nibbles so that interrupt service... > swapf OUTHIGH,F ; will not corrupt STATUS > bsf INTCON, GIE ; Re-enable interrupts > return > > ;*********************************************************************** > ************************************************* > ; Lookup Table for Sine Wave > ; This 32 entry table was generated to produce a 0.1*Vdd to > ; 0.9*Vdd (typicaly 0.5 to 4.5 volt) sine function. > ;*********************************************************************** > ************************************************* > SineTable > addwf PCL,F ; Increment into table > retlw .0 ; Dummy table value > retlw .128 ; 0 degree, 2.5 volt > retlw .148 > retlw .167 > retlw .185 > retlw .200 > retlw .213 > retlw .222 > retlw .228 > retlw .230 ; 90 degree, 4.5 volt > retlw .228 > retlw .222 > retlw .213 > retlw .200 > retlw .185 > retlw .167 > retlw .148 > retlw .128 ; 180 degree, 2.5 volt > retlw .108 > retlw .89 > retlw .71 > retlw .56 > retlw .43 > retlw .34 > retlw .28 > retlw .26 ; 270 degree, 2.5 volt > retlw .28 > retlw .34 > retlw .43 > retlw .56 > retlw .71 > retlw .89 > retlw .108 > > ;*********************************************************************** > ************************************************* > ; Time Delay Sub-routine * > ; The time delay is used to create the precisin 32 steps. The * > ; 32 step times totaled together add up to a 60 Hz rate. Note that > * > ; constants DELAYCNT# are used so that other frecuencies can easily > * > ; be generated (example: FSINE equ .50 for a 50 Hz sinewave). * > ;*********************************************************************** > ************************************************* > TDELAY EQU FINST/FSTEP ; # of delay count cycles > ADJTDELAY EQU TDELAY/3 - 55 ; Adjust for main routine cycles TDELAYHI > EQU high ADJTDELAY ; Most Significant Byte of TDELAY TDELAYLO EQU low > ADJTDELAY ; Lest Sig. Byte of TDELAY > > > Delay > movlw TDELAYHI > movwf DELAYCNT2 ; Load high byte delay counter > clrf DELAYCNT1 > LoopD1 > decfsz DELAYCNT1,F ; Finished with 256 loops ? > goto LoopD1 ; No...keep going > decfsz DELAYCNT2,F ; Yes...Done with TDELAYHI loops ? > goto LoopD1 ; No... > > movlw TDELAYLO ; Yes...Load low byte with adjust for... > movwf DELAYCNT1 ; main routine cycles. > LoopD2 > decfsz DELAYCNT1,F ; Finished with TDELAYLO loops ? > goto LoopD2 ; No...keep going > return ; Yes...Finished > > END ; That's all Folks ! > > -- > http://www.piclist.com#nomail Going offline? Don't AutoReply us! email > listserv@mitvma.mit.edu with SET PICList DIGEST in the body > > -- > http://www.piclist.com hint: To leave the PICList > mailto:piclist-unsubscribe-request@mitvma.mit.edu > > -- > http://www.piclist.com hint: To leave the PICList > mailto:piclist-unsubscribe-request@mitvma.mit.edu > > > -- http://www.piclist.com hint: PICList Posts must start with ONE topic: [PIC]:,[SX]:,[AVR]: ->uP ONLY! [EE]:,[OT]: ->Other [BUY]:,[AD]: ->Ads