programm in pic speichern

Gast #2357276
Lesenswert?

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.
Gast #2358357
Lesenswert?

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ß!
Gast #2358373
Lesenswert?

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.
Gast #2361461
Lesenswert?

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
}
Persönliche Seite #2361491
Lesenswert?

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
}
Gast #2361503
Lesenswert?

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 :(
Moderator Persönliche Seite #2361549
Lesenswert?

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.
Persönliche Seite #2361581
Lesenswert?

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
      }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren