2 Counter am Pic18f448

OP #710349
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
OP #711192
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;

(...)
OP #712387
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
OP #712438
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
OP #712695
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
OP #717939
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren