Analoge Input 5 6 7
Beste forumleden,
Ik probeer 8 nabijheidssensoren aan te sluiten op het dwengo-bord.
De eerste v5 vormen geen probleem, maar de analoge ingangen 5 tot en met 7 blijken niet te werken.
Ik maak gebruik van de standaard-dwengo-bibliotheken met zelf-geschreven functies opdat het LCD-scherm zou blijven werken tijdens het testen.
Aanpassingen in dwengoADC.c
Deze functies werden ook toegevoegd aan het dwengoADC.h bestand
void setAN567(void){ LATA = 0xFF; OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_6_TAD, ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, 0b0111); } void resetAN567(void){ LATA = 0xFF; OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_6_TAD, ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, 0b1010);
aangepaste versie van readADC
int readADC(BYTE address) { int data; // Choosing ADC channel (override ADC_CH0) switch(address) { case 0: SetChanADC(ADC_CH0); break; case 1: SetChanADC(ADC_CH1); break; case 2: SetChanADC(ADC_CH2); break; case 3: SetChanADC(ADC_CH3); break; case 4: SetChanADC(ADC_CH4); break; case 5: SetChanADC(ADC_CH5); break; case 6: SetChanADC(ADC_CH6); break; case 7: SetChanADC(ADC_CH7); break; default: return -1; // non existing channel }
Wanneer ik nu volgend programma laat draaien, dan blijft het LCD-scherm werken.
Bij het aansluiten van sensoren is er een grote verandering in de waarden van AN0-AN4. Maar de waarden van AN5-AN7 veranderd van 1 naar 3. De waarde reageert ook NIET op nabijheid bij deze 3 laatste analoge inputs.
while(TRUE) { // do forever //INTCON2bits.NOT_RBPU = 0; //enabe de knoppen !! (testfase) clearLCD(); // Uitlezen sensoren + berekenen lijnwaarde + aansturen LCD-scherm + aansturen LEDS LEDS = 0b00000000; j = 128; isLost = true; setAN567(); //maak de analoge ingangen 5-7 tijdelijk beschikbaar => LCD-scherm onzichtbaar !! for(i=0;i<8;i = i + 1) { ADC[i] = readADC(i); if(readADC(i) > thresholdValue){// uitlezing sensor[i] = false; // detectie wit } else{ sensor[i] = true; // detectie zwart isLost = false; // robot detecteerd iets. Dus niet verdwaald LEDS = LEDS + j; // LEDS geven indicatie van sensoren links = 128 rechts = 1 } j = j / 2; } resetAN567(); // maak de analoge ingangen 5-7 weer onbeschikbaar => LCD-scherm weer zichtbaar for(i = 0; i < 8; i = i + 1){ appendIntToLCD(ADC[i]); appendStringToLCD(" "); } }
kan iemand me helpen?
ter info:
voor deze code komt nog deze initialisatie (niet zelf geschreven)
// start of initializations: DO NOT EDIT initBoard(); initADC(); initMotors(); backlightOn(); stopMotors(); delay_ms(10); // wait a bit after initialisation // end of initializations // start procedure necessary for the robot competition: DO NOT EDIT // robot has to move to the control loop when pressing switch S (new version) or S4 (old version) appendStringToLCD("(S)tart me"); while(!started) { stopMotors(); if(SW_S == PRESSED) { started = TRUE; } else { delay_ms(50); } } // 5 seconds waiting clearLCD(); appendStringToLCD("Start counting"); LEDS = 0; for(i=0;i<5;i++) { LEDS *= 2; LEDS += 1; delay_s(1); } // end of starting procedure clearLCD(); appendStringToLCD("Race!"); // routines for servo control DO NOT EDIT // servo pins INTCON2bits.NOT_RBPU = 1; // disable internal pull-ups: SWITCHES WON'T WORK ANYMORE TRISBbits.TRISB5 = 0; // set RB5 as output PORTBbits.RB5 = 0; // initialize with 0 // Timer 1 interrupt example, control one servo on pin RD0 // timings servo has to be within 0.7 ms up to 2.3 ms // 0.7 ms: timer 1 interrupt after 83.333ns*8*(65536-64536) = 0.7ms (64486 = 0xFBE6) // 2.3 ms: timer 1 interrupt after 83.333ns*8*(65536-62086) = 2.3ms (62086 = 0xF286) timerServo = MIN_TIMER_SERVO; // in left position PIR1bits.TMR1IF = 0; RCONbits.IPEN = 1; RCONbits.SBOREN = 0; // BOR = off TMR1H = (timerServo & 0xFF00) >> 8; // keep most significant byte TMR1L = timerServo & 0x00FF; // keep least significant byte T1CON = 0b00110001; // 48Mhz/4, prescaler 1/8 INTCONbits.GIEH = TRUE; // GIEH = TRUE IPR1bits.TMR1IP = 1; PIE1bits.TMR1IE = 1;
Probeer eens LATA te vervangen door TRISA. Het is met TRISA dat je de pinnen van poort A als ingang instelt (dat is blijkbaar een foutje in de ADC-bibliotheek). En gebruik ook 0b0110 i.p.v. 0b0111 (want er staat daar een uitzondering bij die ik nog eens moet nazien).
Bekijk ook volgende pagina voor meer uitleg: http://www.dwengo.org/nl/node/229
Wat gebeurt er als je jouw LCD-scherm ervan haalt en vervolgens i.p.v. het LCD-scherm de LEDs gebruikt om output te geven. Zet LED0 eens aan wanneer sensor 0 > 500 en anders zet je LED0 uit, hetzelfde voor LED1, LED2 etc... Het LCD-scherm en de ADC-kanalen zitten immers op dezelfde pinnen.
De aanpassingen die je doet lijken me alleszins correct, maar er moet nog een kleine foutje zitten ergens. Ik weet namelijk van anderen dat gelijkaardige aanpassingen wel werken.
Ik zal het dinsdagavond na kijken als je langskomt. Dan kunnen we ook de juiste oplossing hier posten.
Nog één kleine aanvulling, die TRISA = 0xFF kan je in principe weglaten, die hoeft daar niet te staan en je zou zelfs problemen krijgen met de motoren.
veel succes.

Your shopping cart
Ik heb ondertussen de tijd gevonden dit te testen.
LATA door TRISA vervangen => nog steeds hetzelfde
0111 door 0110 vervangen => nog steeds hetzelfde
Als ik de waarden uitschrijf op het LCD-scherm die hij binnenpakt (gedeeld door 10, anders kan het er niet op)krijg ik typisch iets als volgt:
5 5 5 5 5 0 0 0
(links = AN0; rechts is AN7)
het lijkt wel of die poort niet gevoed wordt ofzo. De sensoren zijn nochtans goed aangesloten