Pentru scrierea softului am folosit Codevision. Am
folosit 2 variabile de tip float volti si adc.
In registrul ADC stocam informatia citita pe pinul 40 al uC iar in
variabila volti o prelucram dupa
formula:
Vin[V]=(ADCW·Vref[V])/1024
Am folosit functia unsigned int read_adc(unsigned char adc_input)
pentru a citi valoarea analogica de pe pinii convertorului. Pentru a activa
ADC-ul se seteaza bitul ADEN din registrul ADCSRA. Implicit rezultatul va fi
aliniat la dreapta (ADCL apoi ADCH). Pentru a incepe o conversie se seteaza
ADSC.
Ultimii 3 biti din ADCSRA sunt destinati setarii frecventei
de esantionare(pre-scale). Circuitul de aproximari succesive necesita o
frecventa intre 50 kHz si 200 kHz iar introducerea unei frecvente mai mari duce
la scaderea preciziei. In acest caz s-a ales un factor de pre-scale de 115 kHz.
Circuitul prezinta un multiplexor de selectie a canalului de
intrare ce va fi setat in registrul ADMUX.
Primii 2 biti sunt destinati pentru alegerea tensiunii de
referinta. In cazul nostru ambii biti sunt setati 1, pentru a folosi tensiunea
de referinta interna. Ultimii 4 biti ai acestui registru sunt destinati
alegerii pinilor de intrare. Pinii de intrare analogica sunt plasati pe PORTA
al microcontrolerului. In cazul nostru ei sunt 0000, deoarece dorim citirea
tensiuniii de pe pinul 0.Urmatorul bit (bitul 5 in ordine inversa) il setam 1
pentru left adjust.
Pentru a incepe o conversie se seteaza bitul ADSC din
registrul ADCSRA ,iar pentru a citi valoarea din registru trebuie sa ne
incadram intre 2 conversii successive.
Urmatorul pas in scrierea programului este setarea pinilor
de intrare si de iesire.Am setat pinul A.5 cu rezistenta de pull up ,deorece va
fi pin de intrare care ne ajuta la comutare scalei in program.Acest lucru se
realizeaza prin setarea bitului corespunzator pinului 5 din registrul
PORTA.Pentru a-l seta ca pin de intrare scriem in registrul DDRA valoarea 0.Pinul
D.5 dorim sa il folosim ca pin de iesire si vom seta bitul din registrul
DDRD cu valoarea 0. Pentru pornirea watchdogtimerului trebuie setate 2 valori
consecutive in registrul WDTCR.
In esenta, watchdogul este un
temporizator a carui expirare duce la generarea semnalului RESET pentru
procesor.
WDTCR=0x1F;
WDTCR=0x0F;
Pentru depasirea scalei am citit valoarea din ADCW, si cu
ajutorul functiei if depasirea scalei este semnalizata atat de un mesaj pe
display cat si de pornirea unui led.
Pentru comutarea scalei din soft citim valoarea pinului A.5
if(PINA.5 ==1) {
volti = ((adc
*2.56)/1024); }
else
volti = ((adc
*2.56)/1024)*10;
iar pentru afisarea pe diplay am folosit functia :
sprintf(lcd_buffer," Volti = %3.3fV ",volti)
Probleme:
1. Nu am setat frecventa clockului.
2. Nu am setat suportul pentru reprezentarea float a softului.