Rotationsenkoder
Postat: 16 oktober 2009, 17:14:14
Hej sitter nu här i ett litet projekt och försöker få en Rotationsenkoder men det går inte riktigt som det är tänkt. problem 1 att den oftast inte reagerar ens när jag vrider på den men vrider jag riktigt långsamt så ibland så räknar den. Men det kan också hända att den räknar åt fel håll. Så nu behöver jag lite hjälp med hur det ska se ut Här är min nuvarande kod.
denna delen som inte funkar: har alltså koppas in den på pin 0 och 1 på PORTD
hela koden om det nu hjälpter
EDIT: Kommentera nu koden som jag tror är fel
denna delen som inte funkar: har alltså koppas in den på pin 0 och 1 på PORTD
Kod: Markera allt
if(PIND & 0x01){ //kollar om pin 1 är 1 isåfall
while(temp == 0 || PIND & 0x02){ // vänta här medans temp == 0 eller pin 2 är 1
if(PIND & 0x02){ // kolalr om pin 2 är 1 i så fall sätt temp till 1
temp =1;
}
}
temp=0; //sätter temp till 0 då den har kommit ut loopen och
spwm++; // ökar spwm med 1
test++; //ökar test med 1
}
if(PIND & 0x02){
while(temp==0 || PIND & 0x01){
if(PIND & 0x01){
temp =1;
}
}
temp=0;
spwm--;
test--;
}
hela koden om det nu hjälpter
Kod: Markera allt
#define F_CPU 8000000
#include <util/delay.h>
#include <avr/interrupt.h>
#define bit_on(BYTE, BIT) BYTE |= 1 << BIT;
#define bit_off(BYTE, BIT) BYTE &= ~(1 << BIT);
volatile int rpwm, gpwm, bpwm,spwm, antal,test=100;
volatile int time=0;
volatile char led_out=0;
int temp =0;
int main (void)
{
sei();
rpwm=5;
gpwm=5;
bpwm=255;
spwm=170;
antal=255;
DDRC=0xFF;
PORTC=0x00;
DDRB=0xFF;
PORTB=0x00;
DDRD = 0x00;
PORTD = 0x00;
//Timer0 8Bit setup, ansvarig för PWM
bit_on(TCCR0, CS00);
bit_off(TCCR0, CS01);
bit_off(TCCR0, CS02);
TCNT0 = 0x00;
bit_on(TIMSK, TOIE0);
while(1)
{
if(PIND & 0x01){
while(temp == 0 || PIND & 0x02){
if(PIND & 0x02){
temp =1;
}
}
temp=0;
spwm++;
test++;
}
if(PIND & 0x02){
while(temp==0 || PIND & 0x01){
if(PIND & 0x01){
temp =1;
}
}
temp=0;
spwm--;
test--;
}
PORTB=test;
_delay_ms(20);
while(rpwm<250){
rpwm++;
bpwm--;
_delay_ms(5);
}
while(gpwm<250){
gpwm++;
rpwm--;
_delay_ms(5);
}
while(bpwm<250){
bpwm++;
gpwm--;
_delay_ms(5);
}
}
}
SIGNAL(TIMER0_OVF_vect)
{
TCNT0=256;
time++;
if(time>=antal) time=0;
if(time>=rpwm)
{
bit_off(led_out,0);
}
else
{
bit_on(led_out,0);
}
if(time>=gpwm)
{
bit_off(led_out,2);
}
else
{
bit_on(led_out,2);
}
if(time>=bpwm)
{
bit_off(led_out,1);
}
else
{
bit_on(led_out,1);
}
if(time>=spwm)
{
bit_off(led_out,3);
}
else
{
bit_on(led_out,3);
}
PORTC = led_out;
}
EDIT: Kommentera nu koden som jag tror är fel