Hallo. ich habe zwei identische Programme für die Compiler "CCS" und "PICC-PRO". Jetzt habe ich mir die serielle Datenübertragung (SPI / Software-Emuliert) bei beiden Versionen am Osci angesehen und musste feststellen, dass die Übertragung bei PICC-PRO >>>280KHz<<< beträgt und beim CCS nur >>>50KHz<<<. Woran kann das liegen? Der Code ist nahezu identisch. Gruß, Tobias
Tobias John wrote: > Woran kann das liegen? Der Code ist nahezu identisch. Wenn der Quellcode identisch ist, dann muss das der erzeugte Code keineswegs sein. Erst recht nicht bei einer Architektur, die sich als Ziel von C Compilern nicht wirklich anbietet. Ausserdem können Compiler-Einstellungen einen Unterschied machen. Ein Beispiel dazu: Der C Standard schreibt vor, dass "int" und "unsigned" mindestens 16 Bits haben. Bei PICs ist das vorsichtig ausgedrückt etwas suboptimal. Und so haben manche Compiler die Möglichkeit, mit 8-Bit "int" zu arbeiten. Und dies vielleicht sogar als Voreinstellung.
Kannst ja mal den erzeugten Code posten, den von der Software-SPI Schleife.
Hallo, hier der Code vom PICC-Pro Compiler der mit 280KHz läuft:
1 | void display_write(unsigned char word, unsigned char _A0) { |
2 | unsigned char zhl; |
3 | A0 = _A0; |
4 | for(zhl=8; zhl>0; zhl--) { |
5 | SCK = 0; |
6 | SDI = 0; |
7 | if( word & 0x80 ) |
8 | SDI = 1; |
9 | word <<= 1; |
10 | SCK = 1; |
11 | }
|
12 | SCK = 0; |
13 | SDI = 0; |
14 | }
|
Die Funktion schreibt Daten/Befehl an ein DOG-M-Display und hier der Code vom CCS-Compiler - der läuft viel zu langsam mit ca 50KHz.
1 | void display_write(unsigned char word, int1 _A0) { |
2 | unsigned char zhl; |
3 | output_bit(A0,_A0); |
4 | for(zhl=8; zhl>0; zhl--) { |
5 | output_low(SCK); |
6 | output_low(SDI); |
7 | if( word & 0x80 ) |
8 | output_high(SDI); |
9 | word <<= 1; |
10 | output_high(SCK); |
11 | }
|
12 | output_low(SCK); |
13 | output_low(SDI); |
14 | }
|
Da ist ja im Grunde kein Unterschied... und doch läuft der CCS-Compiler-Code viel langsamer... Gruß, Tobias
Die Fuses sind auch richtig gesetzt, also gleiche Taktfrequenz? Die 50kHz sind in der Schleife gemessen, dann muss ja in dieser das Problem sein und somit bleiben als Fehlerkandidaten nur noch übrig: > for(zhl=8; zhl>0; zhl--) { > if( word & 0x80 ) > output_high(SDI); > word <<= 1; > }
Verwendest Du beim CCS Compiler im Code die #use fast_io(A) - Direktive für die verwendeten Ports? Wenn nicht, dann ist der Fall klar: Der Compiler fügt vor jedem "output_high" bzw. "output_low" ein "set_tris..." ein, um den Pin als Ausgang zu beschalten. Das kostet natürlich Zeit.
Taktfrequenzmeter ist die gleiche. Fuses sind gleich bei beiden Programmen... Irgendwie muss es am Compiler liegen... ich glaube eher das es an der Funktion "output_low()" liegt - aber wieso/woran genau... ?!?!
Colt Fish schrieb: > Verwendest Du beim CCS Compiler im Code die #use fast_io(A) - Direktive > für die verwendeten Ports? Wenn nicht, dann ist der Fall klar: > Der Compiler fügt vor jedem "output_high" bzw. "output_low" ein > "set_tris..." ein, um den Pin als Ausgang zu beschalten. Das kostet > natürlich Zeit. Ahhh!!! das erklärt das Problem wahrscheinlich. Ich werde es gleich mal ausprobieren. Danke für den Tipp - der CCS und seine Eigenheiten sind mir noch nicht so geläufig. Gruß, Tobias
Carsten schrieb:
> Virtuelle Fabrik?
öhm, wie jetzt?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.