Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: PLM-Port als Digitalausgang Kategorie: Programmierung (von Michael Rossner - 24.12.2006 13:47)
Als Antwort auf Re: PLM-Port als Digitalausgang von André H. - 13.08.2006 10:51
Ich nutze:
C-Control II Unit, CC2-Application-Board, CC2-ReglerBoard, OSOPT V3.0
Hallo Andrè,

ist ja interessant, was man so alles an den Ports setzten kann, wenn man weiÃ? wie.

Wie bekomme ich denn z.B. den Port 8.0 wieder auf PWM gesetzt?
Wenn ich jetzt den Port 8.1 setzen will was benutze ich dann als Konstante?

Kannst Du diese netten funktionen mal in deine SFR Datei mit einbauen?

Danke Michael

> Hallo HGS,
>
> > laut Handbuch dachte ich, da� es möglich sein sollte, die PLM-Ports als normale Digitalausgänge
> > zu verwenden. Auf den Fehler mit dem HIGH bei Ausgabe>Periodenlänge bin ich schon hier im Forum
> > gestoÃ?en, so geht's also nicht.
>
> Ã?ber PLM kan man leider nicht direkt 100% einstellen.
> Wenn Du aber die maximale Periodenlänge und die kleinste Zeitbasis einstellst,
> kannst Du so die PLM-Ports weitgehens als normale dig. Ausgänge benutzen.
> D.h. folgendes:
> plm.settimebase(PLMChannel, plm.BASE_400);
> plm.setperiod(PLMChannel, -1);//=65535

>
> Um z.B. Relais anzusteuern, ist diese Lösung kein Problem.
>
> > Dann habe ich den Hinweis mit sfr.set_P8 gefunden. Das kriege ich
> > aber auch nicht hin. Mein Quelltext sieht so aus:
> >
> >
> >   PLMChannel=0;
> >   plm.settimebase(PLMChannel, plm.BASE_400);
> >   plm.setmode(PLMChannel, 0);
> >   plm.setperiod(PLMChannel, 100);
> >   loop
> >   {
> >     sfr.set_P8(sfr.get_P8() or 0b00000001);    // PLM0 auf konstant high setzen
> >     WaitForKey(VK_Enter);
> >     sfr.set_P8(sfr.get_P8() and 0b11111110);    // PLM0 auf konstant low setzen
> >     WaitForKey(VK_Enter);
> >   }
> >

> >
> > Hier sehe ich aber auf dem Oszi nur einen kurzen Puls, dann ist das Signal wieder dauerhaft auf LOW.
> > Interessanterweise ist die Länge des zu sehenden Pulses nicht immer gleich.
> > Mache ich da noch was falsch mit setmode oder setperiod, oder geht es gar nicht so?
>
> Das geht so natürlich nicht.
> Du setzt zwar den Port per Hand auf High, aber Dir funkt die PLM-Zuweisung
> von CAPCOM2 dazwischen.
> Du mu�t daher die erst die Zuweisung für den betreffenden Port aufheben.
> Danach kannst Du diesen als I/O-Port benutzen.
> Dazu muÃ? man wissen, daÃ? P8.0 die Bezeichnung CC16IO hat. (Entsprechend der Sonderfunktion)
> Ã?ber das Capture-Compar-Mode-Register CCM4 (0xFF22) kann die (Sonder-)Funktion
> der Ports P8.0-.3 bestimmt werden. (Siehe Manual zum C164CI)
>
> Mit folgender Funktion kannst Du aus P8.0 einen normalen I/O-Port machen:
>
> inline function P8_0_IO()
> {
>  inline vmcodes.VM_LOAD_IMMEDIATE_INT;
>  inline 0xFFF0;
>  inline vmcodes.VM_LOAD_ABSOLUTE_INT;
>  inline 0xFF22;
>  inline vmcodes.VM_AND;
>  inline vmcodes.VM_STORE_ABSOLUTE_INT;
>  inline 0xFF22;
> }
>

> P8.0 kann jetzt als normaler I/O-Port benutzt werden.
> Allerdings sollten die Portansteuerungsroutinen so kurz, wie möglich sein:
>
> inline function setP8_0() // Port setzen
> {
>  inline vmcodes.VM_LOAD_IMMEDIATE_BYTE+0x0100;
>  inline vmcodes.VM_LOAD_ABSOLUTE_BYTE;
>  inline 0xFFD4;
>  inline vmcodes.VM_OR;
>  inline vmcodes.VM_STORE_ABSOLUTE_BYTE;
>  inline 0xFFD4;
> }
>
> inline function clearP8_0()
> {
>  inline vmcodes.VM_LOAD_IMMEDIATE_BYTE+0xFE00;
>  inline vmcodes.VM_LOAD_ABSOLUTE_BYTE;
>  inline 0xFFD4;
>  inline vmcodes.VM_AND;
>  inline vmcodes.VM_STORE_ABSOLUTE_BYTE;
>  inline 0xFFD4;
> }
>
> inline function deactP8_0() //P8.0 als Eingang
> {
>  inline vmcodes.VM_LOAD_IMMEDIATE_BYTE+0xFE00;
>  inline vmcodes.VM_LOAD_ABSOLUTE_BYTE;
>  inline 0xFFD6;
>  inline vmcodes.VM_AND;
>  inline vmcodes.VM_STORE_ABSOLUTE_BYTE;
>  inline 0xFFD6;
> }
>
> inline function actP8_0() //P8.0 als Ausgang
> {
>  inline vmcodes.VM_LOAD_IMMEDIATE_BYTE+0x0100;
>  inline vmcodes.VM_LOAD_ABSOLUTE_BYTE;
>  inline 0xFFD6;
>  inline vmcodes.VM_OR;
>  inline vmcodes.VM_STORE_ABSOLUTE_BYTE;
>  inline 0xFFD6;
> }
>
> inline function OD_P8_0() //P8.0 als Open-Drain
> {
>  inline vmcodes.VM_LOAD_IMMEDIATE_BYTE+0x0100;
>  inline vmcodes.VM_LOAD_ABSOLUTE_BYTE;
>  inline 0xF1D6;
>  inline vmcodes.VM_OR;
>  inline vmcodes.VM_STORE_ABSOLUTE_BYTE;
>  inline 0xF1D6;
> }
>
> inline function PP_P8_0() //P8.0 als Push-Pull
> {
>  inline vmcodes.VM_LOAD_IMMEDIATE_BYTE+0xFE00;
>  inline vmcodes.VM_LOAD_ABSOLUTE_BYTE;
>  inline 0xF1D6;
>  inline vmcodes.VM_AND;
>  inline vmcodes.VM_STORE_ABSOLUTE_BYTE;
>  inline 0xF1D6;
> }
>

>
> Das sind jetzt die wichtigsten Funktionen.
> Entsprechend kann man auch die anderen Ports von P8 umkonfigurieren.
> Beim Ansprechen über mehrere Threads müssen die Funktionen gecaptured werden !
>
> MfG André H.
>


    Antwort schreiben


Antworten: