Probleme bei PWM mit PIC18F45K20

In dieses Forum gehören all deine Fragen rund um die Elektrotechnik und im Speziellen zum Bereich der Mikrocontrollertechnik.

Probleme bei PWM mit PIC18F45K20

#1

Ungelesener Beitrag Fassi » 11. Sep 2019, 18:09

Hallo Forum,

ich möchte mich kurz vorstellen. Ich heiße Philipp und komme aus dem Südosten unserer Republik nähe Chiemsee. Beschäftige mich
als Modellbauer schon länger mit dem Thema Mikrocontroller.
Dann noch ein Dankeschön an dieses tolle Forum und die tolle Seite, hat mir bei den ersten Schritten wirklich sehr geholfen.

So nun zu meinem kleinen Problem:
Ich besitze dieses Set https://www.microchip.com/developmentto ... s/dv164131 hier von Microchip ist schon ein bischen älter.
Wollte mich nun ein wenig in das Thema PWM einarbeiten, habe dazu auch das Datenblatt (41370C) und das Datenblatt des PICs gelesen doch
scheinbar nicht verstanden. Auch hier im Bblog hab ich mir den PWM-Teil angesehen. Werde doch nicht so ganz schlau daraus.

Ich habe rausgefunden das der PIC zwei Module besitzt einmal ein CCP und einmal ein ECCP Modul. Ich wollte es nun mit dem CCP versuchen,
laut Datenblatt kann ich an zwei Pins PWM ausgeben über CCP RC1 und 2 wenn ich das richtig verstanden habe. Wie weiß nun der PIC an welchem Pin ich die PWM ausgeben möchte dazu hab ich nix gefunden, ich hab auch schon Tante Google dazu befragt und zig möglichkeiten Gefunden meist in englischer Sprache was eigentlich kein Problem darstellt, doch irgendwo häng ich, sehe den Wald vor lauter Bäumen nicht.
;-)

Irgendwie vermisse ich da z.B. dem CCP mitzuteilen an welchem Pin ich denn jetzt nun mein PWM Signal ausgeben möchte und muss ich der while-Schleife noch was machen eigentlich sollte ja das CCP den Pin dan jeweils ein und ausschalten so zumindest meine Vorstellung.

Vielleicht könnt ihr mir ja weiterhelfen

Benutzt wird MPLab X IDE v5.25 und XC8 in der Version 2.10

Der Code lautet:

/*
* File: main.c
* Author: Phlipsi
*
* Created on 8. September 2019, 19:50
*/

//#include <stdint.h>
#include <stdlib.h>
#include <xc.h>

#define _XTAL_FREQ 1000000 /*Clock frequency in Hz*/

// PIC18F45K20 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1H
#pragma config FOSC = INTIO67 // Oscillator Selection bits (Internal oscillator block, port function on RA6 and RA7)
#pragma config PWRT = ON // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config WDTEN = OFF // Watchdog Timer Enable bit (WDT is controlled by SWDTEN bit of the WDTCON register)
#pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
#pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)

// Pic initialisieren mit I/O und sonstigem
void pic_init (void)
{
OSCCONbits.IRCF = 0b011; //1MHz

PR2 = 249; //Damit erreiche ich 62.5Hz
CCP1CONbits.CCP1M = 0b1100; //PWM Mode einschalten
T2CONbits.T2CKPS = 0b10; //Timer2 Vorteiler 1:16
TRISCbits.RC2 = 0; //Setze RC2 als Output
CCP1CONbits.DC1B = 0b10; // LSB
CCPR1L = 0b00010111; // MSB Wert von beiden ist 93 da 10bit breite
T2CONbits.TMR2ON = 1; // Timer 2 an
}

void boot (void)
{
pic_init();
}

void main(void) {
while(1);
return;
}

Vielen Dank schon mal.

Grüße Philipp

Re: Probleme bei PWM mit PIC18F45K20

#2

Ungelesener Beitrag pic18 » 11. Sep 2019, 21:24

Du meinst wie du den Ausgang setzt?
bit 3-0 CCP1M<3:0>: Enhanced CCP Mode Select bits
0010 = Compare mode, toggle output on match

du kannst auch auswählen zwischen RC1 und RB3
REGISTER 23-4: CONFIG3H: CONFIGURATION REGISTER 3 HIGH

bit 0 CCP2MX: CCP2 MUX bit
1 = CCP2 input/output is multiplexed with RC1
0 = CCP2 input/output is multiplexed with RB3

Re: Probleme bei PWM mit PIC18F45K20

#3

Ungelesener Beitrag vloki » 12. Sep 2019, 11:51

Fassi hat geschrieben:
11. Sep 2019, 18:09
Der Code lautet:
Da sind schon noch einige Probleme abseits der PWM ;-)

Die Congfig Bits sind nicht vollständig.
Wenn sie es wären, dann wäre dir vermutlich auch aufgefallen, wo man die Option zur Einstellung des CCP Pins findet.
(pic18 hat es ja schon gezeigt)

Was soll die Funktion boot()?
Die wird nie aufgerufen und darum auch nie die Funktion pic_init()

Code: Alles auswählen

void main(void) {
    pic_init();
    while (1);
    return;
}
Wenn nicht das ECCP Modul verwendet werden solle, dann müsste man eigentlich CCP2 nehmen.
Die optionalen Pins (RC1, RB3) für diese Modul hat pic18 schon aufgezählt. RC2 gehört zum ECCP1.

Dein Code sieht so aus, als ob du das ECCP1 im CCP Modus betreiben willst, auch wenn dein Text eigentlich anderes vermuten lässt.

Was für ein Tastverhältnis soll deine PWM haben?
(Es könnte sein, dass du das mit den 10 Bit Auflösung falsch verstanden hast.
im Moment dürfte es so 10% sein)

Re: Probleme bei PWM mit PIC18F45K20

#4

Ungelesener Beitrag Fassi » 13. Sep 2019, 08:43

Hallo pic18 und vloki,

vielen Dank für die Hilfestellung.
vloki hat geschrieben:Da sind schon noch einige Probleme abseits der PWM ;-)
habe nie was anderes behauptet 8-)

Hab gestern auch schon gemerkt was ich da fürn Mist zusammen geschrieben habe ;-).
Das war auch das Problem das ich fünf verschiedene Möglichkeiten gefunden hab, und dann einfach
ohne darüber nachzudenken das abgetippt habe und ECCP und CCP durcheinander gewürfelt hab.
vloki hat geschrieben:Die Congfig Bits sind nicht vollständig.
Wenn sie es wären, dann wäre dir vermutlich auch aufgefallen, wo man die Option zur Einstellung des CCP Pins findet.
(pic18 hat es ja schon gezeigt)
d.h. die immer komplett übernehmen? Habe mich bezüglich der Aufteilung und Quellcode-Aussehen am Code von
Herrn Pannwitz orientiert da der sehr übersichtlich und aufgeräumt ist.

deshalb auch die boot() und pic_init() funktion, das es ohne deren Aufruf nicht funktioniert is mir klar ;-)
Wie gesagt, manchmal sieht man sprichwörtlich den Wald vor lauter Bäumen nicht mehr :-P

ja das Tastverhältnis von 10% kommt hin, 93 entspricht ca. 1,5ms was der Mittelstellung eines Servos entspricht.

wenn ich die Artikel der Bitmanipulation, die ich mir angeschaut habe verstanden habe, dann sollte ich doch so relativ
elegant meine Werte setzten können. Oder gäbe es da noch eine andere bessere Variante

Code: Alles auswählen

#define PWM_VALUE 93            //93 entspricht 1,5ms
CCP2CONbits.DC2B = PWM_VALUE & 0x3;        // LSB
CCPR2L = PWM_VALUE >> 2;                  // MSB
überarbeiteter code:

Code: Alles auswählen

#include <stdlib.h>
#include <xc.h>


#define _XTAL_FREQ  1000000     // clock frequency in Hz
#define PWM_VALUE 93            //93 entspricht 1,5ms


// PIC18F45K20 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1H
#pragma config FOSC = INTIO67   // Oscillator Selection bits (Internal oscillator block, port function on RA6 and RA7)
#pragma config PWRT = ON        // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
// CONFIG2H
#pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT is controlled by SWDTEN bit of the WDTCON register)
// CONFIG3H
#pragma config CCP2MX = PORTC  // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
// CONFIG4L
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)

// PIC initialisieren I/O und sonstiges

void pic_init(void)
{
    TRISCbits.RC1 = 0;           // RC2 als Ausgang für PWM (CCP2)
    OSCCONbits.IRCF 0b011;       // Takt auf 1MHz einstellen
    
    //PWM konfigurieren
    PR2 = 249;                   // mit Vorteiler 1:16 und 1MHz : 4 ergeben sich 62.5Hz
    CCP2CONbits.CCP2M = 0b1100;  // PWM Mode einschalten
    T2CONbits.T2CKPS = 0b10;     // Vorteiler auf 1:16
    CCP2CONbits.DC2B = PWM_VALUE & 0x3;        // LSB
    CCPR2L = PWM_VALUE >> 2;                  // MSB
    
    T2CONbits.TMR2ON = 1;      // Timer2 anschalten
}

void boot (void)
{
    pic_init();
}


void main(void) {
    boot();
    while(1);
    return;
}
vielen Dank

Re: Probleme bei PWM mit PIC18F45K20

#5

Ungelesener Beitrag vloki » 13. Sep 2019, 09:49

Hört sich an, als ob das jetzt läuft ;-)

Das mit der Zuweisung des Tastverhältnisses sieht gut aus. (& 0x03 könnte man weg lassen, aber dann sieht es nicht mehr so schön aus)

Am Anfang würde ich wirklich immer alle Config Bits mitnehmen. Die Gefahr ist sonst groß, dass man irgendwas übersieht.

Ich pack die immer in eine eigene Sourcedatei. Dann sind die auch schön aufgeräumt und können auch super von mehreren Projekten genutzt werden....

Kosmetik:
stdlib.h und _XTAL_FREQ braucht man hier eigentlich nicht. stdlib.h wird evtl. sogar nochmal über xc.h eingefügt.

(Ich nehme mal an, das = bei der Einstellung des internen Oszillators ging beim Posten verloren)

Re: Probleme bei PWM mit PIC18F45K20

#6

Ungelesener Beitrag Fassi » 13. Sep 2019, 15:07

Hallo ihr beiden,
nochmals recht herzlichen Dank für die schnelle hilfe, nun wo alles richig und vollständig im
code steht. Funktioniert er auch ;-)

@vloki vielen Dank für den Hinweis mit der Konfiguration per Sourcefile, das finde ich eine sehr gute Idee.

Ein schönes Wochende wünsche ich
Philipp

Re: Probleme bei PWM mit PIC18F45K20

#7

Ungelesener Beitrag Herbert » 13. Sep 2019, 17:09

vloki hat geschrieben:
13. Sep 2019, 09:49

Ich pack die immer in eine eigene Sourcedatei. Dann sind die auch schön aufgeräumt und können auch super von mehreren Projekten genutzt werden....

Hallo vloki,
abe wie macht man das, wenn möglich Schritt für Schritt Erklärung mit Beispiel zb. mit den Config Bits hier von Fassi seinem Programm.
Und wenn du die Source Datei mit den Config Bits erstellt hast wo speicherst du diese dann hin? in den Projektordner von MPLAB X oder einfach auf die HDD.
Ja das sind schon seltsame Fragen, wo andere sagen ist doch klar usw. Aber für mich eben nicht.
Grüße Herbert

Re: Probleme bei PWM mit PIC18F45K20

#8

Ungelesener Beitrag vloki » 13. Sep 2019, 20:34

Wo die Datei gespeichert wird, hängt von ihrer Verwendung ab.

Wird sie nur im aktuellen Projekt verwendet,
dann sollte sie im Projektordner gespeichert werden.

Soll sie unverändert in mehreren Projekten verwendet werden,
dann sollte sie in einer Art Bibliotheksverzeichnis abgelegt werden.

Lies mal das Kapitel 6.2 Eine eigene Sourcecode-Bibliothek erstellen / verwenden
im Script das du als oberstes in der rechten Spalte hier findest.
https://www.hs-ulm.de/wir/Personal/Pers ... r/uCQMCON/

Da wird beschrieben wie man dem Projekt neue Dateien hinzufügt.

Für die Configbits würde ich persönlich eine .c verwenden weil es etwas ist,
das in einem Header eigentlich nichts zu suchen hat:
-> 6.3 Sourcecode und Header Dateien
Eine Header Datei brauchst im Falle der Configbits nicht!

Re: Probleme bei PWM mit PIC18F45K20

#9

Ungelesener Beitrag Gast » 13. Sep 2019, 22:47

Hallo vloki,
danke für die Rückmeldung und Hilfe.
Grüße Herbert

Antworten