PIC C18 variable wird nicht gespeichert

Gast #2077986
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
Gast #2078116
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
}
#2078124
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.

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