Mikrocontroller wird nach dem Programmieren nicht mehr zum erneuten programmieren erkannt

OP #3069534
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
}
Gast #3069703
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
OP #3069908
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...

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