| General > General Technical Chat |
| Schmitt Buffer/Trigger with Encoder and buttons - Inverting... |
| << < (7/8) > >> |
| elcrni:
Alright, changed the prescaler to 256 and now reading ~496Hz on the scope port. I am very happy with this now! --- Code: ---#define encoderA 2 #define encoderB 3 volatile int encoderCount = 0; boolean A_set = false; boolean B_set = false; const int scope_pin =PB0; ISR(TIMER1_COMPA_vect) { if ( digitalRead(encoderA) != A_set ) { // debounce once more A_set = !A_set; if ( A_set && !B_set ) encoderCount ++; } if ( digitalRead(encoderB) != B_set ) { B_set = !B_set; if ( B_set && !A_set ) encoderCount --; } PORTB ^= (1<< scope_pin); } void setup() { pinMode(encoderA, INPUT); pinMode(encoderB, INPUT); DDRB |= (1 << scope_pin); TIMSK1 |= (1<<OCIE1A); TCCR1A = 0; TCCR1B = (1<<WGM12) | (1<<CS12); OCR1A = 125; sei(); } void loop() { } --- End code --- Many thanks for all your help MarkF! Alek |
| elcrni:
very strange thing happens, i have just measured frequency on the scope pin again, whatever i do i get 248Hz, half of the 500Hz target... once i remove the ground connection and measure with positive scope probe i get 496Hz... either i am doing something very wrong or my math in the code is no good... Thanks, Alek |
| MarkF:
--- Quote from: elcrni on March 19, 2021, 04:24:24 pm ---very strange thing happens, i have just measured frequency on the scope pin again, whatever i do i get 248Hz, half of the 500Hz target... once i remove the ground connection and measure with positive scope probe i get 496Hz... either i am doing something very wrong or my math in the code is no good... Thanks, Alek --- End quote --- Think about what your code is doing... Hint: Every time you enter the ISR() routine you toggle the scope_pin. If you set the scope_pin when you enter the ISR() and then clear the scope_pin when you exit the ISR(), you will be able to measure the time spent inside the ISR(). Question: Why are you doing Port writes for the scope_pin and bit reads for the encoder lines? 1) Doing the Port write for the scope_pin effects ALL bits in that port. 2) I would expect the opposite. Bit write for scope_pin and port read for encoder bits. Ideally, doing a port read for the encoder will avoid time skew of encoder_A and encoder_B lines. All be it, the time delay should be very small. You never really know how much overhead is inside the digitalRead() function. |
| elcrni:
if i do it like you suggested: --- Code: ---uint8_t pins, pinA, pinB, pinS; digitalWrite(0, HIGH); // set pin 0 high when entering ISR(), check this pin with scope ----------------- digitalWrite(0, LOW); // set pin 0 low when leaving ISR() --- End code --- I get no readout at all on pin0 (digital pin 53 on mega2560) As for the port/pin part of it, i am still trying to get a hang of it, still a bit confusing so i am basically shooting in the dark here :-) Many thanks, Alek |
| elcrni:
ok, just changed your pin0 to pin53 and i have a reading of ~500Hz now. this should be it. json object validator Off to the next thing, pin/port confusion and trying to figure out your encoder code. Thanks, Alek |
| Navigation |
| Message Index |
| Next page |
| Previous page |