Forum: Mikrocontroller und Digitale Elektronik programm in pic speichern


von Novi (Gast)


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.

von steffen (Gast)


Lesenswert?

wie hast du den PIC denn programmier? Compilieren alleine reicht da 
nicht :)

Wenn du den ICD3 wegnimmst sollte der automatisch losrennen

von Lehrmann M. (ubimbo)


Lesenswert?

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.

von Novi (Gast)


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ß!

von Achim W. (Gast)


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.

von Achim W. (Gast)


Lesenswert?

Wenn das nicht geht, dann poste hier mal, wie Deine Fuses gesetzt sind.

von Novi (Gast)


Lesenswert?

Danke Achim W!
Genau das war es :)

von Novi (Gast)


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
}

von Christian H. (netzwanze) Benutzerseite


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
}

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Ach ja. Du setzt die Ausgänge nur. Löschen tust Du sie nicht wieder.

von Novi (Gast)


Lesenswert?

Wie löschen?
Kannst du mir das am Quellcode zeigen?

von Novi (Gast)


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 :(

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Christian H. (netzwanze) Benutzerseite


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
      }

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
Noch kein Account? Hier anmelden.