Forum: Mikrocontroller und Digitale Elektronik PIC Port C vor Variablen initialisieren


von Dittmar L. (dittmarlange)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe ein kleines Problem mit einem PIC16F1718. Meine 
Appplikationsfirmware ist recht umfangreich, so dass darin zahlreiche 
Variablen benutzt werden. Diese Variablen müssen vor der Verwendung 
initialisiert werden, was man auch recht bequem dem Linker überlassen 
kann imdem, man bei den Optionen für den XC8-cc Compiler zwei Häkchen 
setzt: nämlich bei "Clear bss" und bei "Initialize data". Das hat 
allerdings zur Folge, dass nach einem Reset vor der Ausführung der 
main-Routine eine ziemliche lange Zeit ins Land geht, bis der Prozessor 
alle Variablen initialisiert hat (in meinem Fall sind das 15ms!).
In dem Bild im Anhang entspricht die rote Kurve einen Portpin an Port C, 
der nach dem Reset eine Zeit lang high ist (wegen externen Pullup), ehe 
ich ihn in main auf Null setzten kann und im Anschluss eine PWM 
hochfahre. Ich benutze den Port im Open-Drain-Mode, da mehrere µC darauf 
zugreifen können. Dieser kurze Puls ist leider sehr störend, da es sich 
um eine Beleuchtungsapplikation handelt und man beim Einschalten einen 
kurzen Blitz sieht!
Meine Frage an die Spezialisten lautet: gibt es eine Möglichkeit eine 
Portpin Initialisierung vor die Variableninitialisierung zu setzen?

Vielen Dank und beste Grüße
D. Lange

PS: die blaue Kurve zeigt die Lichtintensität.

: Bearbeitet durch User
von kyrk (Gast)


Lesenswert?

Ja. Du must den CStartup selbst schreiben und alles da initialisieren + 
C Umgebung aufsetzten. Dann kannst du auch die Ports beliebig 
initialisieren.
Ggf kannst du aus dem Compiler eine Reference Implementierung dir holen 
und den Ändern. Dann ASM file einbinden und kompilieren. Und beim 
Compiler oder Linker noch sagen dass du ohne C Startup routine links. 
Hast ja dein eigenen.

Viele Projekte machen es so. Zum Beispiel Clock, MPU setzten, 
Performance Einstellungen machen. Dann Section Init und C Environment 
Init.

von Max D. (max_d)


Lesenswert?

Beim GCC kann man Funktionen über bestimmte Sektionen vor die Init 
legen. Die müssen dann (mangels Initialiserung (duh)) i.A. als 
inline-assembler geschrieben sein.
Vlt. kann der XC das ja auch ?

von Peter D. (peda)


Lesenswert?

Dittmar L. schrieb:
> in meinem Fall sind das 15ms!

Für nur 2kB RAM ist das viel. Vermutlich ist eher das Delay der internen 
Resetschaltung die Hauptursache. Ein Quarz braucht eine Mindestzeit zum 
stabilen Anschwingen.

Dittmar L. schrieb:
> wegen externen Pullup

Einen Pullup oder Pulldown legt man immer so fest, daß er die Last im 
Off-State hält. D.h. bei high aktiver Last nimmt man natürlich einen 
Pulldown.
Notfalls nimm einen extra Portpin mit Pulldown, der erst im Init den 
Pullup zuschaltet.

von Dittmar L. (dittmarlange)


Lesenswert?

Ich habe die beiden genannten Compilerschalter mal "dissabled", 
woraufhin die Zeit nur noch 1 ms betrug... allerdings hat dann die 
Applikation auch nicht mehr funktioniert. :-(
Ich könnte natürlich sämtliche Variablen suchen und jeweils im Code 
Funktionen schreiben, die die Variablen initialisieren. Das wäre aber 
ein gewaltiger Aufwand und ich wüsste gern, ob es einen anderen Weg 
gibt...

PS: Leider kann ich die HW nicht mehr ändern! Soll bald in Serie 
gehen...

: Bearbeitet durch User
von Dittmar L. (dittmarlange)


Lesenswert?

kyrk schrieb:
> Ja. Du must den CStartup selbst schreiben und alles da initialisieren +
> C Umgebung aufsetzten. Dann kannst du auch die Ports beliebig
> initialisieren.
> Ggf kannst du aus dem Compiler eine Reference Implementierung dir holen
> und den Ändern. Dann ASM file einbinden und kompilieren. Und beim
> Compiler oder Linker noch sagen dass du ohne C Startup routine links.
> Hast ja dein eigenen.
>
> Viele Projekte machen es so. Zum Beispiel Clock, MPU setzten,
> Performance Einstellungen machen. Dann Section Init und C Environment
> Init.

Hallo kyrk,
danke für deinen Beitrag! Könntest du das evtl. etwas detaillierter 
beschreiben? Oder mir sagen, wo ich mehr zu dem Thema lesen kann!? So 
hilft mir das momentan nicht so viel weiter! ;-)

Gruß
Dittmar

: Bearbeitet durch User
von Dirk F (Gast)


Lesenswert?


von Route_66 H. (route_66)


Lesenswert?

Dittmar L. schrieb:
> PS: Leider kann ich die HW nicht mehr ändern! Soll bald in Serie
> gehen...

Also bereits defekt per Design...

von Peter D. (peda)


Lesenswert?

Dittmar L. schrieb:
> PS: Leider kann ich die HW nicht mehr ändern! Soll bald in Serie
> gehen...

Es gibt Designfehler, die kann man nicht in SW korrigieren.
Die Resetzeit wird ja nicht allein durch den Initcode bestimmt. Ein 
Quarz braucht seine Zeit, bei den AVRs werden sogar 65ms empfohlen, 
damit er stabil arbeitet. Auch kann bei Unterspannung der MC beliebig 
lange im Reset verbleiben. Und bei ISP oder Bootloader Ausführung 
bleiben auch alle anderen Ports in Tristate.

Solange es keine BGAs sind, sollte ein Patchen leicht möglich sein, Du 
wärst nicht der erste.

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

... das ist einfach in xc8 mit __init() zu realisieren!

Weakly bound to __init(), see “The Powerup Routine”. If user defines 
__init(), it will be jumped into immediately after a reset.

selbstständiges denken und lesen hilft, aber das haben hier wohl die 
meisten schon verlernt oder schlimmer, nie gekonnt!


mt

von ... (Gast)


Lesenswert?

Evtl. mit dem internen OSzillator starten. Der ist quasi sofort da.
Spaeter auf den Quarz umschalten.

von ... (Gast)


Lesenswert?

> selbstständiges denken und lesen hilft, aber das haben hier wohl die
> meisten schon verlernt oder schlimmer, nie gekonnt!

Wir leben in der Republik fuer betreutes Denken!

Selber schuld.

von Volker S. (vloki)


Lesenswert?

Apollo M. schrieb:
> Weakly bound to __init(), see “The Powerup Routine”. If user defines
> __init(), it will be jumped into immediately after a reset.

Wow, geil, C18 __init() style. Aus welcher Version der XC8 Compiler Doku 
kommt das Zitat?

von Wolfgang (Gast)


Lesenswert?

Dittmar L. schrieb:
> PS: Leider kann ich die HW nicht mehr ändern! Soll bald in Serie
> gehen...

Dann fang noch mal bei A-Muster an - nennt sich Entwicklungsschleife.

Warum baut man einen Pull-Up ein, wenn der Ausgang mit 0 starten soll?
IMHO jeder µC mit konfigurierbaren Pins schaltet dies beim Initialieren 
auf Input, damit er evtl. daran hängender Hardware nicht schaden kann, 
i.e. damit Ausgang-Ausgang sicher erstmal ausgeschlossen ist.

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

... schrieb:
> Evtl. mit dem internen OSzillator starten

das liefern die jüngeren pic monster alle via hw support.

aber ohne manual lesen ... geht da auch wieder nichts!
der TU schweigt ja zu dem thema clock/config und übt lieber weiter in 
rumfragen.

siehe:

IESO: Internal External Switchover bit
1 = Internal/External Switchover mode is enabled
0 = Internal/External Switchover mode is disabled


mt

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Wolfgang schrieb:
> IMHO jeder µC mit konfigurierbaren Pins schaltet dies beim Initialieren
> auf Input, damit er evtl. daran hängender Hardware nicht schaden kann,

ist hier heute wider ratestunde?!

jeder mir bekannte uc startet mit port lines im tristate! oder wie soll 
sonst low power/sleep funktionieren?!


mt

von Dittmar L. (dittmar)


Lesenswert?

Apollo M. schrieb:
>
> selbstständiges denken und lesen hilft, aber das haben hier wohl die
> meisten schon verlernt oder schlimmer, nie gekonnt!
>
> mt

Klar hätte ich nur mal scharf nachdenken müssen, dann wäre ich sicher 
von ganz allein drauf gekommen... "JA, da gibt es doch bestimmt eine 
Funktion dafür... die heisst bestimmt, lass mal nachdenken... die heisst 
bestimmt ... __init()... und die muss ich nur irgendwo einbinden! Gut, 
dass mir das eingefallen ist!"

Apollo, hast du deinen Tipp von Dirks Beitrag abgeschrieben oder ist dir 
das selber eingefellen?

von Volker S. (vloki)


Lesenswert?

Dittmar L. schrieb:
> Apollo, hast du deinen Tipp von Dirks Beitrag abgeschrieben oder ist dir
> das selber eingefellen?

Irgendwie nicht. Das __init() sehe ich nirgends und hätte es schon gerne 
zurück...

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Volker S. schrieb:
> Wow, geil, C18 __init() style. Aus welcher Version der XC8 Compiler Doku
> kommt das Zitat?

... aus aktuellem mplabx help. hat mich auch gewundert, dass sieht nach 
avr/gcc aus und funktioniert sogar in xc8 - im simulator überprüft.


mt

von Volker S. (vloki)


Lesenswert?

Apollo M. schrieb:
> ass sieht nach
> avr/gcc aus und funktioniert sogar in xc8

Auch für PIC16? Muss ich gleich testen...

: Bearbeitet durch User
von Apollo M. (Firma: @home) (majortom)


Lesenswert?

ja!

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Dittmar L. schrieb:
> Apollo, hast du deinen Tipp von Dirks Beitrag abgeschrieben oder ist dir
> das selber eingefellen?

nee ganz altmodisch, in doku nachschauen, lesen, verstehen UND 
überprüfen statt nur behaupten.


mt

von Volker S. (vloki)


Lesenswert?

Bei mir (16F1459) nicht :-(

- Breakpoint broken
- "newmain.c:15:: warning: (520) function "___init" is never called"

ABER nicht die neueste IDE und XC8 Version (5.10, 2.00)

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Volker S. schrieb:
> Irgendwie nicht. Das __init() sehe ich nirgends und hätte es schon gerne
> zurück...

... ich habe wohl doch wieder nur müll erzählt, die compiler optimierung 
hat wieder zugeschlagen.

sorry, ich nehme alles zurück und behaupte das gegenteil.


mt

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Volker S. schrieb:
> Irgendwie nicht. Das __init() sehe ich nirgends und hätte es schon gerne
> zurück...

... was geht ist folgendes, das powerup.as template ins project source 
verzeichnis legen und vor den dort gesetzten code den eigenen asm code 
einfügen. dieser wird dann direkt als erstes angesprungen.

der compiler kennt die template labels, weitere einstellungen sind nicht 
nötig.

breakpoints in powerup.as gehen nur im program memory window und nicht 
im source file.


mt

: Bearbeitet durch User
von Dittmar L. (dittmarlange)


Lesenswert?

Die große Resonanz zeigt mir, dass das Thema doch nicht jedem so ganz 
klar war! Vielen Dank an alle für die meist doch substanziellen 
Beiträge!

Liebe Grüße
Dittmar

von Peter D. (peda)


Lesenswert?

Es sind schon einigen Leuten während des Programmierens die MOSFETs der 
PWM abgeraucht, weil sie die Pulldowns "vergessen" hatten.
Daß ein MC beliebig lange floatende IO-Pins haben kann, ist kein Unfall, 
sondern ein normaler Betriebszustand, den man immer berücksichtigen muß.

von Dittmar L. (dittmarlange)


Lesenswert?

Dirk F schrieb:
> Schau mal hier:
>
> http://microchipdeveloper.com/xc8:powerup-routine

Hallo Dirk,

das scheint das zu sein, was ich gesucht habe :-)
Konnte es aber bis jetzt noch nicht testen. Trotzdem vielen Dank schon 
mal jetzt!

Gruß
Dittmar

von Dittmar L. (dittmarlange)


Lesenswert?

Dirk F schrieb:
> Schau mal hier:
>
> http://microchipdeveloper.com/xc8:powerup-routine

Hallo Dirk,

inzwischen konnte ich das Problem dank deinem Hinweis lösen! Noch mal 
vielen Dank! Ich hoffe, ich kann mich mal mit einem Tip meinerseits 
revanchieren!

Beste Grüße
Dittmar

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.