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
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; (...)
Ich kenne mich mit C nicht aus. Sieh mal in den erzeugten Assemblercode, wie die Register T0CON und T1CON angesprochen werden.
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
*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
Schau dir das noch mal genau an ;) if(TMR0L!=0) { Stest=~Stest; TMR0L=0; }
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
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.