PIC Port C vor Variablen initialisieren

OP #5809662
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.
Angehängte Dateien:
Gast #5809668
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.
#5809704
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.
OP #5809786
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...
OP #5809792
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
#5809895
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.
(Firma: @home) #5810165
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
Gast #5810198
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.
(Firma: @home) #5810202
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
#5810209
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?
(Firma: @home) #5810397
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
#5810679
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ß.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren