Building a luxmeter with photodiode for continuous light

Thread Starter

UsedThunderbolt

Joined Jan 24, 2018
1
Hello everyone, first of all sorry for my language but I'm not a native english, but italian so please be patient!
I'm working on a team project for my university and we need to build and programmate (using ATMEL8 and avr)!

We use a photodiode, flash it and show conversion on 3 LEDs with switch:
> When switch is OFF we display 888 (that's work perfectly)
> When switch is ON we need to display BCD: 1 klux is 001
[Keep writing...]

first of all here our code:
Code:
;
; Prova_vecchiolampeggio.asm
;
;
; Created: 23/01/2017 16:58:55
; Author : Edoardo
;
;
; Le prossime tre righe sono necessarie per AVR Studio 4
;.NOLIST
;.INCLUDE "atmega8.inc"
;.LIST
;
;
; Definizione dei registri utilizzati
.DEF mp = R16 ; purpose register
.DEF mp1 = R17 ; registro di lavoro secondario (generico)
.DEF vard = R18 ; vard in interrupt subroutine
.DEF vars = R19 ; vars in interrupt subroutine
.DEF f_conv = R20 ; conversion flag
.DEF f_soglia = R21 ; battery flag
.DEF f_switch = R22 ; switch flag
.DEF klux = R23 ; temporary register for klux
.DEF mp2 = R24
;
.EQU T_BAT = 100 ; control time interval for battery
.EQU T_SWITCH = 49 ; control time interval for switch (more or less 500 ms
.EQU T_LED = 50 ; flashing time interval
.EQU THSH_sup = 240 ; high edge voltage
.EQU THSH_inf = 225 ; low edge voltage
.EQU THSWITCH = 120 ; switch tension edge
;
;
.cseg lut:
;
.db 255 , 2 , 5 , 5
.db 254 , 2 , 5 , 4
.db 253 , 2 , 5 , 3
.db 252 , 2 , 5 , 2
.db 251 , 2 , 5 , 1
.db 250 , 2 , 5 , 0
.db 249 , 2 , 4 , 9
.db 248 , 2 , 4 , 8
.db 247 , 2 , 4 , 7
.db 246 , 2 , 4 , 6
.db 245 , 2 , 4 , 5
.db 244 , 2 , 4 , 4
.db 243 , 2 , 4 , 3
.db 242 , 2 , 4 , 2
.db 241 , 2 , 4 , 1
.db 240 , 2 , 4 , 0
.db 239 , 2 , 3 , 9
.db 238 , 2 , 3 , 8
.db 237 , 2 , 3 , 7
.db 236 , 2 , 3 , 6
.db 235 , 2 , 3 , 5
.db 234 , 2 , 3 , 4
.db 233 , 2 , 3 , 3
.db 232 , 2 , 3 , 2
.db 231 , 2 , 3 , 1
.db 230 , 2 , 3 , 0
.db 229 , 2 , 2 , 9
.db 228 , 2 , 2 , 8
.db 227 , 2 , 2 , 7
.db 226 , 2 , 2 , 6
.db 225 , 2 , 2 , 5
.db 224 , 2 , 2 , 4
.db 223 , 2 , 2 , 3
.db 222 , 2 , 2 , 2
.db 221 , 2 , 2 , 1
.db 220 , 2 , 2 , 0
.db 219 , 2 , 1 , 9
.db 218 , 2 , 1 , 8
.db 217 , 2 , 1 , 7
.db 216 , 2 , 1 , 6
.db 215 , 2 , 1 , 5
.db 214 , 2 , 1 , 4
.db 213 , 2 , 1 , 3
.db 212 , 2 , 1 , 2
.db 211 , 2 , 1 , 1
.db 210 , 2 , 1 , 0
.db 209 , 2 , 0 , 9
.db 208 , 2 , 0 , 8
.db 207 , 2 , 0 , 7
.db 206 , 2 , 0 , 6
.db 205 , 2 , 0 , 5
.db 204 , 2 , 0 , 4
.db 203 , 2 , 0 , 3
.db 202 , 2 , 0 , 2
.db 201 , 2 , 0 , 1
.db 200 , 2 , 0 , 0
.db 199 , 1 , 9 , 9
.db 198 , 1 , 9 , 8
.db 197 , 1 , 9 , 7
.db 196 , 1 , 9 , 6
.db 195 , 1 , 9 , 5
.db 194 , 1 , 9 , 4
.db 193 , 1 , 9 , 3
.db 192 , 1 , 9 , 2
.db 191 , 1 , 9 , 1
.db 190 , 1 , 9 , 0
.db 189 , 1 , 8 , 9
.db 188 , 1 , 8 , 8
.db 187 , 1 , 8 , 7
.db 186 , 1 , 8 , 6
.db 185 , 1 , 8 , 5
.db 184 , 1 , 8 , 4
.db 183 , 1 , 8 , 3
.db 182 , 1 , 8 , 2
.db 181 , 1 , 8 , 1
.db 180 , 1 , 8 , 0
.db 179 , 1 , 7 , 9
.db 178 , 1 , 7 , 8
.db 177 , 1 , 7 , 7
.db 176 , 1 , 7 , 6
.db 175 , 1 , 7 , 5
.db 174 , 1 , 7 , 4
.db 173 , 1 , 7 , 3
.db 172 , 1 , 7 , 2
.db 171 , 1 , 7 , 1
.db 170 , 1 , 7 , 0
.db 169 , 1 , 6 , 9
.db 168 , 1 , 6 , 8
.db 167 , 1 , 6 , 7
.db 166 , 1 , 6 , 6
.db 165 , 1 , 6 , 5
.db 164 , 1 , 6 , 4
.db 163 , 1 , 6 , 3
.db 162 , 1 , 6 , 2
.db 161 , 1 , 6 , 1
.db 160 , 1 , 6 , 0
.db 159 , 1 , 5 , 9
.db 158 , 1 , 5 , 8
.db 157 , 1 , 5 , 7
.db 156 , 1 , 5 , 6
.db 155 , 1 , 5 , 5
.db 154 , 1 , 5 , 4
.db 153 , 1 , 5 , 3
.db 152 , 1 , 5 , 2
.db 151 , 1 , 5 , 1
.db 150 , 1 , 5 , 0
.db 149 , 1 , 4 , 9
.db 148 , 1 , 4 , 8
.db 147 , 1 , 4 , 7
.db 146 , 1 , 4 , 6
.db 145 , 1 , 4 , 5
.db 144 , 1 , 4 , 4
.db 143 , 1 , 4 , 3
.db 142 , 1 , 4 , 2
.db 141 , 1 , 4 , 1
.db 140 , 1 , 4 , 0
.db 139 , 1 , 3 , 9
.db 138 , 1 , 3 , 8
.db 137 , 1 , 3 , 7
.db 136 , 1 , 3 , 6
.db 135 , 1 , 3 , 5
.db 134 , 1 , 3 , 4
.db 133 , 1 , 3 , 3
.db 132 , 1 , 3 , 2
.db 131 , 1 , 3 , 1
.db 130 , 1 , 3 , 0
.db 129 , 1 , 2 , 9
.db 128 , 1 , 2 , 8
.db 127 , 1 , 2 , 7
.db 126 , 1 , 2 , 6
.db 125 , 1 , 2 , 5
.db 124 , 1 , 2 , 4
.db 123 , 1 , 2 , 3
.db 122 , 1 , 2 , 2
.db 121 , 1 , 2 , 1
.db 120 , 1 , 2 , 0
.db 119 , 1 , 1 , 9
.db 118 , 1 , 1 , 8
.db 117 , 1 , 1 , 7
.db 116 , 1 , 1 , 6
.db 115 , 1 , 1 , 5
.db 114 , 1 , 1 , 4
.db 113 , 1 , 1 , 3
.db 112 , 1 , 1 , 2
.db 111 , 1 , 1 , 1
.db 110 , 1 , 1 , 0
.db 109 , 1 , 0 , 9
.db 108 , 1 , 0 , 8
.db 107 , 1 , 0 , 7
.db 106 , 1 , 0 , 6
.db 105 , 1 , 0 , 5
.db 104 , 1 , 0 , 4
.db 103 , 1 , 0 , 3
.db 102 , 1 , 0 , 2
.db 101 , 1 , 0 , 1
.db 100 , 1 , 0 , 0
.db 99 , 0 , 9 , 9
.db 98 , 0 , 9 , 8
.db 97 , 0 , 9 , 7
.db 96 , 0 , 9 , 6
.db 95 , 0 , 9 , 5
.db 94 , 0 , 9 , 4
.db 93 , 0 , 9 , 3
.db 92 , 0 , 9 , 2
.db 91 , 0 , 9 , 1
.db 90 , 0 , 9 , 0
.db 89 , 0 , 8 , 9
.db 88 , 0 , 8 , 8
.db 87 , 0 , 8 , 7
.db 86 , 0 , 8 , 6
.db 85 , 0 , 8 , 5
.db 84 , 0 , 8 , 4
.db 83 , 0 , 8 , 3
.db 82 , 0 , 8 , 2
.db 81 , 0 , 8 , 1
.db 80 , 0 , 8 , 0
.db 79 , 0 , 7 , 9
.db 78 , 0 , 7 , 8
.db 77 , 0 , 7 , 7
.db 76 , 0 , 7 , 6
.db 75 , 0 , 7 , 5
.db 74 , 0 , 7 , 4
.db 73 , 0 , 7 , 3
.db 72 , 0 , 7 , 2
.db 71 , 0 , 7 , 1
.db 70 , 0 , 7 , 0
.db 69 , 0 , 6 , 9
.db 68 , 0 , 6 , 8
.db 67 , 0 , 6 , 7
.db 66 , 0 , 6 , 6
.db 65 , 0 , 6 , 5
.db 64 , 0 , 6 , 4
.db 63 , 0 , 6 , 3
.db 62 , 0 , 6 , 2
.db 61 , 0 , 6 , 1
.db 60 , 0 , 6 , 0
.db 59 , 0 , 5 , 9
.db 58 , 0 , 5 , 8
.db 57 , 0 , 5 , 7
.db 56 , 0 , 5 , 6
.db 55 , 0 , 5 , 5
.db 54 , 0 , 5 , 4
.db 53 , 0 , 5 , 3
.db 52 , 0 , 5 , 2
.db 51 , 0 , 5 , 1
.db 50 , 0 , 5 , 0
.db 49 , 0 , 4 , 9
.db 48 , 0 , 4 , 8
.db 47 , 0 , 4 , 7
.db 46 , 0 , 4 , 6
.db 45 , 0 , 4 , 5
.db 44 , 0 , 4 , 4
.db 43 , 0 , 4 , 3
.db 42 , 0 , 4 , 2
.db 41 , 0 , 4 , 1
.db 40 , 0 , 4 , 0
.db 39 , 0 , 3 , 9
.db 38 , 0 , 3 , 8
.db 37 , 0 , 3 , 7
.db 36 , 0 , 3 , 6
.db 35 , 0 , 3 , 5
.db 34 , 0 , 3 , 4
.db 33 , 0 , 3 , 3
.db 32 , 0 , 3 , 2
.db 31 , 0 , 3 , 1
.db 30 , 0 , 3 , 0
.db 29 , 0 , 2 , 9
.db 28 , 0 , 2 , 8
.db 27 , 0 , 2 , 7
.db 26 , 0 , 2 , 6
.db 25 , 0 , 2 , 5
.db 24 , 0 , 2 , 4
.db 23 , 0 , 2 , 3
.db 22 , 0 , 2 , 2
.db 21 , 0 , 2 , 1
.db 20 , 0 , 2 , 0
.db 19 , 0 , 1 , 9
.db 18 , 0 , 1 , 8
.db 17 , 0 , 1 , 7
.db 16 , 0 , 1 , 6
.db 15 , 0 , 1 , 5
.db 14 , 0 , 1 , 4
.db 13 , 0 , 1 , 3
.db 12 , 0 , 1 , 2
.db 11 , 0 , 1 , 1
.db 10 , 0 , 1 , 0
.db 9 , 0 , 0 , 9
.db 8 , 0 , 0 , 8
.db 7 , 0 , 0 , 7
.db 6 , 0 , 0 , 6
.db 5 , 0 , 0 , 5
.db 4 , 0 , 0 , 4
.db 3 , 0 , 0 , 3
.db 2 , 0 , 0 , 2
.db 1 , 0 , 0 , 1
.db 0 , 0 , 0 , 0
;
;
;
;
; La direttiva .DEF rinomina uno dei 32 registri di utilizzo generale con
; un nome facile da ricordare durante la scrittura e la rilettura del
; codice sorgente.
; Il compilatore effettua una semplice sostituzione di ciascuna occorrenza
; che trova nel listato durante la compilazione.
; Un altro vantaggio non trascurabile è rappresentato dal fatto che quando
; si vuole cambiare un registro, è sufficiente ridefinire il nome all'inizio
; del sorgente, senza dovere modificare tutti i nomi attraverso l'intero listato.
;
rjmp RESET ; Reset Handler
reti ;rjmp EXT_INT0 ; IRQ0 Handler
reti ;rjmp EXT_INT1 ; IRQ1 Handler
reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
reti ;jmp TIM2_OVF ; Timer2 Overflow Handler
reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ;Timer0 Overflow Handler
reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
reti ;rjmp USART_RXC ; USART RX Complete Handler
reti ;rjmp USART_UDRE ; UDR Empty Handler
reti ;rjmp USART_TXC ; USART TX Complete Handler
rjmp ADC_conv ; ADC Conversion Complete Handler
reti ;rjmp EE_RDY ; EEPROM Ready Handler
reti ;rjmp ANA_COMP ; Analog Comparator Handler
reti ;rjmp TWSI ; Two-wire Serial Interface Handler
reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler
;
;
;
RESET:
; In questo punto inizia la routine principale del programma, che deve
; essere un 'loop' chiuso, o terminare con un 'loop' infinito.
;
ldi mp,0x04
out SPH,mp
ldi mp,0x5f
out SPL,mp
;
; E' ***** F O N D A M E N T A L E ***** che una delle prime istruzioni provvedano
; ad impostare il valore dello stack pointer !!!!! ; in ogni caso ciò deve
; avvenire almeno prima di una chiamata effettuata attraverso una 'call',
; prima di abilitare un'interrupt, o prima di utilizzare istruzioni che
; intervengano a modificarne il contenuto durante il programma.
; In genere lo stack viene allocato all'indirizzo corrispondente alla parte
; alta della RAM disponibile, poiché lo stack pointer, quando utilizzato viene
; decrementato e successivamente incrementato dopo l'utilizzo.
;
ldi mp,0b00000001
; La prima operazione da fare per utilizzare una porta di I/O è quella di definire
; quali pin sono utilizzati come uscite e quali come ingressi.
; I pin che sono usati come uscite, nel nostro caso per pilotare un led, devono
; avere il corrispondente bit nel registro direzione dati ad '1'.
; I rimanenti in ingresso devono avere i bit a '0'.
;
out DDRC,mp
out DDRB,mp
ldi mp, 0b00000000
out DDRD,mp
;
; L'istruzione out serve per scrivere un valore in un registro di I/O, in questo
; caso il valore di R16 nel registro direzione dati.
;
ldi mp,0x00
out PORTC,mp
out PORTB,mp
ldi mp,0b11100000
out PORTD,mp
;
; Questa istruzione scrive il valore di zero nella porta C e B, il led resta spento.
;
ldi mp,0b00000101
out TCCR0,mp
; seleziona prescaler passo 1024 (se 1MHz allora 1024us)
;
ldi mp,246
out TCNT0,mp
; seleziona tempo tra interrupt pari a circa 10ms (10,24ms)
;
ldi mp,0b00000001
out TIMSK,mp
; abilita l'interrupt in caso di overflow di TCNT0
;
ldi vard,T_BAT
ldi vars, T_BAT
ldi f_conv,0
ldi f_soglia,0
ldi f_switch,0
;
; inizializza le variabili vard e vars che saranno decrementate dalla subroutine di risposta ad interrupt (vard = 50 -> 512 ms)
;
sei
;
; abilita gli interrupt a livello di SREG
;
;
;
main_loop:
;
cpi vard,0
brne next01
;
ldi vard,T_BAT
;
; inizializza ADC
;
ldi mp, 0b10001010
out ADCSRA, mp
;
; abilitazione conversione pin 0 dell'ADC (piedino 24)
;
ldi mp, 0b11100001
out ADMUX, mp
;
; inizia conversione
;
in mp, ADCSRA
ldi mp1, 0b01000000
or mp, mp1
out ADCSRA, mp
;
check_conversione:
cpi f_conv, 0x01
brne check_conversione
;
; salto condizionato a next01 se vard è diverso da 0
;
ldi f_conv,0
in mp, ADCH
cpi mp,THSH_inf
brlo accensione_spia
;
cpi mp,THSH_sup
brlo lampeggio_spia
;
; reinizializza la variabile di temporizzazione
;
ldi vars,T_BAT
ldi mp, 0b00000000
out PORTC, mp
;
rjmp display
;
;
;
accensione_spia:
ldi vars,T_BAT
;
;
ldi mp,0b00000001
out PORTC,mp
;
rjmp display
;
;
lampeggio_spia:
;
ldi vars,T_LED
;
;
next_lampeggio_spia:
;
;
cpi vars,0
brne next02
;
in mp,PINC
ldi mp1,0x01
eor mp,mp1
out PORTC,mp
;
cpi vard,0
brne lampeggio_spia
;
;
rcall display
;
;
next01:
;
rjmp main_loop
;
next02:
;
rjmp next_lampeggio_spia
;
;
display:
;
;
ldi ZH,high(2*lut)
ldi ZL,low(2*lut)
;
; inizializza ADC
;
ldi mp, 0b10001010
out ADCSRA, mp
;
ldi mp,0b11100010
out ADMUX,mp
;
; inizio conversione sensore
;
in mp, ADCSRA
ldi mp1, 0b01000000
or mp, mp1
out ADCSRA, mp
;
check_conversione_sensore:
;
cpi f_conv, 0x01
brne check_conversione_sensore
;
; salto condizionato a check_conversione_sensore
;
ldi f_conv,0 ; rimette f_conv a 0
in mp, ADCH
;
next06:
;
; il registro Z fa da puntatore alla Lut
;
lpm mp1,Z
;
; se il valore convertito non è uguale a quello nella cella puntata da Z, allora Z si sposta in avanti di 4 celle
; e confronta il valore successivo
;
adiw Z,4
cp mp,mp1
brne next06
;
; quando viene trovato il valore corrispondente, Z torna indietro di tre celle per leggere la cifra delle centinaia
;
sbiw Z,3
;
; maschera per abilitare il LE3 (centinaia) collegato al pin 7 della porta D
;
ldi mp2,0b01100000
out PORTD,mp2
lpm klux,Z
or klux,mp2
out PORTD,klux
;
nop
nop
nop
nop
nop
nop
nop
nop
;
ldi mp2,0b11100000
out PORTD,mp2
;
;
; appena viene disabilitato il 4511 delle centinaia, questo mostra la cifra memorizzata sul led corrispondente
;
adiw Z,1
;
; Z si sposta di una cella in avanti per leggere il valore delle decine
;
;
; maschera per abilitare il LE2 (decine) collegato al pin 6 della porta D
;
ldi mp2,0b10100000
out PORTD,mp2
lpm klux,Z
or klux,mp2
out PORTD,klux
;
nop
nop
nop
nop
nop
nop
nop
nop
;
ldi mp2,0b11100000
out PORTD,mp2
;
;
; appena viene disabilitato il 4511 delle decine, questo mostra la cifra memorizzata sul led corrispondente
;
adiw Z,1
;
; Z si sposta di una cella in avanti per leggere il valore delle unità
;
;
ldi mp2,0b11000000
out PORTD,mp2
lpm klux,Z
or klux,mp2
out PORTD,klux
;
nop
nop
nop
nop
nop
nop
nop
nop
;
ldi mp2,0b11100000
out PORTD,mp2

;
;
; appena viene disabilitato il 4511 delle unità, questo mostra la cifra memorizzata sul led corrispondente
;
;
; la subroutine è terminata
;
ret
;
;
TIM0_OVF:
;
in mp,SREG
push mp
; salva SREG nello stack
ldi mp,246
out TCNT0,mp
; inizializza nuovamente la variabile di conteggio del timer counter (10 ms)
dec vard
dec vars
; decrementa la variabile di conteggio del ciclo on - off (0,5 s)
pop mp
out SREG,mp
; ripristina il valore di SREG
;
reti
;
;
ADC_conv:
;
in mp1,SREG
push mp1
; salva SREG nello stack
ldi f_conv, 0b00000001
pop mp1
out SREG,mp1
; ripristina il valore di SREG
;
reti
 
Last edited:
Top