No exact or substring matches. trying for part
PICList
Thread
'[PICLIST] DAC, Please Help me....!!!!'
2002\03\27@142236
by
Osvaldo_Le=F3n_Delgado?=
|
I am making a convertor of digital to similar, already compile this program of the microchip page but to the moment to arm it, surprise!!!!, don't work me, somebody could please help myself...!!! Thank you...........Osvaldo That I should make so that it works with the pic 16F628???
The program this in the page of Microchip for the pic 16F620:
http://www.microchip.com/download/appnote/devspec/16cxx/00655a.pdf
but I adapt it for the pic 16F628:
ERRORLEVEL 0, -302
;*************************************************************************************************************************
TITLE "PWM based sine wave generator"
LIST P=16F628, R=DEC
INCLUDE <P16F628.INC>
LIST
; P16F628.INC Standard Header File, Versión 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.1µF ----- 0.1µF ;
; ----- -----
; | |
; | |
; 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 hint: To leave the PICList
spam_OUTpiclist-unsubscribe-requestTakeThisOuT
mitvma.mit.edu
More... (looser matching)
- Last day of these posts
- In 2002
, 2003 only
- Today
- New search...