|
|
View previous topic :: View next topic |
Author |
Message |
epicnote
Joined: 11 Oct 2009 Posts: 3
|
Incremental rotary encoder interface |
Posted: Sun Oct 11, 2009 11:49 pm |
|
|
Hello guys, I am a newbie here. By the way, I have finished programming the encoder, relays and keypad. I attached the encoder Channel A to RB0 and Channel B to RB1 of pic16f877a. Then I only used key number 1, 2 and 3 of keypad module where the 3 columns connected to RB2, RB3 and RB4 while the row1 connected to RB5. For the relay, a SPST relay connected to RD7 and a DPDT relay connected to RD6. So this is my C program using CCS C compiler for the system. Hope you guys can help me in guiding the program to complete.
Code: |
#include <16F877A.H>
#fuses HS, PUT, NOWDT, NOPROTECT, NOBROWNOUT
#use delay (clock=20000000) //MCU clock 20MHz
#use rs232 (UART1, baud=9600)
void main()
{
signed int encoder; //Encoder counter
int current_pos; //current_pos indicates the position
port_B_pullups(TRUE); //Port B pull up
set_tris_D(0x00); //Port D set as output
set_tris_B(0xC7); //Port B pin RB2 to RB4 as output and others as input
while(TRUE)
{
output_low(PIN_B2); //Clear RB2
if(!input(PIN_B5)) //If keypad 1 is pressed
{
output_high(PIN_B2);
delay_ms(25);
if(current_pos==0) //Check initial position
{
output_low(PIN_D7); //Motor stops
output_low(PIN_D6);
}
else if(current_pos==5) //Check initial position
{
output_high(PIN_D7); //Motor moves down(CCW)
output_low(PIN_D7);
if(!input(PIN_B0)&&!input(PIN_B1)) //Check if B0 and B1 is equal to 0
{
encoder--;
if(encoder==0)
{
output_low(PIN_D7); //Motor stops
output_low(PIN_D6);
current_pos=encoder; //Store last position
}
}
}
else if(current_pos==10) //Check initial position
{
output_high(PIN_D7); //Motor moves down(CCW)
output_low(PIN_D6);
if(!input(PIN_B0)&&!input(PIN_B1)) //Check if B0 and B1 equal to 0
{
encoder--;
if(encoder==0)
{
output_low(PIN_D7); //Motor stops
output_low(PIN_D6);
current_pos=encoder; //Store last position
}
}
}
}
output_low(PIN_B3); //Clear RB3
if(!input(PIN_B5)) //If keypad 2 is pressed
{
output_high(PIN_B3);
delay_ms(25);
if(current_pos==0) //Check initial position
{
output_high(PIN_D7); //Motor moves up(CW)
output_high(PIN_D6);
if(!input(pin_B0)&&!input(PIN_B1)) //Check if B0 and B1 equal to 0
{
encoder++;
if(encoder==5)
{
output_low(PIN_D7); //Motor stops
output_low(PIN_D6);
current_pos=encoder; //Store last position
}
}
}
if(current_pos==5) //Check initial position
{
output_low(PIN_D7); //Motor stops
output_low(PIN_D6);
}
if(current_pos==10) //Check initial position
{
output_high(PIN_D7); //Motor moves down(CCW)
output_low(PIN_D6);
if(!input(PIN_B0)&&!input(PIN_B1)) //Check if B0 and B1 equal to 0
{
encoder--;
if(encoder==5)
{
output_low(PIN_D7); //Motor stops
output_low(PIN_D6);
current_pos=encoder; //Store last position
}
}
}
}
output_low(PIN_B4); //Clear RB4
if(!input(PIN_B5)) //If keypad 3 is pressed
{
output_high(PIN_B4);
delay_ms(25);
if(current_pos==0) //Check initial position
{
output_high(PIN_D7); //Motor moves up(CW)
output_high(PIN_D6);
if(!input(PIN_B0)&&!input(PIN_B1)) //Check if B0 and B1 equal to 0
{
encoder++;
if(encoder==10)
{
output_low(PIN_D7); //Motor stops
output_low(PIN_D6);
current_pos=encoder; //Store last position
}
}
}
if(current_pos==5) //Chech last position
{
output_high(PIN_D7); //Motor moves up(CW)
output_high(PIN_D6);
if(!input(PIN_B0)&&!input(PIN_B1)) //Check if B0 and B1 equal to 0
{
encoder++;
if(encoder==10)
{
output_low(PIN_D7); //Motor stops
output_low(PIN_D6);
current_pos=encoder; //Store last position
}
}
}
if(current_pos==10) //Check initial position
{
output_low(PIN_D7); //Motor stops
output_low(PIN_D6);
}
}
}
}
|
Hence, my question is:
1) Is that relevant to create a program with so many IF statement?
2) Then is the code above can complete my task? |
|
|
Steve H Guest
|
|
Posted: Mon Oct 12, 2009 10:31 am |
|
|
You did not say if the code works or not - I will assume that it did. Your program is not so big that the multiple if statements are a real problem with readability.
You are building a state machine - you can search Google for "State machine C", here is a reasonable link I found. State machines are a simple way to code this kind of problem.
http://tactilicio.us/2008/02/12/some-code-snippets-for-a-simple-c-state-machine/
HTH - Steve H. |
|
|
epicnote
Joined: 11 Oct 2009 Posts: 3
|
|
Posted: Sat Oct 17, 2009 10:41 am |
|
|
Guys, I have created a new program that using external source for timer0, become counter of channel B of the encoder. The program runs when I push key 1 of the keypad. Then the motor will move clockwise for 2 revolutions and stop. Once I run the program, the motor stops when finished 2 revolution. Then when I want to start again with pushing the key 1, the relays contact without stopping. So why does it happen?? Anybody can help me?? Here is my coding:
Code: |
#include <16F877A.H>
#fuses HS, PUT, NOWDT, NOPROTECT, NOBROWNOUT
#use delay (clock=20000000) // MCU clock 20MHz
#use rs232 (UART1, baud=9600)
void setup_encoder(); //Read encoder
void scankeypad(); //Read keypad
unsigned int8 time;
void main()
{
set_tris_D(0x00); //port D set as output
set_tris_B(0xFF); //port B input
set_tris_A(0b11111111); //RA4 as input
while(TRUE)
{
setup_encoder();
scankeypad();
}
}
void setup_encoder()
{
setup_counters(RTCC_EXT_H_TO_L,RTCC_DIV_1);
set_rtcc(0);
}
void scankeypad()
{
while(TRUE)
{
output_low(pin_D5);
if(!input(pin_B2)) //If keypad1 is pressed
{
output_high(pin_D7); //Motor moves clockwise
output_high(pin_D6);
delay_ms(50);
time=get_rtcc();
}
if(time>=96)
{
output_low(pin_D7); //Motor stops
output_low(pin_D6);
set_rtcc(0);
}
}
}
|
|
|
|
ferrousduke
Joined: 31 Mar 2008 Posts: 29 Location: Mumbai, India
|
|
Posted: Sat Oct 17, 2009 11:51 pm |
|
|
Do you have any schematics illusrating connections that you've made ? Explain abt the task too. |
|
|
epicnote
Joined: 11 Oct 2009 Posts: 3
|
|
Posted: Sun Oct 18, 2009 1:55 am |
|
|
Sorry for unclear details. So this is my circuit from isis. Thanks for the respond
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|