Forum: Mikrocontroller und Digitale Elektronik 2 Counter am Pic18f448


von Hubert M. (thimm)


Lesenswert?

hoi zusammen,

kann mir jemand bestätigen / widersprechen, dass beim pic18fxxx nur ein 
timer als counter betrieben werden kann?
ich möchte mit meiner schaltung unter anderem 2 motorencodersignale 
auswerten und dazu flanken mitzählen. sowohl timer0 als auch timer1 
haben jeweils einen eigenen externen clock-eingang (T0CKI, T1CKI), aber 
sobald ich z.b. den timer1 auf extere clock-source stelle zählt der 
timer0 nicht mehr mit...

in datenblättern  google  foren bin ich dazu noch nicht fündig 
geworden, bitte, bitte, sagt mir dass das nicht wahr ist...

danke, hubert

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Hallo,

es soll problemlos funktionieren!

Poste mal die Einstellungen !

von Hubert M. (thimm)


Lesenswert?

also hier mal die relevanten source stellen, sobald ich T1_SOURCE_INT 
auf T1_SOURCE_EXT ändere reagiert der Timer0 nicht mehr auf eine 
Taktflanke am A4 pin (was er bis dahin aber tadellos macht).

weiters werden noch eine pwm, eine epwm und der adc betrieben.



#include <p18cxxx.h>

#include <stdio.h>
#include <pwm.h>
#include <timers.h>
#include <adc.h>
#include <delays.h>

(...)

void main(void)
{

CMCON=0x07;

OpenTimer0 (TIMER_INT_OFF & T0_8BIT & T0_SOURCE_EXT & T0_EDGE_FALL & 
T0_PS_1_1 );
TRISA=0xff;
TMR0H=0;
TMR0L=0;

TRISCbits.TRISC0=1;
OpenTimer1( TIMER_INT_OFF & T1_8BIT_RW & T1_SOURCE_EXT & T1_PS_1_1 & 
T1_OSC1EN_OFF & T1_SYNC_EXT_OFF );
TMR1H=0;
TMR1L=0;

(...)

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Ich kenne mich mit C nicht aus.
Sieh mal in den erzeugten Assemblercode, wie die Register T0CON und 
T1CON angesprochen werden.

von Dieter W. (dds5)


Lesenswert?

> #include <p18cxxx.h>

Ist das die richtige include für PIC18F ?

von Hubert M. (thimm)


Lesenswert?

ja, die include sollte passen. das ist eine generische für eine ganze 
serie von pics. ich hab allerdings auch schon die 18f448.h included, 
ändert nix.

mit assemblercode kann ich leider nicht wirklich dienen, das was mir der 
compiler an disassembly ausspuckt hat keine pic-üblichen namen für die 
register sondern nur nummern, ich hab selber zwar nur ca ein jahr pics 
in assembler programmiert, aber da was rauszulesen... äußerst mühsam.

mittlerweile geht auch mein ganz gewöhnlicher timer0 im counter modus 
nicht mehr. ich versteh's echt nicht.... ich wüsste auch nicht was ich 
geändert hab. wenn ich doch bloß eine gute möglichkeit finden würde zu 
testen ob nicht etwa die schaltung was hat...

-hubert

von Hubert M. (thimm)


Lesenswert?

*mittlerweile am verzweifeln:
sieht hier irgendjemand einen guten grund warum das nicht funktionieren 
sollte? es soll lediglich überprüfen ob der Timer0 die flanken des 
taktsignales (~10kHz) tatsächlich zählt. er tut's nämlich nicht..
-hubert





#include <p18cxxx.h>

#include <stdio.h>
#include <timers.h>

#define Stest LATDbits.LATD0

void main(void)
{
TRISD = 0x00;

//switch off comparator modules (important for usage of PortD)
CMCON=0x07;

OpenTimer0 (TIMER_INT_OFF & T0_8BIT & T0_SOURCE_EXT & T0_EDGE_FALL & 
T0_PS_1_1 );
TRISA=0xff;
TMR0H=0;
TMR0L=0;

ADCON1bits.PCFG3=1;
ADCON1bits.PCFG2=1;
ADCON1bits.PCFG1=1;
ADCON1bits.PCFG0=1;

while(1){

  if(TMR0L!=0) {
    Stest=~Stest;
    TMR0L=0;
  }

}

} //end main

von holger (Gast)


Lesenswert?

Schau dir das noch mal genau an ;)

  if(TMR0L!=0)
  {
    Stest=~Stest;
    TMR0L=0;
  }

von holger (Gast)


Lesenswert?

>    Stest=~Stest;

    Stest= !Stest;

Besser ?

von Hubert M. (thimm)


Lesenswert?

nö, das interpretiert der c18 compiler schon richtig. das tragische 
daran ist, dass wenn ich den timer1 dafür konfiguriere

(
TRISCbits.TRISC0=1;
OpenTimer1( TIMER_INT_OFF & T1_8BIT_RW & T1_SOURCE_EXT & T1_PS_1_1 & 
T1_OSC1EN_OFF & T1_SYNC_EXT_OFF );
TMR1H=0;
TMR1L=0;
)

 und mit der selben abfrage -

(
if (TMR1L!=0) {
  Stest=~Stest;
  TMR1L=0;
  }
)

verwende funktionierts. ich steh echt langsam an...
-hubert

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Inwieweit kann der C-Compiler den 1:1-Prescaler umsetzen, wenn es diese 
Einstellung für den Timer0 eigentlich nicht gibt, man müßte den 
Prescaler ganz abschalten.

von Hubert M. (thimm)


Lesenswert?

nein, leider auch der prescaler ist so in ordnung.

das ist eine library function, die bei T0_PS_1_1 den prescaler 
ausschaltet.

noch immer keine besserung in sicht...

von Hubert M. (thimm)


Lesenswert?

nur der Vollständigkeit halber möchte ich erwähnen, dass die beiden 
counter doch gemeinsam funktionieren. man sollte jedoch die pins von der 
richtigen seite her zu zählen beginnen. dann verbindet man seinen draht 
auch mit dem richtigen pin...
wie so oft im leben ist alles nur eine frage des betrachtungswinkels.

danke allen postern!

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.