Hallo Leute, ich beschäftige mich grade mit dem Zeugs von Microchip und versteh nich ganz deren Regeln. Ich benutze die MPLAB X IDE und den XC16 Compiler. Als Mikrocontroller benutze ich den dsPIC30F3010. Ich verstehe nicht wie das mit der konfiguration funktioniert und im INet find ich viele verschiedene Arten. Wiso muss ich überhaupt Pragma verwenden um z.B. Oszillator einzustellen? Wiso kann ich nicht einfach dei SFR's setzen? Gibt es irgendwo eine Zusammenfassung wo steht was ich mit pragma konfigurieren muss und was ich einfach im verlauf des Programms ändern kann? Im Datenblatt stehen ja einfach nur die Register und wie sie einzustellen sind. Z.B. habe ich den Oszillator mit %pragma config FOSFPR = XT_PLL16 eingestellt. Den Prescaler muss ich aber (glaube ich) über die SFR's einstellen. Sorry wenn meine Fragen zu undirekt sind. Ich versteh halt den ganzen Sinn dahinter nicht. Habe auch das Dokument zum XC16-Compiler gelesen (finde es extrem unübersichtlich). Vielen Dank schonmal für eure Mühe meine Fragen zu beantworten
Zu den config: Im MBLAB X IDE kann man sich beim XC8 und MPASM die configs generieren lassen, wahrscheinlich beim XC16 auch. Beal schrieb: > Wiso muss ich überhaupt Pragma verwenden um z.B. Oszillator > einzustellen? > Wiso kann ich nicht einfach dei SFR's setzen? Weil du den Oszillator über die configs und über die SFR konfigurieren musst. Wenn du wissen willst wieso das so ist, musst du Microchip frage. Beal schrieb: > Gibt es irgendwo eine Zusammenfassung wo steht was ich mit pragma > konfigurieren muss und was ich einfach im verlauf des Programms ändern > kann? Im dsPIC30F Family Reference Manual unter "24. Device Configuration" in diesem Dokument findest du auch wie du den Oszillator konfigurieren musst.
:
Bearbeitet durch User
Zur zweiten Frage hat MH ja schon geantwortet, hier dann auch noch die Antwort zur Verständnissfrage: Beal schrieb: > Wiso muss ich überhaupt Pragma verwenden um z.B. Oszillator > einzustellen? > Wiso kann ich nicht einfach dei SFR's setzen? Um die SFR zu setzen muss das Programm erst einmal loslaufen. Und damit das Programm losläuft muss der Oszillator ja erst einmal eingerichtet sein. (Alternativ zu den ConfigBits hätte der Hersteller bei Devices mit internem Oszillator natürlich auch einfach festlegen können das nach dem Kaltstart/Reset immer erst der interne Oszillator verwendet wird. Aber mit ConfigBits ist es Universeller) Gruß Carsten
Carsten Sch. schrieb: > Um die SFR zu setzen muss das Programm erst einmal loslaufen. > Und damit das Programm losläuft muss der Oszillator ja erst einmal > eingerichtet sein. Du wählst mit den configs deinen Oszillator aus, und kannst ihn dann mit des SFR noch genauer einstellen, z.B. welche interne Oszillator Frequenz du verwenden willst.
Beal schrieb: > Wiso muss ich überhaupt Pragma verwenden um z.B. Oszillator > einzustellen? Musst du nicht, es geht auch über die config bytes im Projekt (wenn ich mich richtig erinnere). Pragma ist halt ne Anweisung die dadurch C kompatibel ist das der Compiler sie ignoriert wenn er Sie nicht kennt. > Wiso kann ich nicht einfach dei SFR's setzen? Weil das alles eingestellt wird bevor der uP den ersten Befehl abarbeitet. Es sind Anweisungen an die Hardware die beim Programmieren in spezielle Register geschrieben werden. Einiges kann anschließned über SFRs wieder geändert werden, das hat aber nichts mit den config daten zu tun. Die Taktfrequenz kannst du nach belieben umschalten (intern extern x Mhz Y Mhz) die Code protection z.B. lässt sich aber nicht per Firmware ändern.
ok danke für eire antworten hat mir was gebracht. hab den osci eingestellt über pragma. jetz will ich noch den prescaler einstellen was ich ja über die sfr's machen muss. Es funktioniert aber leider nich. habe verschieden werte in die "POST"-bits geschrieben und toggel einen pin an welchem ich immer die gleiche frequenz messe. ich weiss das man um auf die register zu schreiben erst einen code ausführen muss (zwei werte auf das kontroll register schreiben dann hat man einen takt zeit um es einzustelle) wie mach ich das bei c? hat der compiler da pragmas zu oder muss ich das mit inlineassembler machen? Soll ich dafür lieber einen neuen Thread aufmachen? lg Beal
Tipp mal ein [Registername]bits. dann müsste eine Auswahl der einzelnen Bits kommen, die du setzen kannst. kontrollregister o.Ä. habe ich in C nicht gebraucht; das scheint der compiler selbst zu machen.
rava schrieb: > kontrollregister o.Ä. habe ich in C nicht gebraucht Wie hast du dann den Oszillator eingestellt und Timer konfiguriert?
Beal schrieb: > habe verschieden werte in die > "POST"-bits geschrieben und toggel einen pin an welchem ich immer die > gleiche frequenz messe. Wenn das toggeln funktioniert, musst du nur vor dem toggle befehl die SFRs beschreiben. Ich mache das immer als erstes in der main.
:
Bearbeitet durch User
Hallo Beal, zu den #pragma/config bits. die lassen sich bequem in mplabx/xc16 via "Window->Pic Memory View" ansehen und ändern, einfach ausfüllen und dann "Generate Source Code..." klicken. cut&paste in dein main file und fertig. Datenblatt natürlich vorher gelesen und verstanden ;-) zu, bit toggle, achtung, hier liegen stolperfallen, kein mir bekannter compiler wird dir hier immer zu 100% das optimale erzeugen, du solltest die architecture und ihre möglichkeiten, bzw die des compilers kennen. der dsPIC xc16 compiler wird bei den üblichen bit operationen eine kette von instructionen erzeugen die dem kenner das auge bluten lässt. wenn du aber die machine kennst, weisst du das es besser geht, die "help" funtion wird dir hier in mplabx/xc16 hilfe geben. toogle bit ohne builtin compiler hilfe, ca 12 instructionen, mit _builtin , 1 bis 2 und maximale performance. hier: die builtin version: __builtin_btg( (unsigned int *)&LATD , 0 ); // 2 instructionen mit BTG instructions! die classic version , 12 instruktionen: LATDbits.LATD0 = ~LATDbits.LATD0 ; wobei ich denke, dein problem ist in der config, zeig doch mal deinen code und dein HW setup (schaltplan), zumindest, was hast du als taktquelle dran. der 3010 sollte wie meine 2010/4012 mit ca 120mhz (70Mips) mit einem 7.3x quarz laufen. hier meine config die fuer 2010 u 4012 clock(70Mips) macht mit einem 7.3x quarz: // DSPIC30F2010 Configuration Bit Settings #include <xc.h> // FOSC #pragma config FPR = XT_PLL16 // Primary Oscillator Mode (XT w/PLL 16x) #pragma config FOS = PRI // Oscillator Source (Primary Oscillator) SNIP-SNAP mfG
ich benutze wie gesagt den dsPIC30F3010. Der hat maximal 30mips. Betreibe ihn mit 7.3MHz Quarz mit 16PLL macht 116.8MHz woraus sich wieder 29,2mips ergeben(durch 4). Habe die Hardware (das Osci-Config-Register FOSC) mit #pragma config FOSFPR = XT_PLL16 eingestellt. Das funktioniert auch. Habe mit den Kontrollbits überprüft welcher Oscillator läuft. Also bei der Config habe ich keine Probleme mehr. Das Problem was ich habe ist das es noch das Osci Kontroll-Register OSCCON gibt. Da kann mann noch nen Teiler einstellen um z.B. im Betrieb den Tackt zu reduzieren. Hierfür gibt es dann auch den Code der vorher ausgeführt werden muss um es zu verändern. Keine Ahnung ob der Compiler das automatisch macht. Auf jeden fall hab ich alles mit C versucht es zu verändern aber am Tackt der LED ändert sich nichts. Hätte das gerne unter Kontrolle bevor ich weiter mache. lg Beal
Das Beal schrieb: > Kontroll-Register OSCCON ist dafür da um den System Takt des Prozessors einzustellen. Wenn du z.B. weniger Strom verbrauchen willst drehst du den Takt runter. Für Zeiten sind die Timer vorgesehen. Es gibt im Netz einige Pic timer calculators die dir die Konfiguration abnehmen (incl. source code Generierung).
Beal schrieb: > Da kann mann noch nen Teiler einstellen um z.B. im Betrieb > den Tackt zu reduzieren. Hierfür gibt es dann auch den Code der vorher > ausgeführt werden muss um es zu verändern. Keine Ahnung ob der Compiler > das automatisch macht. Ich denke nicht dass der Compioer das autoamatisch macht. Bei den Hardware nahen Dingen ist C i prinzip wie asm, du kusst die nötigen Register/Bits beschreiben, es ändert sich nur der Code mit su das machst.
@ Stefan: Tu uns den Gefallen und kauf dies Ding: http://www.ebay.de/itm/Logitech-Deluxe-250-USB-PC-Computer-Tastatur-Keyboard-deutsch-QWERTZ-/150846244470?pt=DE_Computing_Tastaturen_Keypads&hash=item231f230676
Mein Smartphone hat keinen Anschluss für eine Tastatur... @hans I.: Tu uns den Gefallen und antworte nicht, wenn du nichts zum Thema beitragen kannst.
so habs jetz... man muss das entweder in assaembler schreiben oder man benutzt diese builtin-Funktion: void __builtin_write_OSCCONH(unsigned char value); habe ich im MPLAB XC16 C-Compiler Users Guide gefunden. Jetz hab ich aber wieder ein anderes problem was ich überhaupt nicht verstehe. ich habe diese builtin-Funktion mit verschiedenen werten ausprobiert was auch funktioniert hat. aber jetz kann ich nicht mehr mein pic flashen. esrt hat er irgendwas mit divice id gemeckert. dann habe ich mal das prog neu gestartet und jetzt sagt er: The programmer could not be started: Failed to program the target device hat jemand ne ahnung was ich gemacht habe?
Target Device ID (0x0) does not match expected Device ID (0x1c00000) hat er zuerst gesagt da popt dann ein fenster auf und fragt ob ich trotzdem fortfahren will
naja hab jetz mal ein neuen thread aufgemacht. Beitrag "PIC "Failed to program the target device"" meine eigentliche frage war ja beantwortet. vielen dank für eure mühe
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.