ja klar ist verständlich, aber so wie ich das oben geschrieben habe, müsste es doch gehen oder ?
Druckbare Version
ja klar ist verständlich, aber so wie ich das oben geschrieben habe, müsste es doch gehen oder ?
Ich glaub schon, du kannst folgendes machen um es zu testen:
MPLAB IDE und der Simulator haben ein Oszilloskop in Software, das auch die PWM Outputs richtig darstellen kann. Du stellst als Debugger MPLAB SIM ein, dann gehst du auf View und Simulator Logic Analyser. Unter Channels wählst du dann CCP1 und CCP2 aus. Dann kannst du das Programm laufen lassen und dir ansehen.
ja habe es gefunden, aberleider ist dort immer dasselbe signal--..
Werde noch etwas herum experimentieren..
sage bescheid, wenn sich was tut ^^
also ich kenne das vom Timer 0 so, dass der bei der initialisierung noch im Oprionreg eingestellt werden muss.
Muss man dies bei der PWM für den timer auch machen
Ich hab nochmal deinen Code angeschaut, diesmal genauer:
Das kann nicht gehen, du hast eine Endlosschleife von Ausgabe bis goto Ausgabe, dh das CCP Modul wird jedes mal neu gestartet. Das ist nicht weiter schlimm, aber auch nicht hübsch.
Was schlimm ist, ist, dass du ihm überhaupt keine Zeit lässt, das PWM-Signal auch zu senden, du aktivierst es und schaltest es 3 Befehle später wieder ab, da kann ja nichts zu erkennen sein!
Bau eine Pausenschleife ein, oder teste erstmal nur mit einem eingeschalteten Signal. Dann sollte auch der Logic Analyser was anzeigen.
EDIT:
GANZGANZ WICHTIG! Das kann nicht klappen, wenn Timer2 nicht läuft. Du benutzt den Befehl MOVLW D'1' MOVWF T2CON,
Dabei setzt du nur Bit0, für den Prescaler, aber Bit2 bleibt auf null, damit läuft der Timer nicht! Also wird er auch nie Zählen und den PWM Wert erreichen, woraufhin das ganze den Pegel wechselt. Schreibe entweder eine D'5' in T2CON oder mache anschließend den Befehl BSF T2CON,2. Mit letztem bist du immer auf der sicheren Seite, da dieser Befehl nur das entsprechende Bit setzt, egal was in dem Register steht.
danke danke
habe jetzt einen funktionstüchtigen code.
Dieser funktioniert auch per Simulation =)
falls du ihn brauchst oder fragen dazu hast=)
beantworte ich sie dir gerne
Code:
initialisierung
; Vorteiler
BsF T2CON,T2CKPS1 ; Vorteiler 16:1
bcf T2CON,T2CKPS0
BSF T2CON,TMR2ON ; Timer2 ein
; Frequenz
BSF STATUS,RP0 ; Bank1
MOVLW D'123'
MOVWF PR2 ; 2,5 kHz
BCF STATUS,RP0 ; Bank1
; Tastverhältnis auf 50% einstellen
MOVLW D'62'
MOVWF CCPR1L ; 50% von 124
; RC2/CCP1 auf Ausgang stellen
BSF STATUS,RP0 ; Bank1
BCF TRISC, 2 ; RC2: output=0
BCF STATUS,RP0 ; Bank 0
; PWM MODE mit CCP1 initialisieren
CLRF CCP1CON ; CCP1-Modus aus
BSF CCP1CON,CCP1M3 ; CCP1-Modus PWM-Mode
BSF CCP1CON,CCP1M2
loop
GOTO loop
end
Super! Schön, dass es läuft.
Das hast du auch gut und deutlich kommentiert.
Nochmal zu BANKSEL:
Das ist ein Macro, was selbstständig erkennt, welches Register in welcher Bank du ansprechen willst. D.h. du brauchst dich nicht mit BSF STATUS,RP0 zu bemühen, da Banksel automatisch die Bits richtig setzt. Das ist ganz nett, wenn man mit vielen SFRs hantiert, hat aber immer 2 Befehle, statt möglicherweise 1.
ja danke schon mal für deine hilfe =)
bei meiner programmierung kommt es nicht so sehr auf die zeit an. Deswegen habe ich es lieber so gemacht.
Funktioniert auch so=)
Nene, eigentlich ist deine Lösung sogar schneller, als die mit Banksel, funktionieren tut beides, ausserdem weiß man bei deiner Lösung immer wo man ist, sodass man vielleicht mehrere Tätigkeiten in einer Bank durchführen kann. Dennoch halte ich das Banksel Macro für sinnvoll und praktisch, deswegen hab ichs ja auch benutzt. Wollte das nurnoch mal erläutern.
Was wird das denn genau, wofür du das PWM brauchst? Ich hab mit meinem Beispiel Code ne Samsung-Fernbedienung imitiert.