Hey ich hab ein Programm geschrieben, dass ich nun in meinen PIC speichern möchte. Hab hier eine MPLab ICD 3 liegen. Wenn ich alles richtig verstanden habe, ist mein Programm schon im PIC gespeichert. Nun soll das Programm aber starten, sobald ich die Stromzufur zum PIC (über USB) aktiviere. Muss das auch programmiert werden und wenn ja, wie? Hilft euch der Quellcode etwas? Ich hab mal in C programmiert.
wie hast du den PIC denn programmier? Compilieren alleine reicht da nicht :) Wenn du den ICD3 wegnimmst sollte der automatisch losrennen
Ich nehme an du arbeitest mit MPLAB von Microchip. Zuerst musst du das Projekt bauen (Built) = Kompilieren. Wenn das erfolgreich geklappt hat, dann kannst du unter Programmer > Program auswählen und dann wird das hex-File auf den PIC geflasht.
Hallo! Danke schonmal für die Antworten ^^ Genau, ich hab mit MPLab gearbeitet =) Jap, das Projekt ist gebaut und auf dem PIC geflasht. Das Progeamm startet aber nur, wenn ich über MPLap auf "run" gehe. Ich würde es jedoch ganz gerne immer starten können, sobald ich die Stromzufur zum PIC aktiviere. Nehm ich den ICD aber weg, dann läuft das Programm nicht mehr. Hab ich da was falsch programmiert bzw.hätte ich dafür etwas bestimmtes Programmieren müssen alá "Programm starten, wenn.."? Gruß!
Bei MPLab kann man (so meine ich mich zu erinnern) das Programm entweder im Debug-Modus programmieren, oder normal. Du müsstest es ohne den Debug-Modus programmieren. Also im Menü den Debugger abwählen und den Programmer aktivieren - dann nochmals programmieren.
Wenn das nicht geht, dann poste hier mal, wie Deine Fuses gesetzt sind.
Nun hab ich doch ein Problem mit meinem Programm: Mein PIC soll testen, ob eine Fotodiode mit Licht in Kontakt kommt oder nicht. Das analoge Signal der Fotodiode hab ich an einen analogen Eingang des PIC geschlossen. (AN12) Wenn Licht auf die Diode trifft, dann soll der Ausgang 13 aktiviert werden, wenn nicht, der Ausgang 14. Ich bin mir recht sicher, dass ich irgendetwas falsch programmiert habe. Kann mir jemand helfen? Mein PIC: http://ww1.microchip.com/downloads/en/DeviceDoc/PIC24F16KA102_Family_datasheet_39927b.pdf Mein Quellcode:
1 | //
|
2 | // Lichtschranke V1
|
3 | //
|
4 | |
5 | #include <p24F08KA101.h> |
6 | #include <stdio.h> |
7 | //#define POT 5
|
8 | |
9 | void initADC( int amask) |
10 | {
|
11 | AD1PCFG = amask; // select analog input pins |
12 | AD1CON1 = 0x00E0; // automatic conversion start after sampling |
13 | AD1CSSL = 0; // no scanning required |
14 | AD1CON2 = 0; // use MUXA, AVss and AVdd are used as Vref+/- |
15 | AD1CON3 = 0x1F02; // Tsamp = 32 x Tad; Tad=125ns |
16 | AD1CON1bits.ADON = 1; // turn on the ADC |
17 | } //initADC |
18 | |
19 | |
20 | int readADC( int v) |
21 | {
|
22 | AD1CHS = v; // 1. select analog input channel |
23 | AD1CON1bits.SAMP = 1; // 2. start sampling |
24 | while (!AD1CON1bits.DONE); // 3. wait for the conversion to complete |
25 | return ADC1BUF0; // 4. read the conversion result |
26 | } // readADC |
27 | |
28 | |
29 | void main(void) |
30 | {
|
31 | TRISB = 0; |
32 | int a = readADC; |
33 | if(a >0) |
34 | {
|
35 | PORTBbits.RB13 = 1; //GRÜN |
36 | }
|
37 | else
|
38 | {
|
39 | PORTBbits.RB14 = 1; //ROT |
40 | }
|
41 | |
42 | }
|
Dein readADC sowie auch das Setzen des Ausgangs läuft nur einmal ab - und zwar direkt nach dem Anlegen der Betriebsspannung. Danach hängt das ganze in einer Endlosschleife (die wird automatisch aufgerufen, wenn main() beendet wird; muss also nicht im Quellcode stehen). Das was Du benötigst, ist ebenfalls eine Endlosschleife. Diese aber um Deinen mail-Code herum. Etwa so:
1 | void main(void) |
2 | {
|
3 | TRISB = 0; |
4 | |
5 | while(1) { |
6 | int a = readADC; |
7 | if(a >0) |
8 | {
|
9 | PORTBbits.RB13 = 1; //GRÜN |
10 | }
|
11 | else
|
12 | {
|
13 | PORTBbits.RB14 = 1; //ROT |
14 | }
|
15 | }
|
16 | }
|
Sorry, hab den Poist zuvor erst jetzt gesehen ^^' Ok, verstanden hab ich das, lösen tut es mein Problem jedoch nict. Der Ausgang "Grün" wird immer noch aktiviert, obwohl eig. kein Licht an die Fotodiode kommen kann :(
Das kann nicht stimmen:
1 | int a = readADC; |
Du willst hier nicht einen Pointer auf eine Funktion setzen (der ist immer größer 0) sondern die Funktion aufrufen, also:
1 | int a = readADC (wasweissich); |
Dann würde ich auch nicht auf exakt > 0 testen, sondern auf einen Schwellwert. Sicher hast Du schon mal erlebt, dass Dein Digital-Multimeter einen Wert ungleich 0 anzeigt, obwohl nichts angeschlossen ist. Zum restlichen Code kann ich nichts sagen, ich kenne mich schlecht bis gar nicht mit PICs aus.
Novi schrieb: > Wie löschen? > Kannst du mir das am Quellcode zeigen?
1 | if(a >0) |
2 | {
|
3 | PORTBbits.RB13 = 1; //GRÜN |
4 | }
|
5 | else
|
6 | {
|
7 | PORTBbits.RB14 = 1; //ROT |
8 | }
|
Ist a gleich 0 wird RB14 auf 1 gesetzt. Ist in einem weiteren Schleifendurchlauf a größer 0, wird zusätzlich RB13 gesetzt. RB14 bleibt an, da Du ja nichts anderes gesagt hast. Wenn Du dieses Verhalten haben willst, ist das ok. Wenn aber bei a größer 0 der "rote" Ausgang ausgehen soll, musst Du das auch sagen. Wird a wieder gleich 0, soll sicherlich der "rote" Ausgang auch wieder abschalten.
1 | if(a >0) |
2 | {
|
3 | PORTBbits.RB13 = 1; //GRÜN ein |
4 | PORTBbits.RB14 = 0; //ROT aus |
5 | }
|
6 | else
|
7 | {
|
8 | PORTBbits.RB14 = 1; //ROT ein |
9 | PORTBbits.RB13 = 0; //GRÜN aus |
10 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.