اطلاعیه

Collapse
No announcement yet.

کار نکردن lcd در اینتراپت تایمر

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

    کار نکردن lcd در اینتراپت تایمر

    سلام به دوستان
    نمی دونم این lcd چه صیغه ایه ! یا من نمی تونم باهاش کار کنم یا کلاً بد قلقه
    یه مدار ساده بستم که یه عدد رو رو lcd نمایش بده .
    هر لحظه می خوام مقدار یه متغیر رو نشون بدم
    هر جایی دستور رو گذاشتم یه جوری کار کرد ، تو اینتراپت هم که میزاری کلاً میکرو دیگه کار نمی کنه !
    از استید کسی هست راهنمایی بکنه بگه ایراد کار ما چیه ؟
    کد PHP:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.04.4a Advanced
    Automatic Program Generator
    © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com

    Project : 
    Version : 
    Date  : 2010/05/17
    Author : NeVaDa
    Company : ECA
    Comments: 


    Chip type        : ATmega8L
    Program type      : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/

    #include <mega8.h>

    // Alphanumeric LCD Module functions
    #asm
      
    .equ __lcd_port=0x12 ;PORTD
    #endasm
    #include <lcd.h>
    #include <delay.h>
    #include <stdlib.h>
    int b=100;
    char c[3];

    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVFvoid timer0_ovf_isr(void)
    {
    if (
    PINC.0==1){
    b=b+10;
    while (
    1){
    if (
    PINC.0==0){
    break;
    }
    }
    }

    if (
    PINC.1==1){
    b=b-10;
    while (
    1){
    if (
    PINC.1==0){
    break;
    }
    }
    }
         
    lcd_gotoxy(0,0);
        
    itoa (b,c);
        
    lcd_puts(c); 
    }

    // Declare your global variables here

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

    // Input/Output Ports initialization
    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTB=0x00;
    DDRB=0xFF;

    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 8000.000 kHz
    TCCR0=0x01;
    TCNT0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;

    // 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);

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

    while (1)
       {  
       
       
    PORTB=0B00000001;
       
    delay_ms(b); 
       
    PORTB=0B00000011;
       
    delay_ms(b);
       
    PORTB=0B00000010;
       
    delay_ms(b); 
       
    PORTB=0B00000110;
       
    delay_ms(b);
       
    PORTB=0B00000100;
       
    delay_ms(b); 
       
    PORTB=0B00001100;
       
    delay_ms(b);
       
    PORTB=0B00001000;
       
    delay_ms(b); 
       
    PORTB=0B00001001;
       
    delay_ms(b);
       
         
    // lcd_clear();
     
       
    };


    #2
    پاسخ : کار نکردن lcd در اینتراپت تایمر

    مشکل رو حل کردم
    الان درست داره کار می کنه
    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.04.4a Advanced
    Automatic Program Generator
    © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date  : 2010/05/17
    Author : NeVaDa
    Company : ECA
    Comments: 
    
    
    Chip type        : ATmega8L
    Program type      : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/
    
    #include <mega8.h>
    
    // Alphanumeric LCD Module functions
    #asm
      .equ __lcd_port=0x12 ;PORTD
    #endasm
    #include <lcd.h>
    #include <delay.h>
    #include <stdlib.h>
    int b=5;
    char c[3];
    
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    if (PINC.0==1){
    b=b+5;
    while (1){
    if (PINC.0==0){
    break;
    }
    }
    }
    
    if (PINC.1==1 && b!=5){
    b=b-5;
    while (1){
    if (PINC.1==0){
    break;
    }
    }
    }
    
    }
    void lcd(void){
    
         lcd_gotoxy(0,0);
        itoa (b,c);
        lcd_puts(c); 
    }
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTB=0x00;
    DDRB=0xFF;
    
    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x00;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 8000.000 kHz
    TCCR0=0x01;
    TCNT0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;
    
    // 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);
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
       {  
       lcd();
       PORTB=0B00000001;
       delay_ms(b); 
       lcd();
       PORTB=0B00000011;
       delay_ms(b); 
       lcd();
       PORTB=0B00000010;
       delay_ms(b); 
       lcd();
       PORTB=0B00000110;
       delay_ms(b); 
       lcd();
       PORTB=0B00000100;
       delay_ms(b); 
       lcd();
       PORTB=0B00001100;
       delay_ms(b); 
       lcd();
       PORTB=0B00001000;
       delay_ms(b); 
       lcd();
       PORTB=0B00001001;
       delay_ms(b);
       
     
       };
    }

    فقط یه مشکلی هست !
    با اینکه یه خازن 1000 میکرو فارادی بستم به تغذیه و حتی تغذیه استپ موتور رو قبل رگولاتور گذاشتم ، باز هم وقت کار کردن استپ موتور نور lcd کم و زیاد میشه !
    و یک سوال دیگه ! یکی بهم گفت که استفاده از دستور break تو برنامه نویسی غیراصولیه oo: درسته حرفش ؟
    اگه درسته به چه علتی ؟

    دیدگاه


      #3
      پاسخ : کار نکردن lcd در اینتراپت تایمر

      نوشته اصلی توسط فرشاد اکرمی
      فقط یه مشکلی هست !
      با اینکه یه خازن 1000 میکرو فارادی بستم به تغذیه و حتی تغذیه استپ موتور رو قبل رگولاتور گذاشتم ، باز هم وقت کار کردن استپ موتور نور lcd کم و زیاد میشه !
      و یک سوال دیگه ! یکی بهم گفت که استفاده از دستور break تو برنامه نویسی غیراصولیه oo: درسته حرفش ؟
      اگه درسته به چه علتی ؟
      چرا غیر اصولیه؟؟؟اگه این دستور نباشه توی switch چی کار میکنید که همه ی case ها اجرا نشند؟؟
      هر دستوری اگه به جا استفاده شه کاربردی.شاید منظور دوستتون label بوده که با دستور goto استفاده میشه.چون بقیه دستورات کاربرد مخصوص خودشون رو دارند. :agree:
      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

      دیدگاه


        #4
        پاسخ : کار نکردن lcd در اینتراپت تایمر

        البته من هم یکم تعجب کردم :eek:
        اما این تعجب به خاطر چگونگی نوشتن while بود . خوب معمولا برای debounce کردن کلیدها یک حلقه while با همون شرط if که کلید رو اسکن میکنه داخل حلقه if میگذارن و حقیقتا اولین بار بود که این کار رو با یک حلقه بینهایت که breake شده میدیدم .
        البته کار میکنه اینم ولی این روش نه اینکه اصولی نیست اما اصولا عرف نیست ! چی گفتم ... :angry: بابا اصلا همون که رفیقت میگه .
        موفقیت یک فرایند است نه یک اتفاق...

        ******** استفاده از گزينه تشكر نشانه اهميت و احترام شما به پيگيري شخص نظر دهنده است ********

        دیدگاه


          #5
          پاسخ : کار نکردن lcd در اینتراپت تایمر

          نوشته اصلی توسط erfan2000
          البته من هم یکم تعجب کردم :eek:
          اما این تعجب به خاطر چگونگی نوشتن while بود . خوب معمولا برای debounce کردن کلیدها یک حلقه while با همون شرط if که کلید رو اسکن میکنه داخل حلقه if میگذارن و حقیقتا اولین بار بود که این کار رو با یک حلقه بینهایت که breake شده میدیدم .
          البته کار میکنه اینم ولی این روش نه اینکه اصولی نیست اما اصولا عرف نیست ! چی گفتم ... :angry: بابا اصلا همون که رفیقت میگه .
          عرفان جان حرف شما صحیحه
          البته درستش کرده بودم ولی چون مشکل اصلیم حل شده بود دیگه اینجا قرار ندادم .
          کد:
          if (PINC.0==1){
          b=b+5;
          while (PINC.0==1){}
          }
          
          if (PINC.1==1 && b!=5){
          b=b-5;   
          while (PINC.1==1){}
          }

          تبدیلش کردم به این کد :d

          دیدگاه

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