سلام به همگی
من در پروژه کنترل دور موتور DC بات میکروی AVR دچار مشکل شدم و فکر میکنم مشکلم از بابت وجود bounce در push button هایی است که استفاده کردم تصویر پروتئوس پروژه کنترل دور موتور DC اینه:
http://s22.aks98.com/files/13864853689662246064.jpg
برنامه پروژه هم اینه... میخواستم محبت فرموده برنامه رو طوری تغییر بدید که bounce برای کلید های سوم و چهارم و پنجم که جهت های left و right و brake رو تعیین میکنند حذف بشه.
ممنونم
من در پروژه کنترل دور موتور DC بات میکروی AVR دچار مشکل شدم و فکر میکنم مشکلم از بابت وجود bounce در push button هایی است که استفاده کردم تصویر پروتئوس پروژه کنترل دور موتور DC اینه:
http://s22.aks98.com/files/13864853689662246064.jpg
برنامه پروژه هم اینه... میخواستم محبت فرموده برنامه رو طوری تغییر بدید که bounce برای کلید های سوم و چهارم و پنجم که جهت های left و right و brake رو تعیین میکنند حذف بشه.
ممنونم
کد:
Chip type : ATmega16
Program type : Application
Clock frequency : 1.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#include<delay.h>
void display_no(int no);
void direction(char dir);
void main(void)
{
// Input/Output Ports initialization
// Port A initialization
PORTA=0x00;
DDRA=0x00;
// Port B initialization
PORTB=0x00;
DDRB=0x08;
// Port C initialization
PORTC=0x00;
DDRC=0x00;
// Port D initialization
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
TCCR0=0x6A;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
PORTC=255;
direction(3);
while (1)
{
if (PINC.2==0 || PINC.3==0 || PINC.4==0 )
{
delay_ms(10);
if (PINC.2==0)
direction(1);
if (PINC.3==0)
direction(2);
if (PINC.4==0)
direction(3);
}
lcd_gotoxy(0,1);
lcd_putsf(" ");
lcd_gotoxy(0,1);
lcd_putsf("OCR0: ");
display_no(OCR0);
if (PINC.0==0 || PINC.1==0 )
{
delay_ms(10);
if (PINC.0==0)
{
if (OCR0> 250)
OCR0=255;
else
OCR0=OCR0+5;
}
else if (PINC.1==0)
{
if(OCR0<5)
OCR0=0;
else
OCR0=OCR0-5;
}
}
else
{
}
}
}
/////////////////////////
void direction(char dir)
{
switch(dir)
{
case 1:
PORTD.0=0;
PORTD.1=1;
lcd_clear();
lcd_putsf("Direction: Left ");
break;
case 2:
PORTD.0=1;
PORTD.1=0;
lcd_clear();
lcd_putsf("Direction: Right ");
break;
case 3:
PORTD.0=0;
PORTD.1=0;
lcd_clear();
lcd_putsf("Direction: Brake ");
break;
}
}
/////////////////////////
void display_no(int no)
{
int array[5];
int i=0,j;
/*if( no < 0)
{
lcd_putchar('-');
no=-1*no;
}
else
lcd_putchar('+');*/
while(no > 9)
{
array[i++]=no % 10;
no/=10;
}
array[i]=no;
for(j=i;j >=0 ;j--)
{
lcd_putchar(48+array[j]);
delay_us(100);
}
}









دیدگاه