Forum: Mikrocontroller und Digitale Elektronik Befehl wir nur einmal ausgeführt


von Chunga (Gast)


Angehängte Dateien:

Lesenswert?

Hey Leute!

Ich bräuchte mal etwas Hilfe und hab folgende Fragestellung.

Nachdem ich den Pin A5 einlese, (Taster) wird das Programm wie gewollt 
ausgeführt, doch wenn es EINMAL Fertig abgelaufen ist lässt es sich 
nicht mehr starten. Es funktioniert nur wieder wenn ich das Programm neu 
auf den 18F27J53 lade.

Hier der betrefende Teil des Codes: (CCS Compiler)
1
// Hauptprogramm
2
void main() {
3
  
4
  HW_init();  
5
  
6
7
  while (true){
8
9
      
10
    if(input(PIN_A5)){ //Vorwärts
11
    
12
    delay_ms(2000);
13
14
      while(true){
15
        if(dis >= 20){
16
          
17
          doFor();    
18
          
19
          doEntf();
20
    
21
        }
22
23
        else{
24
25
          doStop();
26
27
              
28
        }
29
      delay_ms(80);
30
      
31
      }  
32
    }  
33
  }    
34
}

Ich hoffe jemand hat ne idee^^

von Ralf (Gast)


Lesenswert?

Du hast zweimal 'while(true)'. So, und jetzt überleg mal, ob die äußere 
Schleife noch jemals drankommt, wenn die innere abgearbeitet wird...

Ralf

von Chunga (Gast)


Lesenswert?

Ja die ist ja nicht das Problem!

Das Programm lässt sich selbst dann kein 2tes mal starten wenn ich den 
Pic resete bzw die Stromversorgung kappe.

Trd Danke für die schnelle Antwort!

von Ralf (Gast)


Lesenswert?

Kannst du auf dem Ding debuggen? Wenn ja, dann mach doch einfach einen 
normalen Reset, und schau dann mal, ob die Variablen vielleicht 
vermurkst sind.

Ralf

von Teo D. (teoderix)


Lesenswert?

Dass Problem liegt dann aber nicht in dem Codeschnippel.
Sei mal nicht so sparsam mit den Informationen!

von Chunga (Gast)


Lesenswert?

ne debuggen kann ich leider nich.

Hier mal der ganze Code mit Header!

Ich weis ja, da is noch die ein oder andere Leiche begraben!
1
#include <18F27J53.h>
2
#device ADC=12                                // nicht ver?ndern
3
#fuses  HSPLL,PLLEN,PLL5, NOCPUDIV, NOWDT,NOPROTECT          // nicht ver?ndern
4
#fuses  ADC12, RTCOSC_INT, DSWDTOSC_T1              // nicht ver?ndern
5
#use    delay(clock=48000000)                        // nicht ver?ndern
6
#use   i2c(Master,sda=PIN_B5,scl=PIN_B4,fast=6400)        //I2C eintrag
7
8
// F?r Bootloader ------------------------------------------------
9
#build (reset=0x1000, interrupt=0x1008)  // neue Adressen        // nicht ver?ndern
10
#org 0x0,0xfff {}            // res. Bereich            // nicht ver?ndern
11
// ---------------------------------------------------------------
12
13
14
#include <usb_cdc.h>
15
16
#define  DS_write 0x20 
17
#define  DS_read  0x21
18
19
//#define forLeft set_pwm6_duty
20
//#define forRight set_pwm7_duty
21
//#define backLeft set_pwm9_duty
22
//#define backRight set_pwm10_duty 
23
24
// schreibe Char in USB-Transmitt-Buffer
25
//void usb_putc(char cc)              // printf(usb_putc,...)
26
//{
27
//    while(!usb_cdc_putready());
28
//  usb_cdc_putc(cc);
29
//}
30
// USB -------------------------------------------------------------------------------------------
31
32
33
// globale Variable
34
35
int1 toggle=0;
36
int winkelHB, winkelLB, entfHB, entfLB;
37
long winkel, dis; 
38
float div;
39
40
41
//ISR Interrupt Srevice Routine TMR0
42
#INT_TIMER0
43
void tmr0_handler() //Name der Routine
44
{
45
  set_timer0(18660);    // da ja 1s
46
  toggle=1;        // 1 -> 1s vorbei
47
}
48
49
void HW_init(){
50
51
  //SETUP_TIMER_2(T2_DIV_BY_1,255,1);
52
  //SETUP_CCP6(CCP_PWM);
53
  //SETUP_CCP7(CCP_PWM);
54
  //SETUP_CCP9(CCP_PWM);
55
  //SETUP_CCP10(CCP_PWM);
56
  
57
  i2c_start();          //start 
58
     i2c_write(DS_write);   //Adresse 0x20, ->Write=0, Read=1 
59
     i2c_write(0x70);       //Wake up  
60
    i2c_stop();          //stop 
61
  
62
  //Wait for wake up
63
  delay_ms(1100);
64
} 
65
66
67
void doEntf(){          //Messvorgang in cm Starten
68
69
  i2c_start();
70
  i2c_write(0xE0);      //slave id (0xE0) und write, LSB = low
71
  i2c_write(0);
72
  i2c_write(0x51);      //Entfernung
73
  i2c_stop();
74
75
  delay_ms(65);
76
77
  i2c_start();
78
  i2c_write(0xE0);      //slave id (0xE0) und write, LSB = low
79
  i2c_write(0x02);         //von register 2 lesen (= entfernung high Byte)
80
  i2c_stop();    
81
82
  i2c_start();
83
  i2c_write(0xE1);      //slave id (0xE0) und READ, LSB = high
84
  entfHB = i2c_read(1);    //do ACK
85
  entfLB = i2c_read(0);     //don't ACK      
86
    i2c_stop();         //stop
87
88
  delay_ms(10);
89
90
91
  dis = make16 (entfHB, entfLB);  
92
}
93
94
95
void doCalibration(){
96
97
  i2c_start();
98
  i2c_write(DS_write);
99
  i2c_write(0xE0);          
100
  i2c_stop();  
101
}
102
103
//I2C Compass einlesen
104
void doCompass(){
105
     
106
107
  i2c_start();
108
  i2c_write(DS_write);
109
  i2c_write(0xC0);          
110
  i2c_stop();  
111
112
  delay_ms(210);
113
114
  i2c_start();
115
  i2c_write(DS_read);   
116
     winkelHB = i2c_read();
117
  winkelLB = i2c_read(0);       
118
     i2c_stop();             
119
120
  delay_ms(10);
121
}
122
123
124
void doFor(){
125
126
  output_high(Pin_B6);
127
  output_low(Pin_B7);  
128
  output_high(Pin_C7);
129
  output_low(Pin_C6);    
130
}
131
132
void doBack(){
133
  
134
  
135
  output_low(Pin_B6);
136
  output_low(Pin_C7);
137
  output_high(Pin_B6);
138
  output_high(Pin_C7);  
139
}
140
141
void doRight(){
142
143
  output_low(Pin_B6);
144
  output_high(Pin_B7);
145
  output_low(Pin_C6);
146
  output_low(Pin_C7);
147
148
}
149
150
void doLeft(){
151
152
  output_low(Pin_B0);
153
  output_low(Pin_B1);
154
  output_high(Pin_B2);
155
  output_low(Pin_B3);  
156
157
}
158
159
void doStop(){
160
161
  output_high(Pin_B6);
162
  output_high(Pin_B7);
163
  output_high(Pin_C6);
164
  output_high(Pin_C7);
165
166
}
167
168
// Hauptprogramm
169
void main() {
170
  
171
  HW_init();  
172
  
173
174
  while (true){
175
176
      
177
    if(input(PIN_A5)){ //Vorwärts
178
    
179
    delay_ms(2000);
180
181
      while(true){
182
        
183
        if(dis >= 20){
184
          
185
          doFor();    
186
          
187
          doEntf();
188
    
189
        }
190
191
        else{
192
193
          doStop();
194
195
              
196
        }
197
      delay_ms(80);
198
      
199
      }  
200
    }    
201
  }    
202
}

von Karl H. (kbuchegg)


Lesenswert?

Das kommt mir seltsam vor:

Muss man beim Pic nie definieren, ob ein Hardware-Pin jetzt Eingang oder 
Ausgang sein soll? Ich sehe in deinem ganzen Programm nirgends 
entsprechende Codestellen, die wenigstens ungefähr so aussehen als ob 
sie das tun würden. Oder erledigen das die Funktionen input() bzw. 
output()

Auch: Wie ist denn der Taster hardwaremässig angeschaltet?
Ist sichergestellt, dass
a) der entsprechende Pin tatsächlich auf Eingang gestellt ist
b) der entsprechende Portpin nie offen ist. D.h hast du da einen 
externen Pullup (oder Pulldown) Widerstand drann, der dem Pin auch dann 
einen definierten Pegel gibt, wenn der Taster nicht gedrückt ist?

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.