Nel mio plastico avrei bisogno di usare i primi due ingressi della porta A come analogici e gli altri come digitali.
Adesso nel simulatore sto leggendo un trimmer in AN0 ed ho la classica routine che legge il trimmer 0-5V. Vorrei aggiungere il secondo sul pin AN1, ma non ho trovato come leggerlo, o almeno come leggere solo quei due input come analogici:
void IngressiAnalogici (void)
{
ADCON1 = 0b10001101; //bit7 -> 0 = Left justified. 6 Least Significant bits of ADRESL are read as \"0\".
//bit7 -> 1 = Right justified. 6 Most Significant bits of ADRESH are read as \"0\".
//bit6,5,4 -> Unimplemented: Read as \'0\'
//bit3,2,1,0 -> 1101 = AN0 e AN1 analogiche
ADCON0 = 0b00000001; //bit7,6 -> 00 = FOSC/2;
//bit5,4,3 -> 000 = channel 0, (RA0/AN0);
//bit2 -> 0 = A/D conversion not in progress;
//bit1 -> Unimplemented: Read as \'0\'
//bit0 -> 1 = A/D converter module is operating
}
Coma faccio a settare il tutto per far sì che venga letto AN0 ed AN1 come analogico ed il resto digitale?
Enea Ferriani
picmicro675
postato il: 24.11.2017, alle ore 14:09
Leggendo i fogli dati, come minimo. Cosa dicono in proposito?
A me pare che devi segliere da che canale leggere, prima di fare una lettura nel registro ADCON0, bit 5:3.
A pagina 116
The ADCON1, and TRIS registers control the operation
of the A/D port pins. The port pins that are desired as
analog inputs must have their corresponding TRIS bits
set (input). If the TRIS bit is cleared (output), the digital
output level (V OH or V OL) will be converted.
The A/D operation is independent of the state of the
CHS2:CHS0 bits and the TRIS bits.
Che compilatore stai usando ?
Anno nuovo, forum nuovo.
Mi sa che lascio.
primok
postato il: 25.11.2017, alle ore 10:32
/*
* File: main.c
* Author: PRIMOK_V
*
* Created on 25 novembre 2017, 20.05
*/
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
Più piccola è la mente più grande è la presunzione.
primok
postato il: 25.11.2017, alle ore 10:37
Più piccola è la mente più grande è la presunzione.
e.ferriani
postato il: 25.11.2017, alle ore 12:59
picmicro675: Leggendo i fogli dati, come minimo. Cosa dicono in proposito?
A me pare che devi segliere da che canale leggere, prima di fare una lettura nel registro ADCON0, bit 5:3.
A pagina 116
The ADCON1, and TRIS registers control the operation
of the A/D port pins. The port pins that are desired as
analog inputs must have their corresponding TRIS bits
set (input). If the TRIS bit is cleared (output), the digital
output level (V OH or V OL) will be converted.
The A/D operation is independent of the state of the
CHS2:CHS0 bits and the TRIS bits.
Che compilatore stai usando ?
Uso XC8.
Certo che l'ho letto e la porta la setto come ingresso analogico dove serve, ovviamente. Quello che non riesco a fare è la lettura di due pin nello stesso programma.
Ho chiesto dove lavoro e mi hanno detto che i bit della porta vengono letti in modo sequenziale e non tutti in una volta, quindi ogni volta che occorre una lettura va attivato il pin da leggere e convertito. Io credevo bastasse settarlo una sola volta all'inizio e basta. Credo sia per questo che non riuscivo a leggerli.
Provo appena riesco.
Enea Ferriani
e.ferriani
postato il: 25.11.2017, alle ore 16:06
Scusa PrimoK, ma "PIR1bits" non è per i pic18? Io ho un pic16, e comunque stavo provando a fare quanto di seguito. Risultato? I due trimmer li riesco a leggere ma non sono indipendenti ed entrambi vanno da 0 a -64, passando per 32000.
Ci sarà qualche int o char sbagliato di sicuro.
Metto il codice.
Ovviamente essendo un programma di studio ci potrebbero essere delle definizioni di variabili o rutines non utilizzate. Non farci caso.
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF// Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//-----------------------------------------------
// INCLUDE
//-----------------------------------------------
TRISA = 0b00000011; // PORTAingressi attivati: 0,1,
TRISB = 0b00000000; // PORTB tutti i bit in uscita
TRISC = 0b00000000; // PORTC tutti i bit in uscita
PORTA = 0b00000000; // clear PORTA
PORTB = 0b00000000; // clear PORTB
PORTC = 0b00000000; // clear PORTC
}
void SettaggiAnalogica(void)
{
ADCON1 = 0b10001101; //[7][6,5,4][3,2,1,0]
//bit7 -> 0 = Left justified. 6 Least Significant bits of ADRESL are read as ?0?.
//bit7 -> 1 = Right justified. 6 Most Significant bits of ADRESH are read as ?0?.
//bit6,5,4 -> Unimplemented: Read as '0'
//bit3,2,1,0 -> solo RA0 RA1 analogiche
}
itoa(string_velocita,trimmer_velocita, 10); //dice che string
lcd_gotoxy (1,10); //vai a riga,colonna
lcd_puts(string_velocita); //scrive la stringa "string" sul display
lung_velocita=strlen(string_velocita); //lung = calcola la lunghezza di "string"
lung_velocita+=10; //somma 1 alla lunghezza calcolata "lung"
lcd_gotoxy(1,lung_velocita); //vai a riga,colonna determinata da "lung"
lcd_puts(cancellaglizeri); //scrivi " " (4 spazi) per cancellare gli 0 inutili)
lung_velocita=0;
}
void ScriviTrimmerRampaSuDisplay (void)
{
LeggiPortaAN1();
itoa(string_rampa,trimmer_rampa, 10); //dice che string
lcd_gotoxy (2,10); //vai a riga,colonna
lcd_puts(string_rampa); //scrive la stringa "string" sul display
lung_rampa=strlen(string_rampa); //lung = calcola la lunghezza di "string"
lung_rampa+=10; //somma 1 alla lunghezza calcolata "lung"
lcd_gotoxy(2,lung_rampa); //vai a riga,colonna determinata da "lung"
lcd_puts(cancellaglizeri); //scrivi " " (4 spazi) per cancellare gli 0 inutili)
lung_rampa=0;
}
Enea Ferriani
e.ferriani
postato il: 25.11.2017, alle ore 16:13
Nel fare copia/incolla del codice, nel main, dopo Settaggi() ho inavvertitamente cancellato la chiamata a " SettaggiAnalogica();"
Enea Ferriani
primok
postato il: 25.11.2017, alle ore 16:20
Scusa PrimoK, ma "PIR1bits" non è per i pic18?
NO!!
Se tu avessi letto il data shhet non avresti detto questo!
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF// Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//-----------------------------------------------
// INCLUDE
//-----------------------------------------------
itoa(string_velocita,trimmer_velocita, 10); //dice che string
lcd_gotoxy (1,10); //vai a riga,colonna
lcd_puts(string_velocita); //scrive la stringa "string" sul display
lung_velocita=strlen(string_velocita); //lung = calcola la lunghezza di "string"
lung_velocita+=10; //somma 1 alla lunghezza calcolata "lung"
lcd_gotoxy(1,lung_velocita); //vai a riga,colonna determinata da "lung"
lcd_puts(cancellaglizeri); //scrivi " " (4 spazi) per cancellare gli 0 inutili)
lung_velocita=0;
itoa(string_rampa,trimmer_rampa, 10); //dice che string
lcd_gotoxy (2,10); //vai a riga,colonna
lcd_puts(string_rampa); //scrive la stringa "string" sul display
lung_rampa=strlen(string_rampa); //lung = calcola la lunghezza di "string"
lung_rampa+=10; //somma 1 alla lunghezza calcolata "lung"
lcd_gotoxy(2,lung_rampa); //vai a riga,colonna determinata da "lung"
lcd_puts(cancellaglizeri); //scrivi " " (4 spazi) per cancellare gli 0 inutili)
lung_rampa=0;
TRISA = 0b00001011; // PORTAingressi attivati: 0,1,
TRISB = 0b00000000; // PORTB tutti i bit in uscita
TRISC = 0b00000000; // PORTC tutti i bit in uscita
PORTA = 0b00000000; // clear PORTA
PORTB = 0b00000000; // clear PORTB
PORTC = 0b00000000; // clear PORTC
Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito