Forum: Mikrocontroller und Digitale Elektronik ICD2 und MPLAB X können meinen PIC18 nicht programmieren


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen

Ich nutze für ein Projekt den PIC18F14K50, das ICD2 (weil ich es noch in 
der Schublade hatte) und das MPLAB X (weil der XC8 Compiler gratis ist).

Leider kann ich machen was ich will, es funktioniert nichts.
Ich war bei einem Kollege, der schreibt alles in Assembler und der 
brachte meinen PIC zum laufen. Da ich noch das ICD 2 habe, muss ich das 
Hex-File in das MPLAB 8.92 laden und so programmieren. Der Übertrag mit 
dem Hex-File geht gut, die Program Memorys sagen das selbe.

In diesem Program Memory sah ich auch, dass der Assemblecode des 
Kollegen seinen Programmstart bei 0x20 hat, der XC8 Compiler oder das 
MPLAB X aber versucht, den PIC "von hinten aus" zu befüllen und erst bei 
0x3... anfängt.

Dies erschien mir Merkwürdig, und ich suchte in Foren. Bei 
http://www.eevblog.com/forum/microcontrollers/mplab-xxc8-first-program-not-running/15/ 
sah ich, dass dieses Vorgehen bei PIC18 zu einem Stack Overflow Reset 
verursacht. Doch die Lösungsansätze nutzten nichts.

Der Code, da bin ich mir recht sicher, und auch die Register sollten 
stimmen.
Anbei ist er mal:
1
#include <xc.h>
2
#include "hdq.h"
3
4
void MyOscCal(void);
5
6
// #pragma config statements should precede project file includes.
7
// Use project enums instead of #define for ON and OFF.
8
9
// CONFIG1L
10
#pragma config CPUDIV = NOCLKDIV// CPU System Clock Selection bits (No CPU System Clock divide)
11
#pragma config USBDIV = OFF     // USB Clock Selection bit (USB clock comes directly from the OSC1/OSC2 oscillator block; no divide)
12
13
// CONFIG1H
14
#pragma config FOSC = ERC       // Oscillator Selection bits (External RC oscillator)
15
#pragma config PLLEN = OFF      // 4 X PLL Enable bit (PLL is under software control)
16
#pragma config PCLKEN = ON      // Primary Clock Enable bit (Primary clock enabled)
17
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor disabled)
18
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
19
20
// CONFIG2L
21
#pragma config PWRTEN = OFF     // Power-up Timer Enable bit (PWRT disabled)
22
#pragma config BOREN = OFF      // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
23
#pragma config BORV = 19        // Brown-out Reset Voltage bits (VBOR set to 1.9 V nominal)
24
25
// CONFIG2H
26
#pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT is controlled by SWDTEN bit of the WDTCON register)
27
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
28
29
// CONFIG3H
30
#pragma config HFOFST = OFF     // HFINTOSC Fast Start-up bit (The system clock is held off until the HFINTOSC is stable.)
31
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RA3 input pin disabled)
32
33
// CONFIG4L
34
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
35
#pragma config LVP = ON         // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
36
#pragma config BBSIZ = OFF      // Boot Block Size Select bit (1kW boot block size)
37
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
38
39
// CONFIG5L
40
#pragma config CP0 = OFF        // Code Protection bit (Block 0 not code-protected)
41
#pragma config CP1 = OFF        // Code Protection bit (Block 1 not code-protected)
42
43
// CONFIG5H
44
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block not code-protected)
45
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
46
47
// CONFIG6L
48
#pragma config WRT0 = OFF       // Table Write Protection bit (Block 0 not write-protected)
49
#pragma config WRT1 = OFF       // Table Write Protection bit (Block 1 not write-protected)
50
51
// CONFIG6H
52
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers not write-protected)
53
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block not write-protected)
54
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
55
56
// CONFIG7L
57
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 not protected from table reads executed in other blocks)
58
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 not protected from table reads executed in other blocks)
59
60
// CONFIG7H
61
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block not protected from table reads executed in other blocks)
62
63
#include <xc.h>
64
#include <pic18.h>
65
#define _XTAL_FREQ 8000000
66
67
int main(int argc, char** argv) {
68
    int i=0b01101010;
69
    TRISA=0xFF;
70
    TRISB=0xFF;
71
    TRISC=0xFF;
72
    LATA=0x00;
73
    LATB=0x00;
74
    LATC=0x00;
75
    TRISBbits.RB4=0;
76
    while(1){
77
        //batteryPercent(1);
78
        //PORTBbits.RB4=1;
79
        //LATB4=1;
80
        LATBbits.LATB4=1;
81
        for(i=0;i<500;i++){
82
            __delay_ms(1);
83
        }
84
        //PORTBbits.RB4=0;
85
        //LATB4=0;
86
        LATBbits.LATB4=0;
87
        for(i=0;i<500;i++){
88
            __delay_ms(1);
89
        }
90
        MyOscCal();
91
    }
92
    return 1;
93
}
94
void MyOscCal(void) @ 0x3FFF{
95
    asm("retlw 0x0000"); // Change 0x80 to something else if the oscillator is way off
96
}

Habt Ihr Erfahrungen mit MPLAB X gemacht, die so etwas auslösen können? 
Mittlerweile bin ich ratlos.

Leider habe ich nicht das Budget um auf einen C Compiler für MPLAB 8.92 
zu wechseln (der Code wird noch wachsen). Auch kann ich mir das ICD3 im 
Moment nicht leisten.

Einen schönen Abend
Stefan

von San L. (zwillingsfreunde)


Lesenswert?

Hallo Stefan

Stefan schrieb:
> Leider kann ich machen was ich will, es funktioniert nichts.

Kannst du uns bitte einmal beschrieben, WAS nicht funktioniert? Gibt 
bereits der Compiler einen Fehler aus? Kannst du das Programm auf den 
PIC laden?

Falls du das Programm auf den PIC kriegst, aber dieser einfach keine 
Reaktion zeigt:
- Hast du einen externen oszillator angeschlossen? (So Konfiguriert..)

Poste sonst mal einen Schaltplan.

Ohne uns zu sagen, WAS nicht funktioniert, wird dir hier kaum einer 
helfen können...

von B. S. (bestucki)


Lesenswert?

Das ICD2 funktioniert meines Wissens nicht mit MPLAB X. Man kann aber 
den XC8 Compiler auch mit MPLAB 8.x benutzen. Ist bei mir erfolgreich im 
Einsatz.

von Ho.Kr. (Gast)


Lesenswert?

MPLAB X unterstützt nicht mehr den ICD2.

von Stefan (Gast)


Lesenswert?

Hallo Zusammen

Wow das ging schnell.
1. Jap ist angeschlossen. Mit 8MHz und auch so konfiguriert. Die 
Configuration bits wurden von meinem Kollege auch 1:1 übernommen um dies 
als Fehlerquelle auszuschliessen.

2. Ich kann Kompilieren und programmieren. Bei einem "Release from 
Reset" stürzt das MPLAB 8.92 ab. Aber auch, wenn ich den Assemblercode 
des Kollegen lade. Deshalb ICD2 ausziehen und es sollte gehen. Tut es 
aber nicht.

3. Xc8 auf Mplab 8.92 muss ich probieren. Sah bisher die Möglichkeit 
nicht.

4. Der Schaltplan kann ich hochladen, sobald ich zu Hause bin. Soweit: 
Es ist nur das nötigste angeschlossen. An Pin B4 ist ein LED Treiber 
(also der Enable Eingang), an den OSC1 und 2 ist der 8MHz Quarz mit 2 
15pF Kondensatoren richtung GND und der ICSP Stecker ist nach Vorgabe 
angeschlossen. Ein Glättungs-C ist von VCC und GND angeschlossen.
Das ganze läuft mit 3.3V. Die Schaltung sollte auch funktionieren, da es 
via Assembler geht.

Gruss Stefan

von Chris B. (dekatz)


Lesenswert?

Stefan schrieb:
> an den OSC1 und 2 ist der 8MHz Quarz mit 2
> 15pF Kondensatoren richtung GND

passt aber nicht zu dieser Configuration:

>#pragma config FOSC = ERC       // Oscillator Selection bits (External
>RC oscillator)

Diese erwartet ein RC-Kombination an OSC1!

von Chris B. (dekatz)


Lesenswert?

Stefan schrieb:

> void MyOscCal(void) @ 0x3FFF{
>     asm("retlw 0x0000"); // Change 0x80 to something else if the
> oscillator is way off
> }
>

Macht gar nichts ausser das in W-Register 0x00 steht. Wenn man dort 
schon einen Wert für das Oscillator-Tuning hinterlegt, dann muss man 
diesen auch in das <OSCTUNE> Register laden (-> siehe Datenblatt!!).

Wobei der permanente Aufruf in der while(1)-Schleife völlig unnötig ist, 
das macht man 1 mal bei der Initialisierung.

von San L. (zwillingsfreunde)


Lesenswert?

Stefan schrieb:
> 1. Jap ist angeschlossen. Mit 8MHz und auch so konfiguriert. Die
> Configuration bits wurden von meinem Kollege auch 1:1 übernommen um dies
> als Fehlerquelle auszuschliessen.

Copy + Paste ohne zu verstehen wie der Code funktioniert... das geht 
vielleicht ein paar mal gut, aber immer wirst du damit nicht 
durchkommen. Überprüf lieber den Code noch einmal, deine Config Bits 
sagen da was völlig anderes.

Konfigurier sonst mal dass er den internen Oscillator brauchen soll und 
versuch dann mal, ob das Programm läuft.

von Stefan (Gast)


Lesenswert?

Hallo Zusammen

Ich musste das Projekt vorerst auf Eis legen, da weitere Prüffungen 
anstehen. Natürlich lässt mein Stolz es nicht zu, dies unfertig zu 
lassen. Falls ich die Informationen habe, werde ich sie hier posten, 
falls andere ähnliche Probleme haben.

Gruess

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.