ldr_con_ADC_pic_18F4550

  • openSUSE2014
  • Avatar di openSUSE2014
  • Offline
  • Junior Member
  • Junior Member
Di più
2 Anni 1 Settimana fa #1 da openSUSE2014
ldr_con_ADC_pic_18F4550 è stato creato da openSUSE2014
bsera a tutti,sto cercando di fare un crepuscolare con un ldr e un pic18f4550.
finita la configurazione,nessun problema,il led si accende,ma investendo ldr con la luce,il led nn si spegne.
forse sbaglio nel configurare adcon?

grazie per l'aiuto e bserata a tutti

P:S= allego codice sorgente

#include <xc.h>
#include "PIC18F4550_config.h"
#define _XTAL_FREQ 20000000
#define led PORTDbits.RD0
#define ldr PORTAbits.RA0

//


//*************************************
// Prototipi delle funzioni
//*************************************
void board_initialization(void);

int main(void) {

board_initialization();

// Abilito AN0-AN1-AN2 come ingressi analogici
// VREF sono impostate a massa e VCC
ADCON1 = 0b00001100;

// Seleziono AN0 come ingresso
ADCON0 = 0b00000000;

// Giustificazione destra
ADCON2 = 0b10111110;

// Abilito l'ADC
ADCON0 |= 0b00000001;

// Ciclo infinito
int result;

while (1) {

// Turn ADC on
ADCON0bits.ADON = 1;

// Sample CH0
__delay_us(10);
ADCON0bits.GO = 1;
while (ADCON0bits.GO_nDONE);

// Store ADC result
result = ((ADRESH << 7) + ADRESL);

if (result >= 500) { // 500 is corresponding value of LDR

led = 1; // Turning on LED on PORTD

} else {

led = 0; // Turning off LED

}
}

}
//*************************************
// Implementazione della funzione
//*************************************

void board_initialization(void) {

// Imposto PORTA
LATA = 0x00;
TRISA = 0xFF;

// Imposto PORTB
LATB = 0x00;
TRISB = 0xFF;

// Imposto PORTC
LATC = 0x00;
TRISC = 0xFD;

// Imposto PORTD
LATD = 0x00;
TRISD = 0x00;

// Imposto PORTE
LATE = 0x00;
TRISE = 0xFF;


}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • openSUSE2014
  • Avatar di openSUSE2014
  • Offline
  • Junior Member
  • Junior Member
Di più
2 Anni 1 Settimana fa - 2 Anni 1 Settimana fa #2 da openSUSE2014
Risposta da openSUSE2014 al topic ldr_con_ADC_pic_18F4550
bsera a tt,dopo un po a studiarmi il libro di Mauro,sono riuscito a fare un crepuscolare.
funziona alla grande,al calar del sole,si attiva il rele,alla luce del sole si spegne.
nn e la scoperta dell'acqua calda,ma per me che sono all'inizio e una GRANDE SODDISFAZIONE.

allego il file finito:

#include <xc.h>
#include "PIC18F4550_config.h"
#define _XTAL_FREQ 20000000
#define led PORTDbits.RD0
#define led1 PORTDbits.RD1
#define ldr PORTAbits.RA0
#define puls PORTBbits.RB4
#define NUMERO_CAMPIONI 2

//*************************************
// Prototipi delle funzioni
//*************************************
void board_initialization(void);

int main(void) {

// Variabile per salvare la sommatoria dei dati letti
unsigned int sommatoria = 0;

// Variabile per salvare il valore della conversione
unsigned int lettura = 0;

// Variabile utilizzata per il numero delle letture
unsigned char numero_letture;

board_initialization();


// Abilito AN0-AN1-AN2 come ingressi analogici
// VREF sono impostate a massa e VCC
ADCON1 = 0b00001100;

// Seleziono AN0 come ingresso
ADCON0 = 0b00000000;

// Imposto i tempi di conversione e giustificazione a destra
// TAD : FOSC/16
// TACQ: 20 TAD
// Giustificazione destra
ADCON2 = 0b10111110;

// Abilito l'ADC
ADCON0 |= 0b00000001;

//attesa prima di iniziare la prima conversione
//basterebbero 2us
__delay_ms(10);

// Ciclo infinito
while (1) {

sommatoria = 0;

// Effettuo NUMERO_CAMPIONI letture per fare una media
for (numero_letture = 0; numero_letture < NUMERO_CAMPIONI; numero_letture++) {

// Avvio la conversione Analogico/Digitale
ADCON0bits.GO = 1;

// Attendo la fine della conversione
while (ADCON0bits.GO);

// Prelevo il valore della conversione
lettura = (((unsigned int) ADRESH) << 8) | ADRESL;

// Sommatoria delle letture fatte
sommatoria = sommatoria + lettura;
}

// Calcolo del valore medio
// sommatoria = sommatoria / NUMERO_CAMPIONI;

if (lettura > 600) {

__delay_ms(200); // allungamento per gli sbalzi di false letture dalla luce al buio

led = 0;

} else {

led = 1;
}

if (puls == 0) {

__delay_ms(20);

if (puls == 0) {

led1 = !led1;

} //else {
while (puls == 0) {

//led1 = 0;
}
}
}
}

//*************************************
// Implementazione della funzione
//*************************************

void board_initialization(void) {

// Imposto PORTA
LATA = 0x00;
TRISA = 0xFF;

// Imposto PORTB
LATB = 0x00;
TRISB = 0xFF;

// Imposto PORTC
LATC = 0x00;
TRISC = 0xFD;

// Imposto PORTD
LATD = 0x00;
TRISD = 0x00;

// Imposto PORTE
LATE = 0x00;
TRISE = 0xFF;

}

GRAZIE MAURO........
Ultima Modifica 2 Anni 1 Settimana fa da openSUSE2014.

Si prega Accedi o Crea un account a partecipare alla conversazione.

Di più
1 Anno 11 Mesi fa #3 da Mauro Laurenti
Risposta da Mauro Laurenti al topic ldr_con_ADC_pic_18F4550
...funziona ancora!? :)

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • openSUSE2014
  • Avatar di openSUSE2014
  • Offline
  • Junior Member
  • Junior Member
Di più
1 Anno 11 Mesi fa #4 da openSUSE2014
Risposta da openSUSE2014 al topic ldr_con_ADC_pic_18F4550
Si Mauro, funziona ancora..
Perché nn dovrebbe??

Qualche errore nel codice?

Si prega Accedi o Crea un account a partecipare alla conversazione.

Di più
1 Anno 11 Mesi fa #5 da Mauro Laurenti
Risposta da Mauro Laurenti al topic ldr_con_ADC_pic_18F4550
Tutto ok, ma anche il "tempo di servizio" è un test importante per la verifica del Software.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiPinnaStefAMatteo Garia