Hallo miteinander
ich bin ein regelrechter frischling was das programmieren in c und pics angeht. meine frage beschränkt sich hauptsächlich auf das programmiertechnische Vorgehen meines Projekts, daher hoffe ich, im richtigen Forum gelandet zu sein.
Hallo und willkommen im PIC-Mikrocontroller-Forum,
ich denke du bist hier richtig.
Mein Problem ist folgendes:
Ich hab mir eine Schaltung mit dem PIC24F08KA101 ausgebaut und möchte damit eine Lichschranke bauen. Dabei soll eine LED eine Photodiode anleuchten. Dieses Signal wird zu einem Transimpedanzwandler gesendet und dann zum PIC (Pin 15, AN12). Ich geh mal davon aus, dasds ich dies soweit richtig gehandhabt habe.
Ich möchte nun mittels des PIC herausbekommen, ob die LED die Diode anstrahlt oder nicht.
Ok, das ist auch richtig.
Meine Idee: Ich müsste doch eig. nur herausfinden, ob in dem Pin15 ein Signal eintrifft oder nicht. Nicht wahr?
Wenn man es stark vereinfacht, könnte man das so sagen...

Bei einigen Dingen bin ich mir einfach noch nicht so ganz sicher:
- muss ich den ADC zuvor irgendwie einstellen?
Ja, das ist unbedingt nötig. So ziemlich jedes Modul der OnChip-Peripherie eines PIC benötigt eine sogenannte Initialisierung, die für die Anwendung benötigte Einstellungen vornimmt.
- wie um himmels willen kann ich prüfen, ob auf pin15 ein signal ankommt oder nicht?
Ich antworte mal ganz allgemein: Nachdem der ADC initialisiert ist, kannst du Wandlungen (Conversions) "anstoßen". Sobald die Wandlung abgeschlossen ist, kannst du das digitale Ergebnis aus den ADC-Registern auslesen. Um herauszufinden, ob ein bestimmtes Signal anliegt, benötigt man mehr als eine Wandlung - man wandelt in konstanten Abständen (zyklisch) und wertet die Ergebnisse aus.
Hier ein Code-Beispiel von Microchip (DS39705, Example 17-1):
AD1PCFG = 0; // Configure A/D port
// all input pins are analog
AD1CON1 = 0x2208; // Configure sample clock source
// and conversion trigger mode.
// Unsigned Fraction format (FORM<1:0>=10),
// Manual conversion trigger (SSRC<3:0>=000),
// Manual start of sampling (ASAM=0),
// No operation in Idle mode (ADSIDL=1).
AD1CON2 = 0; // Configure A/D voltage reference
// and buffer fill modes.
// Vr+ and Vr- from AVdd and AVss (VCFG<2:0>=000),
// Inputs are not scanned,
// Interrupt after every sample
AD1CON3 = 0; // Configure A/D conversion clock as Tcy/2
AD1CHS = 0; // Configure input channels,
// CH0+ input is AN0,
// CH0- input is Vr- (AVss).
AD1CSSL = 0; // No inputs are scanned.
IFS0bits.AD1IF = 0; // Clear A/D conversion interrupt.
// Configure A/D interrupt priority bits (AD1IP<2:0>) here, if
// required. Default priority level is 4.
IEC0bits.AD1IE = 1; // Enable A/D conversion interrupt
AD1CON1bits.ADON = 1; // Turn on A/D
AD1CON1bits.SAMP = 1; // Start sampling the input
Delay(); // Ensure the correct sampling time has elapsed
// before starting conversion.
AD1CON1bits.SAMP = 0; // End A/D sampling and start conversion
// Example code for A/D ISR:
void __attribute__ ((__interrupt__)) _ADC1Interrupt(void)
{
IFS0bits.AD1IF = 0;
}
Vielleicht traut sich ja jemand mein problem mit mir weiter zu erörtern.
vielen dank schonmal ^^
Acha, mir ist bewusst, das sicherlich noch viel mehr Informationen von mir nötig sind.
Die rück ich auch breitwillig heraus =)
Du bekommst hier jederzeit Hilfe, wenn du weitere Fragen hast und die versprochenen Infos mitbringst.
Grüße,
Edson