Forum: Mikrocontroller und Digitale Elektronik PIC12F1822-PWM Mode


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

vorerst möchte ich sagen, dass ich in Sachen Mikrocontroller ein 
Anfänger bin und mich gerade in der Einarbeitungsphase befinde. Ich bin 
gerade dabei mich mit dem PWM Mode zu beschäftigen (benötige ich für 
mein Projekt) und arbeite dabei sehr eng mit dem Datenblatt (befindet 
sich im Anhang). Ich arbeite mit dem PIC12F1822 und programmiere mit C. 
Ich habe ungefähr die Funktion verstanden, die der Mikrocontroller 
erledigen muss, um am PIN ein Rechtecksignal herauszugeben und befolge 
die Schritte auf der Seite 209 auf dem Datenblatt, um ein Rechtecksignal 
am PIN2 herauszugeben. Doch irgendwie klappt das Ganze nicht. Was mich 
noch verwirrt ist der Register Adresl und AdresH und zudem bin ich mir 
nicht sicher, in welchem Register ich meine digitalen Werte reinladen 
muss (ich nehme PR2-Register an (da ja PR2 mit TMR2 verglichen wird). 
Was noch gesagt werden muss: Ich habe am PIN5 ein analoges Signal und 
wandle diesen durch den ADC in ein digitales um (funktioniert 
einwandfrei) und möchte diese Werte am PIN2 rausschicken. Ich weiß, dass 
meine Fragen nicht konkret sind, aber ich hoffe, dass ihr mir trotzdem 
helfen könnts.

Gruß

Thomas

P.S.: Ich kann eure Tipps erst am Montag befolgen, da ich daheim den 
Mikrocontroller nicht habe.

von Anja (Gast)


Lesenswert?

Hallo,

so wie ich die sache sehe gibt es folgende Fehlermöglichkeiten:

APFCON-Register richtig gesetzt (CCP-Ausgang auf falschem PIN)

ANSEL-Register (steht Pin noch auf Analog-Eingang?)

TRIS-Register richtig gesetzt (die Anleitung auf 209 ist etwas 
verwirrend)
das entsprechende Bit sollte = 0 gesetzt sein.

Gruß Anja

von Thomas (Gast)


Lesenswert?

Hallo Anja,

TRIS-Register ist sicher auf Ausgang gesetzt, aber das mit 
ANSEL-Register könntest du wirklich Recht haben. APFCON-Register denke 
ich eher weniger, da der PIC12F1822 beim Einschalten den PIN2 als CCP1 
sieht. Es könnte sein, dass der PIC12 beim Einschalten die PINS als 
analog setzt. Ich bedanke mich für deine schnelle Antwort :-)

Gruß

Thomas

von PIC N. (eigo) Benutzerseite


Lesenswert?

Das ANSEL Register hat keine Wirkung, wenn das entsprechende TRIS Bit 
auf 0 (Ausgang) gesetzt ist.

von Thomas (Gast)


Lesenswert?

hmm stimmt auch wieder...

von PIC N. (eigo) Benutzerseite


Lesenswert?

Schau mal: 
http://pic-projekte.de/wiki/index.php?title=PIC_Tutorial#Pulsweitenmodulation_.28PWM.29
Ansonsten vielleicht mal den Code zur Verfügung stellen.

Gruß Nico

von Thomas (Gast)


Lesenswert?

Danke Nico :-) werde es gleich mal morgen ausprobieren....

von Thomas (Gast)


Lesenswert?

Ach ja noch ne Verständnisfrage....Muss ich eine while(1) schleife noch 
reintun oder nicht? weil die befehle sich ja wiederholen müsste bzw 
eigentlich nur der timer2.....

von PIC N. (eigo) Benutzerseite


Lesenswert?

Wenn ich dich jetzt richtig verstehe..:
Du glaubst du brauchst eine Endlosschleife, damit das PWM Signal am Pin 
immer wieder wiederholt wird bzw. nicht aufhört?

..: Dann: Nein! Der PIC bzw. der Programmierer stellt den Timer und die 
entsprechenden Register einmal ein, dann arbeitet der Timer von alleine 
weiter, der PIC kann nebenbei weiter arbeiten. Das ist ja der Vorteil 
von Hardware(timern) gegenüber irgendwelcher Warteschleifen.

Ich hoffe das war, was du wissen wolltest.

Gruß Nico

von Thomas (Gast)


Lesenswert?

jap, das war meine frage :-) danke für deine antworten

von Thomas (Gast)


Lesenswert?

Hey Nico und Co.,

ich habe die Anweisungen befolgt und zudem nochmals selber die 
Anweisungen des Dateblatts befolgt, doch ich komme immernoch nicht auf 
das gewünschte Ergebnis. APFCON ist richtig eingestellt. Ich stelle mal 
den Code rein. Ich hoffe, dass ihr mir weiterhelfen könnts.

Code:

void main(void)
{

(TRISA5 = 1) // Laut Datenblatt zuerst PIN als Eingang setzen und am 
Ende auf Ausgang
PR2 = 0xFF; // Einstellung Periode
CCP1CON = 0x0C; // PWM Mode auswählen
CCPR1L = 0xC8; // Einstellung Duty Cycle
T2CON = 0x79; // Einstellung Prescaler und Postscaler
T2CONbits.TMR2ON = 1; // Timer2 einschalten
TRISA5 = 0; // PIN2 als Ausgang setzen

}

von PIC N. (eigo) Benutzerseite


Lesenswert?

Welchen Compiler verwendest du? Hi-tech?

Versuch mal das:
1
void main(void)
2
{
3
  TRISA5 = 0;       // PIN2 als Ausgang setzen
4
  PR2 = 0xFF;       // Einstellung Periode
5
  CCP1CON = 0x3C;     // PWM Mode auswählen
6
  CCPR1L = 0xC8;     // Einstellung Duty Cycle
7
  PIR1bits.TMR2IF=0;   // Interrupt deaktiviert
8
  T2CON = 0x79;     // Einstellung Prescaler und Postscaler
9
  T2CONbits.TMR2ON = 1; // Timer2 einschalten
10
}

Woher weißt du, dass es nicht funktioniert? Hast du den Ausgang mit 
einem Oszilloskop gemessen? Wenn du kein Scope zur Verfügung hast, dann 
stell einfach mal die Bits 4 und 5 im CCP1CON Register auf 1 und schreib 
0xFF in das CCPR1L Register. Jetzt müsstet du am Ausgang des PIC nahezu 
5V haben.

Jetzt schreibst du 0x00 in das CCPR1L Register und löscht die Bits 4 und 
5 im CCP1CON Register - Jetzt sollten nahezu 0V am Ausgang anliegen.

Wenn immer noch Probleme auftreten, bitte den ganzen Code posten und 
den Schaltplan gleich dazu.

Gruß Nico

von Thomas (Gast)


Lesenswert?

Hallo Nico,

dein Code funktioniert einwandfrei :-). Mein Code war ziemlich ähnlich, 
aber ich habe ein Fehler eingebaut (weiß nicht mehr genau was es war). 
Nur eine Sache funktioniert nicht ganz. Ich kann das Signal nur bei PIN5 
ausgeben (habe dementsprechend TRISA2 anstatt TRISA5) und nicht wie 
gewünscht bei PIN2. Ich habe APFCONbits.CCP1SEL auf 1 gesetzt, damit 
wirklich auch nur PIN2 als CCP1 gesetzt wird, aber es funktioniert 
trotzdem nicht. Komisch ist auch, dass ich bei PIN5 APFCON überhaupt 
nicht ändern muss, PIN5 gibt immer das Signal aus. PIN2 gibt nie das 
Signal aus. Meine Lage ist jetzt so, dass das PWM Signal wunderbar 
funktioniert, aber nur bei PIN5 (PIN2 ist wünschenswert). Hättest du 
eine Lösung?

Mein Code:

void main(void)
{
APFCONbits.CCP1SEL = 1; //CCP1-Pin wählen
TRISA5 = 0;            // PIN2 als Ausgang setzen
PR2 = 255;             // Periode wählen
CCP1CONbits.CCP1M = 0b1100; // PWM Mode wählen
CCPR1L = 128           // Duty-Cycle wählen
PIR1bits.TMR2IF = 0;   // Interrupt-Flag clearen
T2CONbits.T2CKPS = 0b10;  Prescaler wählen
T2CONbits.TMR2ON = 1;  // Timer2 on
}

--> PIN2 funktioniert nicht, das selbe nur PIN5 (A2) funktioniert 
einwandfrei

Gruß

Thomas

von PIC N. (eigo) Benutzerseite


Lesenswert?

Hallo,
wenn RA2 als PWM Ausgang fungieren soll, dann musst du CCP1SEL Bit im 
APFCON Register löschen und nicht setzten.

Ersetzte:
1
APFCONbits.CCP1SEL = 1; //CCP1-Pin -> RA5
Durch:
1
APFCONbits.CCP1SEL = 0; //CCP1-Pin -> RA2

Und du hast bei deinem Code das falsche TRIS Bit angesprochen.

Ersetzte
1
TRISA5 = 0;            // PIN2 als Ausgang setzen
Durch:
1
TRISA2 = 0;            // PIN2 als Ausgang setzen

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.