Source relativo ad articolo
Apro questo thread per inserire un source che non saprei come allegare altrimenti.
Se le righe risultassero ancora spezzate, converrebbe ridurre la percentuale di zoom (CTRL-)
Se le righe risultassero ancora spezzate, converrebbe ridurre la percentuale di zoom (CTRL-)
- Codice: Seleziona tutto
'pin1=-reset pin2=PortB3,led infrarosso
'pin3=ADC2 segnale fototransistor Pin4=Gnd
'pin5=PortB0,Mosi,LedRosso pin6=PortB1,MISO,ledVerde
'pin7=clock programmatore pin8=5Volt
$crystal = 16000000 '16mhz Attiny45,Fusebit:Sut_cksel=Pll,Ckdiv8 Off
'Clkpr = &B10000000 'sblocco prescaler clock
'Clkpr = &B00000000 'no prescaler clock
Ddrb = &B00001011 'out B0pin5 rosso,B1pin6 verde,B3pin2 infrarosso
Admux = &B00000010 'Vref=Vdd, ADC2 pin3
Adcsra = &B11101111 'enable start auto interrupt prescale128
Didr0 = &B00111111 'ADC0,1,2,3 AIN0,1 disabled as digital input
On Adc Leggi 'interrupt ogni 113 microsec
Rosso Alias Portb.0 : Verde Alias Portb.1 'uscite digitali led
Emit Alias Portb.3 'e led infrarosso
Dim Lmis As Word At $60 : Dim Hmis As Byte At $61 Overlay 'byte L,H ADC
Dim Aux As Integer : Dim Sig As Word : Dim Stato As Word
Dim Lp As Integer : Dim Lett As Integer
Enable Interrupts
Inizio: 'il main program
If Sig < 1 Then 'utilizza i led per segnalare l'entità
Verde = 0 : Rosso = 0 'degli infrarossi riflessi dall'ostacolo
End If
If Sig >= 1 And Sig < 10 Then
Verde = 1 : Rosso = 0
End If
If Sig >= 10 And Sig < 60 Then
Verde = 0 : Rosso = 1
End If
If Sig >= 60 Then
Verde = 1 : Rosso = 1
End If
Goto Inizio
Stop
Leggi: 'ISR dello ADC ogni 113 microsec
Lmis = Adcl : Hmis = Adch 'byte Low,High da registri conversione
Shift Lmis , Left , 4 'amplifica e consente successivi troncamenti
Lett = Lett + Lmis 'prefiltraggio cioè
Shift Lett , Right , 1 'semplice media con lettura precedente
If Stato = 3 Then 'al quarto interrupt cioè dopo 452 microsec
Emit = 1 'mette ON il led infrarosso
Aux = Lett - Lp 'segnale analogico attuale meno precedente
Lp = Lett 'salva segnale attuale per successiva sottrazione
End If
If Stato = 7 Then 'ottavo interrupt cioè dopo altri 452 microsec
Emit = 0 'mette OFF il led infrarosso
Aux = Lp - Lett 'segnale analogico precedente meno attuale
Lp = Lett 'salva segnale attuale per successiva sottrazione
End If
Stato = Stato + 1 'conta gli interrupt
If Stato = 8 Then Stato = 0 'ogni 8 ripete il ciclo cioè circa 1100 hertz
If Aux < 0 Then 'se il segnale è strano
Aux = 0 'lo azzeriamo
Sig = 0 'e azzeriamo anche il filtro
End If
Sig = Sig * 15 'filtraggio: 15 volte il valore già filtrato
Sig = Sig + Aux 'più il valore attuale da filtrare
Shift Sig , Right , 4 'quindi dividiamo per 16
Return