Een X-Y tafel wil ik voorzien van 2 encoders om de X-Y posities te kunnen aflezen.
Hiervoor heb ik onderstaand programma geschreven...
Voor de X encoder gebruik ik de kanalen XA en XB(+90°)
Voor de Y encoder gebruik ik de kanalen YA en YB(+90°)
De encoders werken op 5V en hebben 100 PPR.
Per omwenteling verschuift de X- of Y-as 1mm, dus denk ik met deze encoders tot op 0,01 mm te kunnen uitlezen.
Op PD6(OUT) wordt een LED aangesloten die meepinkt met X of Y bij het verdraaien van de kruistafel.

Ik vraag mij nu af als dit wel een goede(nauwkeurige) methode is om de encoders te lezen.
( van - 32700 tot + 32700 ).



                         ATTINY2313
                          +------+ |-100n->(GND)         +--------+
              (RESET-ISP)-|1   20|-|-(VCC)+5V    (GND)-1-|Vss     | 
      ENC.PULS XA-GN(PD0)-|2   19|-(SCK-ISP)     (+5V)-2-|Vcc     |
      ENC.PULS YA-GN(PD1)-|3   18|-(MISO-ISP)    (GND)-5-|RW      |
                         -|    17|-(MOSI-ISP/PB5)------4-|RS    L |
                         -|    16|-(PB4)---------------6-|EN    C |
 ENC.PULS XB-WH(INT0/PD2)-|6   15|-(PB3)--------------14-|DB7   D |
 ENC.PULS YB-WH(INT1/PD3)-|7   14|-(PB2)--------------13-|DB6     |
    (GND)<-PUSHB.X0-(PD4)-|8   13|-(PB1)--------------12-|DB5   D     
    (GND)<-PUSHB.Y0-(PD5)-|9   12|-(PB0)--------------11-|DB4   I |  
                    (GND)-|10  11|-(PD6)-OUT             |      S |
                          +------+                       |      P |
                          (0V...5V->sweeper 10k potm.)-3-|Vee   L |
                                                         |      A |  	         
                                                         |      Y |  
                                   (+5V -> Backlight)-15-|A       |
                                   (GND -> Backlight)-16-|K       |       
                                                         +--------+


#ifndef F_CPU
#define F_CPU 1000000UL
#endif


#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd-routines.h" // alsook de LCD poortinstellingen


#define XA  PD0 // GN pulse A encoder X op INT0
#define YA  PD1 // GN pulse A encoder Y op INT1

#define XB  PD2 // WH pulse B (+90°) encoder X
#define YB  PD3 // WH pulse B (+90°) encoder Y

#define X0  PD4 // Pushbutton to set X to zero
#define Y0  PD5 // Pushbutton to set Y to zero

#define OUT PD6 // LED X/Y

volatile int16_t  X=0;
volatile int16_t  Y=0;


ISR(INT0_vect)
{
  
  if(bit_is_set(PIND,XA))
  X++;
  else
  X--;
  
}

ISR(INT1_vect)
{
  if(bit_is_set(PIND,YA))
  Y++;
  else
  Y--;
}

   
void init()// #define LCD poorten in lcd-routines.h
{
    
    
	DDRD  &=~ (1 << XA)|(1 << XB)|(1 << YA)|(1 << YB)|(1 << X0)|(1 << Y0) ;
	PORTD |=  (1 << XA)|(1 << XB)|(1 << YA)|(1 << YB)|(1 << X0)|(1 << Y0) ;
	DDRD |= (1 << OUT);  
	GIMSK|= (1 << INT0)|(1 << INT1);
	MCUCR|= (1 << ISC01)|(1 << ISC11); INT0 en INT1 neergaande puls
 
  	lcd_init();
   
   _delay_ms(20);

    sei();

 } 

int main(void)
{
    
    init();

    while(1)
    {
     ... Hoofdprogramma om X en Y te tonen op de LCD,
         alsook om X en/of Y te resetten...
    }

    return 0;
}