Forum: Mikrocontroller und Digitale Elektronik PIC18F97J60 -> C18 Codeoptimierung


von Ingo S. (schicki)


Lesenswert?

Hallo Zusammen,

ich habe ein kleines Programm geschrieben. Das Programm funktioniert im 
wesentlichen. Bei der Implementierung des kleinen Protokolls bin ich auf 
ein winziges Problem gestoßen.

Der Controller ließt Datum, Uhrzeit und Temperatur aus. Das 
funktioniert. Nun soll die Schnittstelle prüfen, ob Daten anliegen, und 
da liegt das Problem.

Der Controller bleibt mir da immer bei der Prüfung der Schnittsstelle 
stehen, und die Uhrzeit usw. wird nicht weiter aktualisiert. Diese wird 
nur aktualisiert, wenn ich ständig Daten an den Controller stehe. Der 
restlcihe Code funktioniert soweit das ist der einige Makel an der 
ganzen Sache. Irgenwie sehe ich den Wald vor lauter Bäumen nicht mehr. 
Hat jemand eien Tipp wie ich das optimieren kann?

Danke und Gruß
Ingo

Hier wäre der betroffene Auszug aus dem Quellcode:
1
dt.Stunden = DS1337_Read_Stunden(&dt);
2
dt.Minuten = DS1337_Read_Minuten(&dt);
3
dt.Sekunden =DS1337_Read_Sekunden(&dt);
4
    
5
dt.Tag = DS1337_Read_Tag(&dt);
6
dt.Monat = DS1337_Read_Monat(&dt);
7
dt.Jahr = DS1337_Read_Jahr(&dt);
8
dt.Wochentag = DS1337_Read_Wochentag(&dt);
9
        
10
strcpy(chr_Wochentag, Wochentag_Namen[dt.Wochentag]); 
11
    
12
int_Temp_CPU = GetTempLM75(1);
13
Warten_MS(100);
14
  
15
LcdPrintf(2,0, (const MEM_MODEL rom char *)"%.3s", chr_Wochentag);  
16
LcdPrintf(2,4, (const MEM_MODEL rom char *)"%.2u", dt.Tag);
17
LcdPrintf(2,7, (const MEM_MODEL rom char *)"%.2u", dt.Monat);
18
LcdPrintf(2,12, (const MEM_MODEL rom char *)"%.2u", dt.Jahr);
19
        
20
LcdPrintf(2,15, (const MEM_MODEL rom char *)"%.2u", dt.Stunden);
21
LcdPrintf(2,18, (const MEM_MODEL rom char *)"%.2u", dt.Minuten);
22
LcdPrintf(2,21, (const MEM_MODEL rom char *)"%.2u", dt.Sekunden);
23
LcdPrintf(2,30, (const MEM_MODEL rom char *)"%.4i", int_Temp_CPU);
24
    
25
//if (!DataRdy1USART())
26
//{
27
// STX|CMD|VALUE|ETX|\n
28
while (!DataRdy1USART());
29
gets1USART(unc_Data,6);
30
         
31
uint_Data_0 = (int)unc_Data[0];
32
uint_Data_1 = (int)unc_Data[1];
33
uint_Data_2 = (int)unc_Data[2];
34
uint_Data_3 = (int)unc_Data[3];
35
//}

von Malli (Gast)


Lesenswert?

Ingo S. schrieb:
> Diese wird nur aktualisiert, wenn ich ständig Daten an den Controller  > stehe.

Was ist los? Sind die Eingänge von analog auf digital umgestellt?

von Ingo S. (schicki)


Lesenswert?

Sämtliche Eingänge und Analog-Ports funktionieren wie sie sollen.

Mir bleibt nur das Programm bei der Serielen Schnittstelle hängen. und 
kehrt nicht mehr zum aus dieser Scnleife zurück. Sprich Uhrzeit anzeigen 
usw.

Uhrzeit, Datum usw. aktualisieren

Schnittstelle prüfen -> Daten vorhanden ja -> Daten auswerten und ggf. 
Aktionen auswerten. Geht

keine Daten vorhanden -> Uhrzeit, Datum usw. aktualisieren

von Malli (Gast)


Lesenswert?

Tut mir Leid aber Du schreibst so verwirrend, dass es einem schwer fällt
das eigentliche Problem zu verstehen.

Dein Controller bleibt hier
while (!DataRdy1USART());

hängen, wenn Du ihm keine Daten sendest, habe ich das richtig
verstanden? Wenn ja, dann würde ich sagen macht der Code genau das was
er soll.

von Ingo S. (schicki)


Lesenswert?

ganz genau.

Er soll prüfen ob Daten da sind wenn ja weiter machen wenn nicht was 
anderes machen. Wie würdest Du dies tun?

von Malli (Gast)


Lesenswert?

Warum nicht einfach if else?

von Ingo S. (schicki)


Lesenswert?

geht irgendwie nicht. Da ich mehrere Zeichen sende geht das irgendwie 
nicht.

STX|CMD|VALUE|ETX|\n

HAbs geprüft und komm da leider nicht so weiter wie ich will wenn ich 
nur 1 Byte sende dann klappt das aber bei mehreren Bytes leider nicht 
Die while Schleife habe ich bei If then else ausgeklammert...

von Malli (Gast)


Lesenswert?

Dann lies doch einfach immer ein gesamtes Datenpaket ein, etwa so:

if( keine Daten da )
{
   for( ... ) // Anzahl an Bytes
   {
      Daten einlesen
      while( keine Daten da );
   }
}
else
{
   // ...
}

von Malli (Gast)


Lesenswert?

Das kann man dann noch beliebig aufbauschen um auch eine Synchronisation 
mit dem Startbyte zu machen etc pp

von Ingo S. (schicki)


Lesenswert?

ok, klingt plausibel, teste ich mal danke...

von Malli (Gast)


Lesenswert?

Schön ist das allerdings nicht. Ich würde das höchstens zum Testen 
verwenden. Arbeite am Besten mit dem Interrupt, den das USART Modul 
auslösen kann, wenn ein Datenpaket eingetroffen 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.