NIKO BELLIC
Newbie level 6
- Joined
- Aug 1, 2011
- Messages
- 14
- Helped
- 6
- Reputation
- 12
- Reaction score
- 5
- Trophy points
- 1,283
- Location
- Kansas City, MO
- Activity points
- 1,389
// This program is used to control the stepper motor in desired direction and torque as given by inputs
#include <avr/io.h>
#include <util/delay.h>
#define keypad PORTA
#define stepper PORTD
void main()
{
DDRA=0x0F; // configuring keypad pins
DDRD=0xFF; // configuring ULN2003A pins as output
keypad=0xF0;
scan_keypad();
}
scan_keypad()
{
unsigned char value;
while(1)
{
keypad=0xF0;
value=PINA;
if(value!=0xF0)
{
check_row_1();
check_row_2();
check_row_3();
check_row_4();
}
}
}
check_row_1()
{
keypad=0b11111110;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
full_step_high_torque_left();
if(bit_is_clear(PINA,PA5))
full_step_high_torque_right();
}
check_row_2()
{
keypad=0b11111101;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
full_step_low_torque_left();
if(bit_is_clear(PINA,PA5))
full_step_low_torque_right();
}
check_row_3()
{
keypad=0b11111011;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
half_step_left();
if(bit_is_clear(PINA,PA5))
half_step_right();
}
check_row_4()
{
keypad=0b11110111;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
stop();
if(bit_is_clear(PINA,PA5))
;
}
full_step_high_torque_left()
{
while(1)
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
}
}
full_step_high_torque_right()
{
while(1)
{
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
}
}
full_step_low_torque_left()
{
while(1)
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
}
}
full_step_low_torque_right()
{
while(1)
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
}
}
half_step_left()
{
while(1)
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
}
}
half_step_right()
{
while(1)
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
}
}
stop()
{
while(1)
stepper=0x00;
}
You can probably use while (PINA==0xF0) so that it exits when a key is pressed
scan_keypad()
{
unsigned char value;
while(1)
{
keypad=0xF0;
value=PINA;
if(value!=0xF0)
{ [COLOR="#0000FF"]lastvalue=value;[/COLOR]
check_row_1();
check_row_2();
check_row_3();
check_row_4();
}
}
}
...the best way in my opinion is to use a timer and poll the keyboard every 50ms or 100ms and then use that value in a case statement to execute different steps sequence depending on the key value.
#include <avr/io.h>
#include <util/delay.h>
#define keypad PORTA
#define stepper PORTD
char lastvalue;
void main()
{
DDRA=0x0F; // configuring keypad pins
DDRD=0xFF; // configuring ULN2003A pins as output
keypad=0xF0;
scan_keypad();
}
scan_keypad()
{
unsigned char value;
while(1)
{
keypad=0xF0;
value=PINA;
if(value!=0xF0)
{
lastvalue=value;
check_row_1();
check_row_2();
check_row_3();
check_row_4();
}
}
}
check_row_1()
{
keypad=0b11111110;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
full_step_high_torque_left();
else if(bit_is_clear(PINA,PA5))
full_step_high_torque_right();
}
check_row_2()
{
keypad=0b11111101;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
full_step_low_torque_left();
else if(bit_is_clear(PINA,PA5))
full_step_low_torque_right();
}
check_row_3()
{
keypad=0b11111011;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
half_step_left();
else if(bit_is_clear(PINA,PA5))
half_step_right();
}
check_row_4()
{
keypad=0b11110111;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
stop();
else if(bit_is_clear(PINA,PA5))
;
}
full_step_high_torque_left()
{
while((PINA==0xF0)|(PINA==lastvalue))
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
}
}
full_step_high_torque_right()
{
while((PINA==0xF0)|(PINA==lastvalue))
{
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
}
}
full_step_low_torque_left()
{
while((PINA==0xF0)|(PINA==lastvalue))
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
}
}
full_step_low_torque_right()
{
while((PINA==0xF0)|(PINA==lastvalue))
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
}
}
half_step_left()
{
while((PINA==0xF0)|(PINA==lastvalue))
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
}
}
half_step_right()
{
while((PINA==0xF0)|(PINA==lastvalue))
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
}
}
stop()
{
while((PINA==0xF0)|(PINA==lastvalue))
stepper=0x00;
}
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define keypad PORTA
#define stepper PORTD
// global variables
uint8_t overflow_counter;
uint8_t pressed_key=0;
// 0=stop();
// 1=full_step_high_torque_left()
// 2=full_step_high_torque_right();
// 3=full_step_low_torque_left();
// 4=full_step_low_torque_right();
// 5=half_step_left();
// 6=half_step_right();
// 7=full_step_low_torque_left();
// 8=full_step_low_torque_right();
scan_keypad()
{
unsigned char value;
keypad=0xF0;
value=PINA;
if(value!=0xF0)
{
check_row_1();
check_row_2();
check_row_3();
check_row_4();
}
}
check_row_1()
{
keypad=0b11111110;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
pressed_key=1;
else if(bit_is_clear(PINA,PA5))
pressed_key=2;
}
check_row_2()
{
keypad=0b11111101;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
pressed_key=3;
else if(bit_is_clear(PINA,PA5))
pressed_key=4;
}
check_row_3()
{
keypad=0b11111011;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
pressed_key=5;
else if(bit_is_clear(PINA,PA5))
pressed_key=6;
}
check_row_4()
{
keypad=0b11110111;
_delay_ms(4);
if(bit_is_clear(PINA,PA4))
pressed_key=0;
else if(bit_is_clear(PINA,PA5))
;
}
full_step_high_torque_left()
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
}
full_step_high_torque_right()
{
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
}
full_step_low_torque_left()
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
}
full_step_low_torque_right()
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
}
half_step_left()
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
}
half_step_right()
{
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(0<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(1<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(0<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(1<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(0<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
stepper=(1<<PD0)|(0<<PD1)|(0<<PD2)|(1<<PD3);
_delay_ms(50);
}
stop()
{
stepper=0x00;
}
// Timer 0 overflow interrupt service routine
ISR (TIMER0_OVF_vect)
{
if (overflow_counter==2)
{ overflow_counter=0; // reset variable
scan_keypad(); //scan the keys
}
else overflow_counter++;
}
void main(void)
{
DDRA=0x0F; // configuring keypad pins
DDRD=0xFF; // configuring ULN2003A pins as output
keypad=0xF0;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x00;
OCR0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Global enable interrupts
sei();
while (1)
{
// Place your code here
switch (pressed_key) {
case 0:
stop();
break;
case 1:
full_step_high_torque_left();
break;
case 2:
full_step_high_torque_right();
break;
case 3:
full_step_low_torque_left();
break;
case 4:
full_step_low_torque_right();
break;
case 5:
half_step_left();
break;
case 6:
half_step_right();
break;
case 7:
full_step_low_torque_left();
break;
case 8:
full_step_low_torque_right();
}
};
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?