Forum: Mikrocontroller und Digitale Elektronik Mikrocontroller wird nach dem Programmieren nicht mehr zum erneuten programmieren erkannt


von P. S. (fetter_homer)


Lesenswert?

Hallo zusammen,
ich arbeite zur Zeit an einer Funkuhr, wobei ich noch ganz am Anfang 
stehe. Den entsprechenden Mikrocontroller habe ich bereits mehrfach neu 
beschrieben und stehe jetzt (nach einer größeren Änderung der 
Einstellungen in den Registern) vor dem Problem, dass mein 
Programmier-Programm (microC PRO for PIC) meinen PIC18F1320-I/P nicht 
mehr erkennt.
Die Fehlermeldung lautet: "Warning ! -Device detected: Unknown ! -Device 
selected: PIC18F1320 Continue anyway?"
Wenn ich auf "Continue" klicke, kommt es natürlich zum Error und das 
Programm wird nicht auf den uC geschrieben.

Kann man denn in den Registern etwas so einstellen, dass man den uC im 
Anschluss nicht mehr programmieren kann? Wobei ich lediglich die 
Oszillator-Einstellungen bearbeitet habe...

Danke im Voraus und Gruß
Peter
1
/*
2
 * Project name:
3
     Funkuhr
4
 * Copyright:
5
     (c) Peter Schumacher 2013.
6
 * Description:
7
     Funkuhr
8
 * Test configuration:
9
     MCU:             PIC18F1320-I/P
10
                      http://ww1.microchip.com/downloads/en/devicedoc/39605f.pdf
11
     dev.board:       EasyPIC v7
12
                      http://www.mikroe.com/eng/products/view/757/easypic-v7-development-system/
13
     internal Oscillator: 125 kHz
14
     external Oscillator: 32,768 kHz external Crystal
15
     Ext. Modules:    DCF-77-Receiver
16
                      http://ele.pgbesa.net/DCF77.pdf
17
     SW:              mikroC PRO for PIC
18
                      http://www.mikroe.com/eng/products/view/7/mikroc-pro-for-pic/
19
 */
20
21
22
// LCD module connections
23
sbit LCD_RS at LATA0_bit;
24
sbit LCD_EN at LATA1_bit;
25
sbit LCD_D4 at LATA2_bit;
26
sbit LCD_D5 at LATA3_bit;
27
sbit LCD_D6 at LATA4_bit;
28
sbit LCD_D7 at LATB5_bit;
29
30
sbit LCD_RS_Direction at TRISA0_bit;
31
sbit LCD_EN_Direction at TRISA1_bit;
32
sbit LCD_D4_Direction at TRISA2_bit;
33
sbit LCD_D5_Direction at TRISA3_bit;
34
sbit LCD_D6_Direction at TRISA4_bit;
35
sbit LCD_D7_Direction at TRISB5_bit;
36
37
#define Empfaenger LATA.F6
38
#define Signal LATA.F7
39
40
char s = 0;                                   //Sekunde
41
char m = 0;                                   //Minute
42
char h = 0;                                   //Stunde
43
char d = 0;                                   //Tag
44
char wd = 1;                                  //Wochentag (Mo.-So.)
45
char mt = 0;                                  //Monat
46
//Einzelne Ziffern für Ausgabestring
47
char h1 = 0;
48
char h2 = 0;
49
char m1 = 0;
50
char m2 = 0;
51
char s1 = 0;
52
char s2 = 0;
53
54
char txt[9];                                  //Uhrzeit-String
55
56
//oder:
57
//char *txt = "00:00:00";
58
59
char Freigabe = 0;                            //Funksignal wird empfangen
60
61
void interrupt() {
62
  if(Freigabe == 0){
63
    Empfaenger = 1;
64
65
    if(Signal){
66
      LATB.F1 = 1;                            //Pin 9
67
    }
68
    else{
69
      LATB.F1 = 0;                            //Pin 9
70
    }
71
72
    Freigabe = 0;
73
  }
74
75
  s++;
76
  if(s == 60){
77
    s = 0;
78
    m++;
79
  }
80
  if(m == 60){
81
    m = 0;
82
    h++;
83
  }
84
  if(h == 24){
85
    h = 0;
86
    wd++;
87
  }
88
  TMR1IF_bit = 0;
89
  INT0IF_bit = 0;                             //Reset von: INT0 External Interrupt Flag bit
90
}
91
92
void main() {
93
94
//OSCCON REGISTER
95
  IDLEN_bit = 0;                              //Run Mode enabled
96
  IRCF2_bit = 0;                              //internen Oszillator im OSCCON-Register auf 125 kHz setzen
97
  IRCF1_bit = 0;
98
  IRCF0_bit = 1;
99
100
//Port A konfigurieren
101
  TRISA = 0;                                  //Port A als Ausgänge definieren
102
  TRISA.F7 = 1;                               //Pin 4 von Port A als Eingang definieren
103
  PORTA = 0;                                  //Anfangswert von Port A festlegen
104
105
//Port B konfigurieren
106
  TRISB = 0;                                  //Port B als Ausgänge definieren
107
  TRISB.F0 = 1;                               // Pin 0 von Port B als Eingang definieren
108
  PORTB = 0;                                  //Anfangswert von Port B festlegen
109
110
//LCD einrichten
111
  Lcd_Init();
112
  Lcd_Cmd(_LCD_CLEAR);
113
  Lcd_Cmd(_LCD_CURSOR_OFF);
114
115
//INTCON REGISTER
116
  GIE_bit = 1;                                //Enables all unmasked interrupts
117
  PEIE_bit = 1;                               //Enables all unmasked peripheral interrupts
118
  INT0IE_bit = 1;                             //INT0 External Interrupt Enable bit (S1-Button at RB0)
119
  INT0IF_bit = 0;                             //Reset von: INT0 External Interrupt Flag bit
120
 
121
//T1CON REGISTER
122
  TMR1ON_bit = 1;                              //Enables Timer1
123
  TMR1CS_bit = 1;                              //External clock from pin RB6/PGC/T1OSO/T13CKI/P1C/KBI2 (on the rising edge)
124
  T1SYNC_bit = 1;                              //Do not synchronize external clock input
125
  T1OSCEN_bit = 1;                             //Timer1 Oscillator Enable bit
126
  TMR1H = 0x80;                                //Timer1 ist ein 16bit Timer. Hier wrird das höhere Byte "vorgeladen" ("preload"), damit ein Interrupt genau nach jeder Sekunde kommt.
127
128
129
  do{
130
  
131
    LATB.F4 = 1;
132
  
133
    //Uhrzeit wird in String umgewandelt
134
    h1 = (h / 10) % 10;
135
    h2 = (h     ) % 10;
136
    m1 = (m / 10) % 10;
137
    m2 = (m     ) % 10;
138
    s1 = (s / 10) % 10;
139
    s2 = (s     ) % 10;
140
    txt[0] = '0' + h1;
141
    txt[1] = '0' + h2;
142
    txt[2] = ':';
143
    txt[3] = '0' + m1;
144
    txt[4] = '0' + m2;
145
    txt[5] = ':';
146
    txt[6] = '0' + s1;
147
    txt[7] = '0' + s2;
148
    txt[8] = '\0';                            //Strings: http://www.mikrocontroller.net/articles/String-Verarbeitung_in_C
149
150
    Lcd_Out(1, 1, txt);
151
152
    switch(wd){
153
      case(1): {Lcd_Out(1,15,"Mo"); break;}
154
      case(2): {Lcd_Out(1,15,"Di"); break;}
155
      case(3): {Lcd_Out(1,15,"Mi"); break;}
156
      case(4): {Lcd_Out(1,15,"Do"); break;}
157
      case(5): {Lcd_Out(1,15,"Fr"); break;}
158
      case(6): {Lcd_Out(1,15,"Sa"); break;}
159
      case(7): {Lcd_Out(1,15,"So"); break;}
160
      default: break;
161
    }
162
    Lcd_Cmd(_LCD_RETURN_HOME);
163
  }while(1);
164
}

von Anja (Gast)


Lesenswert?

P. S. schrieb:
> Kann man denn in den Registern etwas so einstellen, dass man den uC im
> Anschluss nicht mehr programmieren kann?

Bei einem PIC geht das nicht.
Ich vermute ein Kontaktierungsproblem.
Wie wird der PIC beim Programmieren versorgt?

Gruß Anja

von P. S. (fetter_homer)


Lesenswert?

Anja schrieb:
> Ich vermute ein Kontaktierungsproblem.

Eher unwahrscheinlich. Ich benutze zum Programmieren nämlich das EasyPIC 
v7 Board (http://www.mikroe.com/easypic/)...

von Stefan (Gast)


Lesenswert?

Bei einem AVR ist mir das schonmal passiert. Abhilfe war: Reset-Pin auf 
GND legen, so dass das Programm nicht startet. So konnte ihn wieder 
umprogrammieren.

von Anja (Gast)


Lesenswert?

Stefan schrieb:
> Reset-Pin auf
> GND legen, so dass das Programm nicht startet.

Beim PIC liegt am Reset-Pin die Programmierspannung an.

Ein normales Programmiergerät legt Reset erst auf Masse
(=RESET), dann sofort auf die Programmierspannung.

Gruß Anja

von Bege (Gast)


Lesenswert?

Bei einigen PICs kann man den Reset-Pin per Fuse als GPIO-Pin 
programmieren. Dann können die PICs nur noch mit Programmern 
programmiert werden, die 'Vpp first' unterstützen, also die 
Programmierspannung in einer bestimmten Sequenz anlegen um in den PIC in 
den Programmiermodus zu schalten.

Programmiergeräte, die 'nur' über die Debugschnittstelle programmieren, 
können das in der Regel nicht.

Bege

von P. S. (fetter_homer)


Lesenswert?

Apropos Reset: Der funktioniert auch nicht mehr. Der uC scheint sich 
selbstständig gemacht zu haben. Kann so etwas am Programm liegen oder 
verabschieden sich MCUs auch schon mal ohne spezielles Zutun von sich 
aus? Wüsste auch nicht, dass ich mal irgendwas falsch angeschlossen 
hätte...

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.