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
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.
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 ?
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.
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
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
Dittmar L. schrieb: > PS: Leider kann ich die HW nicht mehr ändern! Soll bald in Serie > gehen... Also bereits defekt per Design...
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.
... 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
Evtl. mit dem internen OSzillator starten. Der ist quasi sofort da. Spaeter auf den Quarz umschalten.
> 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.
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?
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.
... 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
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
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?
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...
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
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
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
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)
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
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
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
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ß.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.