Indice |
Introduzione
Eccomi ancora una volta a parlarvi di una mia recente esperienza che desidero condividere con voi. Si tratta di alcune prove fatte con un nuovo pic, nuovo almeno per me, la cui sigla è 16F1705, un piccoletto da 7+7 pin, ma con un cuore così grande da rimanerne sbalordito. Il mio interesse per questo piccolo gigante è nato per caso, dopo essermi accorto spulciando il sito ufficiale della Microchip, che tra tutte le altre cose, a bordo ospita anche un DAC ossia un convertitore digitale analogico da 8 bit. Poca cosa direbbero in tanti ma a me è subito piaciuto, soprattutto per le sue piccole dimensioni e per la sua grande flessibilità. Immediatamente ho anche fantasticato sulle possibili applicazioni offerte da tale opportunità, pensando ad uno scrambler, ad un oscillatore seno-coseno, ad un generatore di forme d’onda programmabile ed altro ancora.
L’ interno
Elencarvi i vari blocchi interni che sono davvero tanti non credo sia il caso, chi lo desidera può scaricarsi il datasheet dal sito della Microchip che ho trovato molto chiaro, completo ed esaustivo. Quindi come prima cosa, me ne sono procurato subito uno, ed ho fatto alcune prove, con risultati che a me sembrano molto interessanti e di cui vi illustro più avanti i vari aspetti, sperando di non tralasciare nulla. Lo schema utilizzato per le mie prove, se di schema si può parlare, è visibile nella figura che segue, come vedete è davvero ridotto all’osso, infatti non c’è niente oltre al pic, nemmeno il quarzo per il clock da 32 Mhz, che viene generato internamente e più avanti vedremo come.
Così come suggerito nel datasheet, vista l’alta impedenza d’uscita del DAC, è consigliabile usare un buffer, ed in questo caso ho preferito utilizzare uno dei due amplificatori operazionali interni al chip, seguito da un semplice filtro passa basso RC, che rende la già molto precisa sinusoide, quasi perfetta, eliminando la leggera gradinatura del segnale presente sul pin 8. Vedi foto.
La parte che ci interessa approfondire l’ho copiata dal datasheet, ed è rappresentata nello schema a blocchi che segue, dove nella parte centrale è visibile il convertitore DAC vero e proprio; nel lato sinistro la parte che riguarda la selezione della tensione di riferimento positiva e negativa per il DAC, a destra in basso le uscite utilizzabili ed in alto gli otto bit da convertire.
Software
Per la scrittura e la simulazione del software ho usato “MPLAB V8.92”, mentre per la scrittura del pic ho usato “propic2“ abbinato al software “melabs Programmer 4.52 beta”.A fine articolo troverete anche il file ASM che ho corredato di alcune indicazioni per renderlo più leggibile, ma se qualcosa ho dimenticato me ne scuso ed eventualmente su richiesta cercherò di rimediare. Voglio solo precisare che la tabella dei dati nel file ASM, contiene solo i valori del seno compresi tra 0° e 90°, gli altri valori tra 90° e 180° essendo speculari ai precedenti, li ho ottenuti leggendo la tabella al contrario da 90° a 0°. Lo stesso discorso vale per la parte negativa della sinusoide, dove i dati ricavati dalla tabella sono di volta in volta sottratti al valore 254, ottenendo in questo mado anche i valori da 180° fino a 360°.
Sinusoide
I valori che leggete in tabella sono ottenuti moltiplicando il seno dell’angolo per 100 e sommando il risultato ottenuto a 127, in questo modo la sinusoide sarà centrata a circa ½ della VCC. In questo caso ho considerato tutti i valori tra 0° e 360° ottenendo una frequenza della sinusoide di circa 556 Hz, ma i risultati sarebbero ancora accettabili anche prendendo solo i valori pari, o solo i dispari, ottenendo ovviamente un valore di frequenza doppio. Insomma, come accade sempre in questi casi, non ci sono limiti alla fantasia, e si possono implementare con questo DAC anche le cose più stravaganti, come generare un segnale di forma prestabilita ed assolutamente originale.
Nella figura seguente è invece visibile lo schema a blocchi che genera il clock, con evidenziato il percorso della logica che permette di generare 32 MHz partendo da un riferimento di appena 500 kHz, si capisce come seguendo logiche diverse si possa scendere fino a 31,25 kHz.
Per qualunque chiarimento non esitate a contattarmi.
Saluti e buon divertimento.
Francesco.
it9dpx #135
File asm
- *************************
- sinusoide 280415 1132
- *************************
PROCESSOR 16F1704 RADIX DEC INCLUDE "P16F1704.INC" ERRORLEVEL -302 ERRORLEVEL -305 ORG 130H
GRADI RES 1
SENO RES 1
SETTORE RES 1
__CONFIG H'8007', H'3FA4' __CONFIG H'8008', H'1FFF' ORG 00 GOTO VIA
- ----INTERRUPT---------
ORG 04 MOVLB 0 MOVLW 240 MOVWF TMR0 MOVLB 2 MOVFW SENO MOVWF DAC1CON1 BTFSS SETTORE,0 GOTO INCREMENTA GOTO DECREMENTA
INCREMENTA
INCF GRADI MOVFW GRADI XORLW 90 BTFSS STATUS,Z GOTO FINE_LAVORO INCF SETTORE GOTO FINE_LAVORO
DECREMENTA
DECF GRADI BTFSS STATUS,Z GOTO FINE_LAVORO INCF SETTORE
FINE_LAVORO
MOVFW GRADI CALL ONDA BTFSS SETTORE,1 SUBLW 254 ;SEMIONDA NEGATIVA MOVWF SENO BCF INTCON,2 RETFIE
- ----FINE INTERRUPT---------
VIA
MOVLB 1 MOVLW B'11110000' MOVWF OSCCON MOVLW B'10100000' MOVWF INTCON CLRF OPTION_REG MOVLB 2 MOVLW B'10000000' MOVWF DAC1CON0 CLRF GRADI CLRF SETTORE MOVLB 10 MOVLW B'10010010' MOVWF OPA1CON MOVLB 0 MOVLW 240 MOVWF TMR0
ATTESA
NOP NOP NOP GOTO ATTESA
ONDA
ADDWF PCL
- dati da 0° a 90°
RETLW 127 RETLW 129 RETLW 130 RETLW 132 RETLW 134 RETLW 136 RETLW 137 RETLW 139 RETLW 141 RETLW 143 RETLW 144 RETLW 146 RETLW 148 RETLW 149 RETLW 151 RETLW 153 RETLW 155 RETLW 156 RETLW 158 RETLW 160 RETLW 161 RETLW 163 RETLW 164 RETLW 166 RETLW 168 RETLW 169 RETLW 171 RETLW 172 RETLW 174 RETLW 175 RETLW 177 RETLW 179 RETLW 180 RETLW 181 RETLW 183 RETLW 184 RETLW 186 RETLW 187 RETLW 189 RETLW 190 RETLW 191 RETLW 193 RETLW 194 RETLW 195 RETLW 196 RETLW 198 RETLW 199 RETLW 200 RETLW 201 RETLW 202 RETLW 204 RETLW 205 RETLW 206 RETLW 207 RETLW 208 RETLW 209 RETLW 210 RETLW 211 RETLW 212 RETLW 213 RETLW 214 RETLW 214 RETLW 215 RETLW 216 RETLW 217 RETLW 218 RETLW 218 RETLW 219 RETLW 220 RETLW 220 RETLW 221 RETLW 222 RETLW 222 RETLW 223 RETLW 223 RETLW 224 RETLW 224 RETLW 224 RETLW 225 RETLW 225 RETLW 225 RETLW 226 RETLW 226 RETLW 226 RETLW 226 RETLW 227 RETLW 227 RETLW 227 RETLW 227 RETLW 227 RETLW 227
- fine dati
END .
File hex
- 020000040000FA
- 020000001F28B7
- 080008002000F03095002200F9
- 1000100031089900321C0D281428B00A30085A3AC9
- 10002000031D1828B20A1828B003031D1828B20AA5
- 1000300030083420B21CFE3CB1000B110900210035
- 10004000F0309900A0308B0095012200803098009C
- 10005000B001B2012A00923091002000F0309500EA
- 10006000000000000000302882077F348134823491
- 1000700084348634883489348B348D348F3490348E
- 10008000923494349534973499349B349C349E3410
- 10009000A034A134A334A434A634A834A934AB3496
- 1000A000AC34AE34AF34B134B334B434B534B73423
- 1000B000B834BA34BB34BD34BE34BF34C134C234B6
- 1000C000C334C434C634C734C834C934CA34CC3455
- 1000D000CD34CE34CF34D034D134D234D334D434FC
- 1000E000D534D634D634D734D834D934DA34DA34B3
- 1000F000DB34DC34DC34DD34DE34DE34DF34DF3476
- 10010000E034E034E034E134E134E134E234E23448
- 10011000E234E234E334E334E334E334E334E33429
- 06026000FF3FFF3FFF3FDE
- 020000040001F9
- 02000E00A43F0D
- 02001000FF1FD0
- 00000001FF