- Messaggi: 22
- Ringraziamenti ricevuti 0
ldr_con_ADC_pic_18F4550
4 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;
}
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
- Autore della discussione
- Junior Member
Riduci
Di più
4 Anni 1 Settimana fa - 4 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) << | 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........
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) << | 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 4 Anni 1 Settimana fa da openSUSE2014.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- openSUSE2014
- Autore della discussione
- Junior Member
Riduci
Di più
- Messaggi: 22
- Ringraziamenti ricevuti 0
3 Anni 11 Mesi fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic ldr_con_ADC_pic_18F4550
...funziona ancora!?
Saluti,
Mauro
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
3 Anni 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?
Perché nn dovrebbe??
Qualche errore nel codice?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- openSUSE2014
- Autore della discussione
- Junior Member
Riduci
Di più
- Messaggi: 22
- Ringraziamenti ricevuti 0
3 Anni 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
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.