اطلاعیه

Collapse
No announcement yet.

مشکل با کانتر 0 میکرو avr

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با کانتر 0 میکرو avr

    با سلام به همه.
    من با یک mega16 یک کنترل کننده دور موتور طراحی کردم.(با ابتو کانتر و اینکودر)
    ولی تعداد پالسی که اینکودر شمارش میکنه و میکرو نمیتونه بخونه و تقریبا 1/4 مقدار اصلی و میخونه و از طریق یوزارت ارسال میکنه.
    نحوه کار به این صورته که تایمر 0 تعداد پالسهای خروجی اپتوکانتر و میشماره و تایمر یک هم در زمان 50 میلی ثانیه،سرریز میشه،به وقفه میره و در اون وقفه،مقدار TCNT0 ارسال میشه و صفر میشه.
    توی پروتیوس یک منبع پالس متصل کردم با فرکانس 1KHz.مقدار 50 رو برگردوند که درست بود.ولی زمانی که خروجی اپتو کانتر1 کیلوعه (با فرکانس متر ه یه مولتی متر خوب اندازه گرفتم) خروجی که به من میده 12 ه)کاملا گیج شدم کسی مشکل و میدونه:

    اینم از کد توی کدویژن:


    #include <mega16a.h>
    #include <delay.h>
    #include <stdio.h>
    #include <stdlib.h>
    // Declare your global variables here

    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)
    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<DOR)

    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];

    #if RX_BUFFER_SIZE <= 256
    unsigned char rx_wr_index=0,rx_rd_index=0;
    #else
    unsigned int rx_wr_index=0,rx_rd_index=0;
    #endif

    #if RX_BUFFER_SIZE < 256
    unsigned char rx_counter=0;
    #else
    unsigned int rx_counter=0;
    #endif

    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;

    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
    rx_buffer[rx_wr_index++]=data;
    #if RX_BUFFER_SIZE == 256
    // special case for receiver buffer size=256
    if (++rx_counter == 0) rx_buffer_overflow=1;
    #else
    if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE)
    {
    rx_counter=0;
    rx_buffer_overflow=1;
    }
    #endif
    }
    }

    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index++];
    #if RX_BUFFER_SIZE != 256
    if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #endif
    #asm("cli")
    --rx_counter;
    #asm("sei")
    return data;
    }
    #pragma used-
    #endif

    // Standard Input/Output functions


    char buff[5];
    volatile int kkkk;
    // Timer1 overflow interrupt service routine
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    // Reinitialize Timer1 value
    kkkk=TCNT0;
    TCNT0=0;
    TCNT1H=0x3CB0 >> 8;
    TCNT1L=0x3CB0 & 0xff;


    sprintf(buff,"%d",kkkk);
    puts(buff);

    }

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
    DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
    // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
    PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

    // Port B initialization
    // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
    DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
    // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=P
    PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (1<<PORTB0);

    // Port C initialization
    // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
    DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
    // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
    PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

    // Port D initialization
    // Function: Bit7=Out Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
    DDRD=(1<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
    // State: Bit7=0 Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
    PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    TCCR0=(1<<WGM00) | (1<<COM01) | (0<<COM00) | (1<<WGM01) | (1<<CS02) | (1<<CS01) | (1<<CS00);
    TCNT0=0x00;
    OCR0=0x00;


    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: Normal top=0xFFFF
    // OC1A output: Disconnected
    // OC1B output: Disconnected
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer Period: 3 ms
    // Timer1 Overflow Interrupt: On
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
    TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
    TCNT1H=0x3C;
    TCNT1L=0xB0;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 15.625 kHz
    // Mode: Fast PWM top=0xFF
    // OC2 output: Non-Inverted PWM
    // Timer Period: 16.384 ms
    // Output Pulse(s):
    // OC2 Period: 16.384 ms Width: 0 us
    ASSR=0<<AS2;
    TCCR2=(1<<PWM2) | (1<<COM21) | (0<<COM20) | (1<<CTC2) | (1<<CS22) | (0<<CS21) | (0<<CS20);
    TCNT2=0x00;
    OCR2=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
    MCUCSR=(0<<ISC2);

    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 4800
    UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
    UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
    UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
    UBRRH=0x00;
    UBRRL=0x0C;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // The Analog Comparator's positive input is
    // connected to the AIN0 pin
    // The Analog Comparator's negative input is
    // connected to the AIN1 pin
    ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
    SFIOR=(0<<ACME);

    // ADC initialization
    // ADC disabled
    ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

    // SPI initialization
    // SPI disabled
    SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

    // TWI initialization
    // TWI disabled
    TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

    // Global enable interrupts
    #asm("sei")

    while (1)
    {
    OCR2=120;

    }
    }


    #2
    پاسخ : مشکل با کانتر 0 میکرو avr

    سلام.برنامه شما رو دیدم .برنامه شما اشکالش اینکه شمارش کانتر تا حداکثر 255 می شماره در صورتی که شاید شما در مدت زمان 50 میلی ثانیه ممکن 1000 پالس داشته باشید در این صورت شما 255 تا می خونید و کانتر صفر میشه باید وقفه تایمر کانتر صفر رو فعال کنید و بعد یک متغییر تریف کنید و این متغییرمقدار سرریز شدن تایمر می شماره در فرمول لحاظ کنید.

    دیدگاه


      #3
      پاسخ : مشکل با کانتر 0 میکرو avr

      نوشته اصلی توسط MM320 نمایش پست ها
      سلام.برنامه شما رو دیدم .برنامه شما اشکالش اینکه شمارش کانتر تا حداکثر 255 می شماره در صورتی که شاید شما در مدت زمان 50 میلی ثانیه ممکن 1000 پالس داشته باشید در این صورت شما 255 تا می خونید و کانتر صفر میشه باید وقفه تایمر کانتر صفر رو فعال کنید و بعد یک متغییر تریف کنید و این متغییرمقدار سرریز شدن تایمر می شماره در فرمول لحاظ کنید.
      سلام.ممنون از جوابتون
      ولی همونطور ک گفتم توی شبیه ساز کاملا صحیح ه و مشکلی ایجاد نمیکنه.
      در عمل به مشکل میخورم

      دیدگاه


        #4
        پاسخ : مشکل با کانتر 0 میکرو avr

        من با فرمول چک کردم همین مقدار 50 در یک کیلوهرتز بود شاید مدار که بستی یه چکی کن شاید مشکلت حل شه

        در ضمن من با پروتئوس مدار بستم در فرکانس 1000 هرتز مقدار 6 یا 7 داد.
        جدیدترین ویرایش توسط MM320; ۱۷:۲۵ ۱۳۹۷/۰۳/۲۰.

        دیدگاه


          #5
          پاسخ : مشکل با کانتر 0 میکرو avr

          برنامه مجددا ایجاد کردم توی پروتئوس درست بود حا لا عملی شم چک کن (بادوریت روی 9600 تنظیم کردم)
          دانلود کنید.

          دیدگاه


            #6
            پاسخ : مشکل با کانتر 0 میکرو avr

            نوشته اصلی توسط MM320 نمایش پست ها
            برنامه مجددا ایجاد کردم توی پروتئوس درست بود حا لا عملی شم چک کن (بادوریت روی 9600 تنظیم کردم)
            دانلود کنید.

            برنامه داخل شبیه ساز کاملا جواب میده ولی نمیدونم چرا توی عمل مشکل داره

            دیدگاه


              #7
              پاسخ : مشکل با کانتر 0 میکرو avr

              شما فیوز بیت میکرو درست انتخاب کردین؟

              دیدگاه


                #8
                پاسخ : مشکل با کانتر 0 میکرو avr

                نوشته اصلی توسط MM320 نمایش پست ها
                شما فیوز بیت میکرو درست انتخاب کردین؟
                با تشکر زیاد از پیگیری شما
                ابن فیوزبیت های progisp ه ک باش پروگرام میکنم:


                دیدگاه


                  #9
                  پاسخ : مشکل با کانتر 0 میکرو avr

                  فکر کنم فیوزبیت CKSEL3..0 اشتباه تنظیم کردید مقدار صحیح اون طبق جدول زیر هست.

                  دیدگاه


                    #10
                    پاسخ : مشکل با کانتر 0 میکرو avr

                    [QUOTE=MM320;678078]فکر کنم فیوزبیت CKSEL3..0 اشتباه تنظیم کردید مقدار صحیح اون طبق جدول زیر هست.

                    [/QUOTE

                    چرا اشتباه؟؟؟
                    مقدار فرکانس میکرو 1 مگاست دیگ!!!!!

                    دیدگاه


                      #11
                      پاسخ : مشکل با کانتر 0 میکرو avr

                      برنامه من مجدد براتون باز نویسی کردم با فرکانس 8 مگاهرتزه

                      دیدگاه


                        #12
                        پاسخ : مشکل با کانتر 0 میکرو avr

                        نوشته اصلی توسط MM320 نمایش پست ها
                        برنامه من مجدد براتون باز نویسی کردم با فرکانس 8 مگاهرتزه
                        ینی میگین مشکل از فرکانس میکروعه؟؟؟؟
                        تستش میکنم حتمن

                        دیدگاه


                          #13
                          پاسخ : مشکل با کانتر 0 میکرو avr

                          نوشته اصلی توسط hesam1995 نمایش پست ها
                          ینی میگین مشکل از فرکانس میکروعه؟؟؟؟
                          تستش میکنم حتمن
                          امتحان کردم نشد
                          خواهش میکنم کسی میدونه کمکم کنه دارم دیوونه میشوم

                          دیدگاه

                          لطفا صبر کنید...
                          X