Sto cercando di leggere il segnale analogico per una sorta di mouse con un controller pic18f14k50. Qui il semplice circuito: http://dl.dropbox.com/u/14663091/schematiconew.pdf. Devo leggere il segnale analogico dalla porta del circuito AN9. La funzione principale legge dalla porta e lampeggia 30 volte se viene raggiunta la soglia:
void main (void) {InitializeSystem (); #if definito (USB_INTERRUPT) USBDeviceAttach (); #endif while (1) {if ((USBDeviceState < CONFIGURED_STATE) || (USBSuspendControl == 1)) continue; if (! HIDTxHandleBusy (lastTransmission)) {int letto = myReadADC2 (); // Qui ho provato sia myReadADC2 () che myReadADC1 () if (readed > 40) {// If read threshold > 40, blink led 30 times int i; for (i = 0; i < 30; i ++) {Delay1KTCYx (0); mLED_1_On (); Delay1KTCYx (0); mLED_1_Off (); }} lastTransmission = HIDTxPacket (HID_EP, (BYTE *) hid_report_in, 0x03); } / * [Ed: added] * /} // end while} // end main
Ho usato due metodi per leggere dalla porta AN9, myReadADC () che usa OpenADC () metodo API:
int myReadADC (void) {#define ADC_REF_VDD_VDD_X 0b11110011 OpenADC (ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_12_TAD, ADC_CH9 & ADC_INT_OFF, ADC_REF_VDD_VDD_X & ADC_REF_VDD_VSS, 0b00000010); // canale 9 SetChanADC (ADC_CH9); ConvertADC (); // Avvia la conversione mentre (BusyADC ()); // Attendi il completamento return ReadADC (); // Leggi risultato}
e myReadADC2 (), che implementa la lettura manuale dalla porta.
int myReadADC2 () {int iRet; OSCCON = 0x70; // Seleziona il clock interno a 16 MHz ANSEL = 0b00000010; // Imposta PORT AN9 sull'ingresso analogico
ANSELH = 0; // Imposta altre PORTE come I / O digitali / * Init ADC * / ADCON0 = 0b00100101; // ADC port channel 9 (AN9), Abilita ADC ADCON1 = 0b00000000; // Usa riferimento tensione interno (Vdd e Vss) ADCON2 = 0b10101011; // Giustifica il risultato a destra, 12 TAD, Seleziona FRC per 16 MHz iRet = 100; ADCON0bits.GO = 1; while (ADCON0bits.GO); // Attendi la conversione eseguita iRet = ADRESL; // Ottieni il risultato LSB a 8 bit iRet + = (ADRESH << 8); // Ottieni il risultato MSB a 2 bit return iRet; }
Entrambi i casi non funzionano, tocco (inviando segnale analogico) la porta AN9 ma quando imposto soglia alta (~ 50) il led non lampeggia, con soglia bassa (~ 0 ) lampeggia immediatamente quando fornisco alimentazione al PIC. Forse sto usando una porta sbagliata? Sto effettivamente passando AN9 come porta di lettura? O forse la soglia è sbagliata? Come posso trovare il giusto valore? Grazie
Qui l'API di MPLAB C18 http://dl.dropbox.com/u/14663091/API%20microchip%20C18.pdf.