PIC18F97J60 -> C18 Codeoptimierung

OP #4198513
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
//}
OP
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
Gast
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.
OP
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...
Gast
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
{
   // ...
}
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.