Forum: Mikrocontroller und Digitale Elektronik MPLAB "debug" funktioniert, aber "run" nicht


von Simon Steiner (Gast)


Lesenswert?

Hallo Liebes Forum

ich bin zum ersten mal hier wirklich tätig.

hier mein Problem. Wenn ich mein C-Programm mit der Hardware zusammen 
debugge funktioniert alles einwandfrei. Wenn ich dann aber das Programm 
auf den Chip laden will, also den "run" button betätige. macht er das 
file und ladet es auf den Chip.Jedoch Springt der mir aus einer 
Schlaufe, einfach so.
In der Schlaufe habe ich ein Switch_case. Manchmal macht er nur das 
erste Case mal auch noch das zweite oder dritte. Die Bediengung der 
Schlaufe wird nicht Verändert. for(i = 0; i < 6; i++)

Die Frage ist. Wie kann ich das beheben.
 Am Sourcecode kann es nicht liegen. Es muss an den Einstellungen von 
MPLAB liegen.

mein PICkit : Pic16f887
MPLAB X IDE : v1.97

kann mir jemand helfen.

Danke im Voraus

von Erich (Gast)


Lesenswert?

Du musst das Schaltbild und das komplette Programm hier (als 
Dateianhang) reinstellen, sonst kann man nix dazu sagen.
Gruss

von Simon Steiner (Gast)


Lesenswert?

Das darf ich leider nicht. Aus rechtlichen Gründen. Tut mir Leid

Vielleicht hatte jemand das gleich Problem?

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Im Debugmode wird wahrscheinlich nicht optimiert und im Runmode schon? 
Kannst du wenigstens den Ausschnitt mit deiner Schleife (ich nehme an 
dass meinst du mit 'Schlaufe') und der switch zeigen?

lg
Christopher

von Simon Steiner (Gast)


Lesenswert?

while(1)
     {
         if(taster)
        {
             unlock_A2 = 1;
             unlock_A3 = 1;

             for (i = 0; i < 6; i++)
             {
                 switch(i)
                 {
                         case 0:
                             unlock_A1 = 0;
                             unlock_R3 = 0;
                             ausgang1 = 1;
                             relais3 = 1;
                             Delay1ms(1000);
                             opamp[i] = AN_messung(5);
                             Ur[i] = AN_messung(4);
                             break;
                        case 1:

                            unlock_R3 = 1;
                            unlock_R2 = 0;
                            relais2 = 1;
                            Delay1ms(1000);
                            opamp[i] = AN_messung(7);
                            Ur[i] = AN_messung(1);
                            break;
                        case 2:
                            unlock_R2 = 1;
                            unlock_R1 = 0;
                            relais1 = 1;
                            Delay1ms(1000);
                            opamp[i] = AN_messung(8);       //8
                            Ur[i] = AN_messung(6);          //6
                            break;
                        case 3:
                            unlock_R2 = 0;
                            unlock_R1 = 1;
                            unlock_A1 = 1;
                            unlock_A2 = 0;
                            relais2 = 1;
                            ausgang2 = 1;
                            Delay1ms(1000);
                            opamp[i] = AN_messung(0);       //0
                            Ur[i] = AN_messung(1);             //1
                            break;
                        case 4:
                            unlock_R2 = 1;
                            unlock_R1 = 0;
                            relais1 = 1;
                            Delay1ms(1000);
                            opamp[i] = AN_messung(11);
                            Ur[i] = AN_messung(6);
                            break;
                        case 5:
                            unlock_A2 = 1;
                            unlock_A3 = 0;
                            ausgang3 = 1;
                            Delay1ms(1000);
                            opamp[i] = AN_messung(13);
                            Ur[i] = AN_messung(6);
                            break;
                 }
                 //r12 = (1000.0 * (Ur[i] - opamp[i])) / 220;
                 //r12 = (1000.0 * opamp[i]) / r12;
                 if (Ur[i] == 0)
                 {
                   widerstand[i] = 1200000;
                 }
                 else
                 {
                   widerstand[i] = ((float)opamp[i] / Ur[i]) * 220;
                 }
                 /*if((widerstand[i] == 0) & (Ur[i] == 0))
                 {
                     widerstand[i] = 1200000;
                 }*/
                // widerstand[i] = widerstand[i] * 1;
            // printf("%i",i);
                 //r12 = widerstand[i];
                 //fconv(0.123,3,str);printf("\nopamp%i: 
%i\n",i,opamp[i]);
                 printf("\nopamp%i:       %d\n",i,opamp[i]);
                 printf("ur%i:          %d",i,Ur[i]);
                 printf("\nR%i:           %d",i,widerstand[i]);
                 printf("\n");
             }

von Simon Steiner (Gast)


Lesenswert?

es springt meistens nach der Ausgabe der ersten Messung. aus der for 
Schlaufe. manchmal auch nach der zweiten oder dritten Case

von Markus B. (russenbaer)


Lesenswert?

Wie Christopher schon gesagt hat:

Das klingt sehr nach einem Optimierungsproblem des Compilers.
Hatte das selber schon mit verschiedenen anderen Compilern (für andere 
uCs, PC).

Ich würde folgendes machen, falls möglich:

1) Such in den Build-Settings ob es da irgendwo die 
Optimierungseinstellungen gibt.

2) Schalte alle Optimierungen ab, probier es aus ob Dein Code 
funktioniert.

3) Falls es verschiedene Varianten der Optimierung (Stärke der 
Optimierung oder auch Typ der Optimierung [Geschwindigkeit, 
Speicherverbrauch,...] gibt) versuche die Kombinationen aus und schau an 
ob der Code funktioniert oder nicht.

4) Vergleiche den Assemblercode von einem funktionierendem Programm mit 
einem nicht funktionierendem (Zumindest die Teile die Du als nicht 
funktionierend identifiziert hast).

5) Schreib eine Beschwerdeemail an den Compilerhersteller mit genauer 
Fehlerbeschreibung ;)

6) Finde einen Workaround/verwende die funktionierende Einstellung 
(falls vorhanden)

Ich hoffe das hilft Dir weiter.


PS:

Deklarierst & initialisierst Du ALLE Variablen??? Das könnte auch ein 
Unterschied zwischen Debug (ev. automatische Initialisierung durch 
Debugger) und aus dem EEPROM laufen sein.

lg
Markus

von Michael K. (Gast)


Lesenswert?

Simon Steiner schrieb:
> Am Sourcecode kann es nicht liegen. Es muss an den Einstellungen von
> MPLAB liegen.

Einfach köstlich.
Frei nach dem Motto: 'Der Baum kam direkt auf mich zu ...'

von Simon Steiner (Gast)


Lesenswert?

@Markus

Mein Compiler ist. HI-TECH PICC (v9.65)
Ich kann drei Verschiedene Optimierungsgrade einstellen: non, default, 
all.

Doch egal welcher es funktioniert nicht. -.-

zum Assemblercode - Wie kann ich den einsehen. Kannst du mir da helfen.

Danke im Voraus

von Simon Steiner (Gast)


Lesenswert?

Die Variablen Sollten alle deklariert sein, Entweder Global oder in 
einer Funktion.

von Simon Steiner (Gast)


Lesenswert?

Tut mir Leid wegen dem Trari Trara. Und Danke für eure Hilfe.

Es war ein Lehrlingsprojekt das ich von meinem Oberstift übernommen 
habe. Und ich habe gedacht er habe alle Configuration bits richtig 
gesetzt, doch nun habe ich heraus gefunden das alles am Watchdogtimer 
lag. Der wär nämlich an.

Also lag das Problem in den Einstellungen wie im Code. HEHE ^^

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.