Progetti

   

Sponsor

   

Servizi

   
Benvenuto, Ospite
Nome utente: Password: Ricordami

ARGOMENTO: ldr_con_ADC_pic_18F4550

ldr_con_ADC_pic_18F4550 3 Mesi 2 Settimane fa #1

  • openSUSE2014
  • Avatar di openSUSE2014
  • Offline
  • Fresh Boarder
  • Messaggi: 15
  • Karma: 1
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;


}
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

ldr_con_ADC_pic_18F4550 3 Mesi 2 Settimane fa #2

  • openSUSE2014
  • Avatar di openSUSE2014
  • Offline
  • Fresh Boarder
  • Messaggi: 15
  • Karma: 1
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: 3 Mesi 2 Settimane fa da openSUSE2014.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

ldr_con_ADC_pic_18F4550 2 Mesi 2 Settimane fa #3

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4666
  • Ringraziamenti ricevuti 557
  • Karma: 52
...funziona ancora!? :)

Saluti,

Mauro
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

ldr_con_ADC_pic_18F4550 2 Mesi 2 Settimane fa #4

  • openSUSE2014
  • Avatar di openSUSE2014
  • Offline
  • Fresh Boarder
  • Messaggi: 15
  • Karma: 1
Si Mauro, funziona ancora..
Perché nn dovrebbe??

Qualche errore nel codice?
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

ldr_con_ADC_pic_18F4550 2 Mesi 1 Settimana fa #5

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4666
  • Ringraziamenti ricevuti 557
  • Karma: 52
Tutto ok, ma anche il "tempo di servizio" è un test importante per la verifica del Software.

Saluti,

Mauro
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Powered by Forum Kunena
   
© LaurTec 2006-2015