Erelce
**** De beschikbare ruimte van een werkplek is omgekeerd evenredig met de grootte van deze werkplek **** AVR-Oefeningen op Electronics 4 Fun
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;
}