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.