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.
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
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
Das ANSEL Register hat keine Wirkung, wenn das entsprechende TRIS Bit auf 0 (Ausgang) gesetzt ist.
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
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.....
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
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 }
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.