Thông báo

Collapse
No announcement yet.

atmega16L đang chạy tự dưng ngất!

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • atmega16L đang chạy tự dưng ngất!

    HIC HIC, các bác ơi cứu em.
    Em làm cái mạch đo nhiệt độ dùng Atmega16l( chạy thạch anh ngoài 4Mhz), dùng lm35, hiện thị LCD. Em fuse bit thành công, mạch em đã chạy( hiện thị được nhiệt).
    Đến hôm nay em định lập trình để thêm ma trận phím vào nữa cho hoàn chỉnh thì không hiểu sao nạp ngon lành nhưng mạch không chạy, nạp lại code cũ cũng không chạy.

    Kiểm tra nguồn vào chuẩn 5V( dùng LM2576), LCD cho sang mạch 89s52 vẫn hiện thị tốt, nạp lại chip vẫn tốt ...... chỉ có cái cắm nguồn chạy thì LCD cứ hiện 1 dòng xám trên cùng ( em bó tay rồi, các bác giúp em với).

  • #2
    Vậy là LCD vẫn tốt. Bạn thử nạp chương trình chip điều khiển nhấp nháy 1 con led xem có đươc không. Vậy là biết nguyên nhân ngay.
    Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
    http://diencongnghiep360.com/
    http://tudienhathe.vn/

    Comment


    • #3
      Em cho nhấp nháy cả hàng rồi, nhấp nháy ngon lành, không vấn đề gì cả( test thẳng trên mạch luôn, vì em có làm các chân cắm các cổng thừa ra ngoài).
      Đây là code của em, len protues vẫn ngon lành mà:
      PHP Code:
      /*****************************************************
      This program was produced by the
      CodeWizardAVR V2.04.9a Evaluation
      Automatic Program Generator
      © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
      http://www.hpinfotech.com

      Project : 
      Version : 
      Date    : 3/18/2013
      Author  : Freeware, for evaluation and non-commercial use only
      Company : 
      Comments: 


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

      #include <mega16.h>
      #include <stdlib.h> 
      #include <delay.h>
      //==============================khai bao bien================================= 
       
      unsigned char  lcdBuff[10];
       
      float gt_ADC
       
      int giatri[10]; 
       
      int biendem=0
       
      int tang=45;
       
      #define hang1 PORTB.0
       #define hang2 PORTB.1
       #define cot2 PORTB.2
       #define cot1 PORTB.1  
       //================================bat dau thoi===============================
      // Alphanumeric LCD Module functions
      #include <alcd.h>

      unsigned int adc_data;
      #define ADC_VREF_TYPE 0xC0

      // ADC interrupt service routine
      interrupt [ADC_INTvoid adc_isr(void)
      {
      // Read the AD conversion result
      adc_data=ADCW;
      }

      // Read the AD conversion result
      // with noise canceling
      unsigned int read_adc(unsigned char adc_input)
      {
      ADMUX=adc_input | (ADC_VREF_TYPE 0xff);
      // Delay needed for the stabilization of the ADC input voltage
      delay_us(10);
      #asm
          
      in   r30,mcucr
          cbr  r30
      ,__sm_mask
          sbr  r30
      ,__se_bit __sm_adc_noise_red
          out  mcucr
      ,r30
          sleep
          cbr  r30
      ,__se_bit
          out  mcucr
      ,r30
      #endasm
      return adc_data;
      }
      //=====================================================================
      void cot(void)
      {
      if(
      cot1==0)
      {while(
      cot1==0){;}
      if (
      hang1==0)
      biendem++;
      else
      tang++;}
      if(
      cot2==0)
      { while(
      cot2==0){;}
       
      tang--;}
       }
      //=====================================================================
      void quetphim (void)
      {
      unsigned char x;
      for(
      x=0;x<10;x++)
      {
      hang1=0;hang2=1;
      cot();
      hang1=1;hang2=0;
      cot();
      }
      }
      //====================================================================

      void sumadc (void)
      {
      unsigned char x,y;
      for(
      x=0;x<=1;x++)
      for(
      y=0y<=29y++)
      giatri[x]=read_adc(x)+giatri[x];
      }
      //====================================================================
      void hienthi (void)
            {  
      unsigned char x,y;
            
      sumadc();
            for( 
      x=0;x<=1;x++)
               { 
      lcd_gotoxy(x,x);
             
      gt_ADC=((float)(giatri[x]/120));
            
      ftoa(gt_ADC,2,lcdBuff);
            
      lcd_puts(lcdBuff);
            
      delay_ms(10);
            
      giatri[x]=0;
            for( 
      y=0;y<=7;y++)
            
      lcdBuff[y]=0
            }
            } 
      //========================================================
      /*void hienthiso( int x)
      {
      int a,b;
      a=0;
      while(x>0)
      { mang[a]=x%10;
      x=x/10;
      a++;
      }
      while((x==0)&(a<=3))
      { mang[a]=0;
      a++;}
      a--;
      for(b=a; b>=0; b--)
       lcd_putchar(mang[b]+48);
      }*/
      //================================================
      void hienthi_mode(void)
      {
      if (
      biendem%2==0)
      {
      lcd_putsf("Nhiet cai dat");
      lcd_gotoxy(1,1);
      lcd_putchar(tang);
      }
      else 
      hienthi();
      }


      // Declare your global variables here

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

      // Input/Output Ports initialization
      // Port A 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 
      PORTA=0x00;
      DDRA=0x00;

      // Port B initialization
      // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=Out Func0=Out 
      // State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=0 State0=0 
      PORTB=0x00;
      DDRB=0xF3;

      // Port C 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 
      PORTC=0x00;
      DDRC=0xFF;

      // Port D 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 
      PORTD=0x00;
      DDRD=0xFF;

      // Timer/Counter 0 initialization
      // Clock source: System Clock
      // Clock value: Timer 0 Stopped
      // Mode: Normal top=0xFF
      // OC0 output: Disconnected
      TCCR0=0x00;
      TCNT0=0x00;
      OCR0=0x00;

      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: Timer1 Stopped
      // Mode: Normal top=0xFFFF
      // 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=0xFF
      // OC2 output: Disconnected
      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;

      // ADC initialization
      // ADC Clock frequency: 1000.000 kHz
      // ADC Voltage Reference: Int., cap. on AREF
      // ADC Auto Trigger Source: ADC Stopped
      ADMUX=ADC_VREF_TYPE 0xff;
      ADCSRA=0x8A;

      // Alphanumeric LCD initialization
      // Connections specified in the
      // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
      // RS - PORTC Bit 0
      // RD - PORTC Bit 1
      // EN - PORTC Bit 2
      // D4 - PORTC Bit 4
      // D5 - PORTC Bit 5
      // D6 - PORTC Bit 6
      // D7 - PORTC Bit 7
      // Characters/line: 16
      lcd_init(16);

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

      while (1)
            {  
      //quetphim();
             //hienthi_mode();
               
      hienthi();
          

            }

      Comment


      • #4
        Thế thì cái LCD tèo

        Comment


        • #5
          Nguyên văn bởi duong_act Xem bài viết
          Thế thì cái LCD tèo
          Chết đã đành, đằng này lắp sang mạch hiện thị LCD của 89S52 nó vẫn >> vù vù>> mới quái chứ, em chưa gặp trường hợp nào quái thế này cả.

          Comment


          • #6
            Đây có thể là hiện tượng cho quá áp ( 16L ) và cũng có thể bị ở trình dịch ( thư viện LCD ) . ( thử thêm delay trong các câu lệnh LCD hoặc đảo vị trí hàm LCD sẽ giải quyết được vấn đề ).

            -- trước đây tôi đã gặp 1 trường hợp y chang đối với ATMEGA16 và ATMEGA16L sử dụng CodeVision ...
            lúc đó nhận ra CodeVision Lởm quá ... nên bái bai ... chẳng dùng nữa !
            Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

            Comment


            • #7
              Nguyên văn bởi queduong Xem bài viết
              Đây có thể là hiện tượng cho quá áp ( 16L ) và cũng có thể bị ở trình dịch ( thư viện LCD ) . ( thử thêm delay trong các câu lệnh LCD hoặc đảo vị trí hàm LCD sẽ giải quyết được vấn đề ).

              -- trước đây tôi đã gặp 1 trường hợp y chang đối với ATMEGA16 và ATMEGA16L sử dụng CodeVision ...
              lúc đó nhận ra CodeVision Lởm quá ... nên bái bai ... chẳng dùng nữa !
              Em đã mắc thêm trở vào mạch, áp qua con atmega16l chỉ 4.5V, em chỉ thử cho hiện thị có mỗi dòng sau thôi:
              PHP Code:
              while (1)
                    { 
              PORTD=0x00;
                    
              delay_ms(1000);
                    
              PORTD=0xff;
                    
              delay_ms(1000);
                       
              lcd_putsf(" vi sao the em");
                       
              delay_ms(1000);
                       
              lcd_clear();
                    } 
              led thì nháy đều, còn LCD thì sáng như hôi mới về,không hiện gì cả.Có lẽ đi mua em atmega16 xem sao.hic

              Comment


              • #8
                Nguyên văn bởi gaconhamhoc Xem bài viết
                Em đã mắc thêm trở vào mạch, áp qua con atmega16l chỉ 4.5V, em chỉ thử cho hiện thị có mỗi dòng sau thôi:
                PHP Code:
                while (1)
                      { 
                PORTD=0x00;
                      
                delay_ms(1000);
                      
                PORTD=0xff;
                      
                delay_ms(1000);
                         
                lcd_putsf(" vi sao the em");
                         
                delay_ms(1000);
                         
                lcd_clear();
                      } 
                led thì nháy đều, còn LCD thì sáng như hôi mới về,không hiện gì cả.Có lẽ đi mua em atmega16 xem sao.hic
                chưa chắc con đó đã chết đâu ... bạn post cái sơ đồ lên mình thử bằng chương trình khác xem.
                Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                Comment


                • #9
                  mình không thấy khai báo lcd trong code nên không biết vị trí chân , bạn mô tả xem !
                  Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                  Comment


                  • #10
                    hic . Em phát hiện ra nguyên nhân rồi.
                    Là do codeavr lúc em lập trình xong, rồi Ctrl+F9 thế là nó nạp luôn. Tại em mới dùng không để ý, lúc nó nạp, nó fuses bit lại luôn, nó cho ngay bit JTAGEN về 0 luôn, hỏi sao LCD chả thấy cái mô gì.(em dùng Port C mà)
                    Em fuse lại thì mấy cái hiện lcd đơn giản thì ngon, nhưng cái chương trình cũ thì giờ nhảy loạn lên, LCD nó hiện lên" đúng" về nội dung nhưng như kiểu lỗi font ý, nhảy loạn cả lên.Liệu fuse bit nhiều có hỏng chip không bác.

                    Đây là code đầy đủ của em, bác xem qua.
                    PHP Code:
                    /*****************************************************
                    This program was produced by the
                    CodeWizardAVR V2.04.9a Evaluation
                    Automatic Program Generator
                    © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
                    http://www.hpinfotech.com

                    Project : 
                    Version : 
                    Date    : 3/10/2013
                    Author  : Freeware, for evaluation and non-commercial use only
                    Company : 
                    Comments: 


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

                    #include <mega16.h>
                    #include <stdlib.h> 
                    #include <delay.h>
                    float gt_ADC;
                    char mang[10];
                    unsigned char quetphim[4]={0xFE,0xFD,0xFB,0xF7};
                    int giatri[10];
                    #define solanquetphim 100
                    unsigned char  lcdBuff[10];
                    // Alphanumeric LCD Module functions
                    #include <alcd.h>

                    #define ADC_VREF_TYPE 0xC0

                    // Read the AD conversion result
                    unsigned int read_adc(unsigned char adc_input)
                    {
                    ADMUX=adc_input | (ADC_VREF_TYPE 0xff);
                    // Delay needed for the stabilization of the ADC input voltage
                    delay_us(10);
                    // Start the AD conversion
                    ADCSRA|=0x40;
                    // Wait for the AD conversion to complete
                    while ((ADCSRA 0x10)==0);
                    ADCSRA|=0x10;
                    return 
                    ADCW;
                    }

                    void hienthiint x)
                    {
                    int a,b;
                    a=0;
                    while(
                    x>0)
                    mang[a]=x%10;
                    x=x/10;
                    a++;
                    }
                    while((
                    x==0)&(a<=3))
                    mang[a]=0;
                    a++;}
                    a--;
                    for(
                    b=ab>=0b--)
                     
                    lcd_putchar(mang[b]+48);
                    }

                    unsigned char quetbanphim(void)
                    {
                    unsigned char giatribanphim;// Bien de luu gia tri phim an tu 0 den 15 ma hoa 16 phim
                    unsigned char x,y;
                    //Quet 4 hang phim
                    for(x=0x<2;x++)
                    {
                    PORTB=quetphim[x];// Dua lan luot cac hang xuong 0
                    for(y=0;y<solanquetphim;y++)// Kiem tra solanquetphim lan
                    {
                    if(
                    PORTB.3==0giatribanphim=0+2*x;// Gia tri phim tuong ung
                    if(PORTB.2==0giatribanphim=1+2*x;// Tuy thuoc vao hang x
                    }
                    }
                    return(
                    giatribanphim);
                    }

                    void chedo (void)
                    {  
                    unsigned char mode;
                    if (
                    quetbanphim()==2)
                    {
                    mode=1;
                    lcd_putsf(" che do 1");
                    delay_ms(50);}

                    }  
                      
                    // Declare your global variables here                                                                                                                                                                                                                    

                    void sumadc (void)
                    {
                    unsigned char x,y;
                    for(
                    x=0;x<=1;x++)
                    for(
                    y=0y<=29y++)
                    giatri[x]=read_adc(x)+giatri[x];
                    }

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

                    // Input/Output Ports initialization
                    // Port A 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 
                    PORTA=0x00;
                    DDRA=0x00;

                    // 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=0xFF;
                    DDRB=0xFF;

                    // Port C 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 
                    PORTC=0x00;
                    DDRC=0xFF;

                    // 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: Timer 0 Stopped
                    // Mode: Normal top=0xFF
                    // OC0 output: Disconnected
                    TCCR0=0x00;
                    TCNT0=0x00;
                    OCR0=0x00;

                    // Timer/Counter 1 initialization
                    // Clock source: System Clock
                    // Clock value: Timer1 Stopped
                    // Mode: Normal top=0xFFFF
                    // 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=0xFF
                    // OC2 output: Disconnected
                    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;

                    // ADC initialization
                    // ADC Clock frequency: 1000.000 kHz
                    // ADC Voltage Reference: Int., cap. on AREF
                    // ADC Auto Trigger Source: ADC Stopped
                    ADMUX=ADC_VREF_TYPE 0xff;
                    ADCSRA=0x82;

                    // Alphanumeric LCD initialization
                    // Connections specified in the
                    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
                    // RS - PORTC Bit 0
                    // RD - PORTC Bit 1
                    // EN - PORTC Bit 2
                    // D4 - PORTC Bit 4
                    // D5 - PORTC Bit 5
                    // D6 - PORTC Bit 6
                    // D7 - PORTC Bit 7
                    // Characters/line: 16
                    lcd_init(16);
                     
                    lcd_putsf"hello");
                           
                    delay_ms(300);
                           
                    lcd_gotoxy(0,1);
                           
                    lcd_putsf("nhiet hien thi");
                           
                    delay_ms(1000);
                           
                    lcd_clear(); 
                           
                    DDRB=0xF3
                           
                    /* lcd_clear(); 
                        
                          gt_ADC=((float)(giatri[0]/120));
                          ftoa(gt_ADC,2,lcdBuff);
                          lcd_puts(lcdBuff);
                          giatri[0]=0;*/ //ham hien thi so thuc chuan.
                    while (1)
                          { 
                    sumadc();  
                            
                    //chedo();
                             //Place your code here
                             
                           
                    lcd_clear();          
                        
                           
                    lcd_gotoxy(0,0);
                           
                    hienthi(giatri[0]/120);
                           
                    giatri[0]=0;
                           
                    lcd_gotoxy(1,1);
                           
                    hienthi(giatri[1]/120);
                           
                    giatri[1]=0;
                           
                    delay_ms(1000); 
                          
                          }

                    Comment


                    • #11
                      Còn đây là mạch của em, mong các bác xem qua nó đã ổn chưa .
                      Em mới làm, còn thiếu kinh nghiệm, mong các bác giúp đỡ Click image for larger version

Name:	Untitled.png
Views:	2
Size:	22.2 KB
ID:	1375733

                      Comment


                      • #12
                        LCD die rồi. m cũng đã tùng bị như thế thay LCD khác vào lại ngon
                        01689964729

                        Comment

                        Về tác giả

                        Collapse

                        gaconhamhoc Tìm hiểu thêm về gaconhamhoc

                        Bài viết mới nhất

                        Collapse

                        Đang tải...
                        X