Forum: Mikrocontroller und Digitale Elektronik PIC C18 variable wird nicht gespeichert


von Tweaker (Gast)


Lesenswert?

Hi,

hab folgendes Problem.
Mit der Variable prog_modi soll die Betriebsart eingestellt werden, aber 
der macht das nicht. Er beschreibt die Variable nicht, sie bleibt auf 
dem initialisierten Wert.

Ich verwende C18 auf dem 18F45k20.
Kann das mit dem Uart zusammenhängen?
1
while (1){
2
// Programmzustand einstellen und RS232-Kommunikation
3
RXinput = getChar();
4
rx = RXinput;
5
6
if ( rx != 0){
7
  LATD = rx;
8
  if(rx == 252)
9
  {
10
    putChar(prog_mode);
11
  }
12
  if(rx == 253)
13
  {
14
    prog_mode = 0;
15
  }
16
  if(rx == 254)
17
  {
18
    prog_mode = 1;
19
  }
20
  if(rx == 255)
21
  {
22
    prog_mode = 2;
23
  }
24
  if(rx < 252)
25
  {
26
    rs232 = rx;
27
  }
28
}
29
30
// Steuerung des Servos aus unterschiedlichen Quellen
31
switch(prog_mode)
32
{
33
   case 0: Impuls_Servo_var = schalter8;
34
   break;
35
   case 1: Impuls_Servo_var =(char)(ADC_Convert()*0.694);
36
   break;
37
   case 2: Impuls_Servo_var = rs232;
38
   break;
39
   default : break;
40
}
41
42
// Anzeige der Servo-Position/Geschwindigkeit auf Board-LEDs
43
//LATD = Impuls_Servo_var;
44
}

THX im Voraus

von PIC_Gast (Gast)


Lesenswert?

Hallo,

Heißt die Variable prog_modi oder prog_mod und wo ist sie deklariert?

von Tweaker (Gast)


Lesenswert?

prog_mode natürlich war ein Tippfehler.

Hier noch die globale Deklarierung und Initialisierung:
1
static unsigned char prog_mode = 2;
2
static unsigned char RXinput;

von morph1 (Gast)


Lesenswert?

beim PIC18 ist das Attribut "static" gleichbedeutend mit der Ablage der 
"Variablen" im Programmspeicher -> static == statisch == unveränderlich 
:)

Nimm also mal das static weg.

von Tweaker (Gast)


Lesenswert?

hab ich gemacht, aber der Effekt ist der selbe.

Mit folgender zeile kann ich sehen das die Daten einwandfrei übertragen 
werden:
LATD = rx;


kann es sein, dass ein interrupt dazwischen kommt?

von Tweaker (Gast)


Lesenswert?

Ich hab festegestellt, dass alle internen variablen in der 
Endlosschleife wieder mit dem Standartwert überschrieben werden.

Wie kann das sein?
1
void main (void)
2
{
3
  unsigned int rs232 = 87;
4
  unsigned char rx = 0;
5
  unsigned char prog_mode = 2;
6
  unsigned char RXinput;
7
8
  OSCCON = 0x76;        // 16Mhz einstellen
9
  TRISD = 0b00000000;       // PORTD bits 7:0 are all outputs (0)
10
  TRISB = 0xff;    // Datenrichtungsregister fuer PORTC: Alle Pins auf Eingabe
11
  
12
  TRISAbits.TRISA1 = 0;  //PortA auf Ausgabe
13
  //Unbedingt notwendig beim Einlesen von Daten bei PIC16F688:
14
  ANSEL  = 0b00000000;    // Pins als digital I/O AD Wandler abschalten
15
  ANSELH = 0b00000000;    // Pins als digital I/O
16
17
    ADC_Init();
18
  init();
19
  init_rs232();
20
  
21
  Impuls_Servo_var = 70;
22
  
23
    while (1)
24
    {
25
    // Programmzustand einstellen und RS232-Kommunikation
26
    RXinput = getChar();
27
    rx = RXinput;
28
    
29
    if ( rx != 0)
30
    {
31
      LATD = prog_mode;
32
      if(rx == 252)
33
      {
34
        putChar(prog_mode);
35
      }
36
      if(rx == 253)
37
      {
38
        prog_mode = 0;
39
      }
40
      if(rx == 254)
41
      {
42
        prog_mode = 1;
43
      }
44
      if(rx == 255)
45
      {
46
        prog_mode = 2;  
47
      }
48
      if(rx < 252)
49
      {  
50
        rs232 = rx;
51
      }
52
    }
53
54
    // Steuerung des Servos aus unterschiedlichen Quellen
55
    switch(prog_mode)
56
    {
57
      case 0:   Impuls_Servo_var = schalter8;
58
              break;
59
      case 1:   Impuls_Servo_var =(char)(ADC_Convert()*0.694);
60
              break;
61
      case 2:    Impuls_Servo_var = rs232;
62
              break;
63
      default :    break;
64
    }
65
66
    // Anzeige der Servo-Position/Geschwindigkeit auf Board-LEDs
67
    //LATD = Impuls_Servo_var;
68
    }
69
}

von Karl H. (kbuchegg)


Lesenswert?

Tweaker schrieb:
> Ich hab festegestellt, dass alle internen variablen in der
> Endlosschleife wieder mit dem Standartwert überschrieben werden.
>
> Wie kann das sein?

Vielleicht stürzt dein µC einfach nur ab und das Programm beginnt 
ständig immer wieder von vorne?

Da du Servos im Code erwähnst: So ein Servo kann ganz unangenehme 
Störimpulse auf der Versorgungsspannung verursachen. Das wäre zb ein 
Grund, warum der µC abschmiert.

von Tweaker (Gast)


Lesenswert?

Super.................

Das wars... Servo abgehängt und sieh da.... es Funktioniert....

Reicht da ein Kondensator am Servo als entkopplung? 1uF?

Danke

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.