Forum: Mikrocontroller und Digitale Elektronik PIC pragma config allgemeine Fragen


von Beal (Gast)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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
von Carsten S. (dg3ycs)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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.

von A+B = C (Gast)


Lesenswert?

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.

von Beal (Gast)


Lesenswert?

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

von rava (Gast)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

rava schrieb:
> kontrollregister o.Ä. habe ich in C nicht gebraucht
Wie hast du dann den Oszillator eingestellt und Timer konfiguriert?

von Max H. (hartl192)


Lesenswert?

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
von Peter C. (peter_c49)


Lesenswert?

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

von Beal (Gast)


Lesenswert?

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

von A+B = C (Gast)


Lesenswert?

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).

von Stefan (Gast)


Lesenswert?

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.

von hans l. (Gast)


Lesenswert?


von Stefan (Gast)


Lesenswert?

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.

von Beal (Gast)


Lesenswert?

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?

von Beal (Gast)


Lesenswert?

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

von Beal (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.