Thông báo

Collapse
No announcement yet.

Mới học ATMEGA8, Mô phỏng không chạy?

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

  • Mới học ATMEGA8, Mô phỏng không chạy?

    Mình tập viết bằng codevisionAVR:
    Mạch của mình đây:
    Click image for larger version

Name:	AT8.png
Views:	1
Size:	34.9 KB
ID:	1421225
    Mục đích là khi bật công tắc ở PORTB thì đèn tương ứng ở PORTC sáng.
    Mình đã thiết lập PORTB là INPUT(có trở treo) còn PORTC là OUTPUT (không có trở treo)
    Thêm #include<delay.h> để sử dụng hàm delay
    ở vòng while (1)
    {
    PORTC=~PORTB;
    delay_ms(500);
    // Place your code here

    }
    Tạo được file HEX nạp vào mạch để chạy mô phỏng.
    Tại sao khi bật công tắc không có đèn nào sáng?
    Mình tìm mãi chưa hiểu tại sao?
    Giải đáp giúp mình với, Cám ơn các bạn nhiều nhé!.
    Email:
    Đau đầu vì điện tử

  • #2
    ví dụ nếu portb.1 =1 thì portc.1=1
    vậy chương trinh của bạn có gì đâu nhỉ.
    https://www.youtube.com/watch?v=UJmbda_2qFI hy vọng đúng cái bạn cần.

    Comment


    • #3
      vấn đề ở đây là code của mình sai chỗ nào?
      #include <mega8.h>
      #include <delay.h>


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

      // Input/Output Ports initialization
      // Port B initialization

      PORTB=0xFF;
      DDRB=0x00;

      // Port C initialization

      PORTC=0x00;
      DDRC=0x7F;



      while (1)
      {
      PORTC=~PORTB;
      delay_ms(500);
      // Place your code here

      }
      }
      Last edited by lowpass; 23-04-2014, 23:14.
      Email:
      Đau đầu vì điện tử

      Comment


      • #4
        Nguyên văn bởi lowpass Xem bài viết
        vấn đề ở đây là code của mình sai chỗ nào?
        #include <mega8.h>
        #include <delay.h>


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

        // Input/Output Ports initialization
        // Port B initialization

        PORTB=0xFF;
        DDRB=0x00;

        // Port C initialization

        PORTC=0x7F;
        DDRC=0x7F;



        while (1)
        {
        PORTC=~PORTB;
        delay_ms(500);
        // Place your code here

        }
        }
        thiếu chứ có sai đâu.

        Comment


        • #5
          Thiếu gì vậy bạn?
          Email:
          Đau đầu vì điện tử

          Comment


          • #6
            Mình tưởng vấn đề đơn giản, hóa ra lại khó vậy sao? code chỉ có 2 dòng thôi mà.?
            Email:
            Đau đầu vì điện tử

            Comment


            • #7
              Theo mình, mới học thì phải biết cái khái niệm này :
              Thanh ghi để điều hướng xuất , nhập được chia ra làm 2 điều hướng :
              1) đọc vào : sử dụng PINX.y Đối với từng bit ( chân cụ thể ) , PINA , PIN B ... để đọc cả 8 bit ( tương ứng )
              2) xuất ra : PORTX.y ( đối với từng bit cụ thể ) và PORTA , PORTB ..... ( với xuất ra cả 8 bit trên 1 port cụ thể )

              --- Việc thực hiện phép gán : PORTB = x ( với x là kết quả hoặc 1 biến có thể điều chỉnh )

              --- Có trình dịch cho phép đọc trạng thái ngay cả trên PORT , có trình dịch thì không ( mà phải là PIN )

              --- Thanh ghi DDR ( VD : DDRA , DDRB .v.v. ) cho phép xác lập các bit , là in hay out ( Thực tế có thể lúc set chân là IN, lúc set chân là out linh hoạt nếu chương trình cần thiết phải linh hoạt ( vừa vào, vừa ra trân cùng 1 chân )

              --- Một ví dụ cụ thể :

              if(PORTB ==0x08 )
              {
              /// làm cái gì ở đây
              }

              với lệnh này chưa chắc 1 số trình dịch đã hiểu đang đọc các bit trạng thái tại PORTB

              if(PINB == 0x08 )
              {
              /// làm cái gì ở đây
              }

              với lệnh này : đa số các trình dịch đều sẽ hiểu là mình đang muốn đọc ( kiểm tra ) các trạng thái chân ( so với giá trị 0x08 ) để thực hiện các lệnh.


              --- Một điều lưu ý nữa là đối với xác lập DDR nếu giá trị 1 ( xuất ra ) còn giá trị ( 0 ) đọc vào . ( các MCU AVR đều có quy định chung như vậy ) ... khác với PIC ( 1 ( vào ) còn 0 ( ra )).


              --- Ở ví dụ trên khi thực hiện phép gán PORTC = ~PORTB ; với PORTB set là DDRB =0x00 ( nghĩa là input cả PORT ) , có thể chẳng có ý nghĩa gì ( vì giá trị của PORTB ở đây là không thay đổi )

              nhưng nếu PORTC = ~PORTC; thì có thể là sẽ khác ( vì giá trị của PORTC sẽ được thay đổi theo thời gian ) cụ thể sau thời gian trễ PORTC sẽ bị đảo 1 lần ( và PORTC được cập nhật giá trị mới ). Lúc đó ta sẽ thấy hiệu ứng " nhấp nháy " chẳng hạn !
              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


              • #8
                mình cũng muốn học atmega8 mà k có ai học chung cả học onl cũng đc

                Comment


                • #9
                  Nguyên văn bởi lowpass Xem bài viết
                  Mình tưởng vấn đề đơn giản, hóa ra lại khó vậy sao? code chỉ có 2 dòng thôi mà.?
                  Những gì bạn cần thì bác Que Duong đã nói hết rồi, mình chỉ góp vui cái hình và cái code cho nó xôm tụ thôi.

                  Click image for larger version

Name:	atl1.png
Views:	1
Size:	25.7 KB
ID:	1395241
                  Click image for larger version

Name:	atl2.png
Views:	1
Size:	28.7 KB
ID:	1395242

                  Trước khi gửi cái code có vài điều muốn nói thêm.
                  _Codevision chỉ nhận được phép gán PORTX=PINY; để gán giá trị của portY vào portX
                  _Đối với ATMEGA8 thì phép gán PORTC=~PINB; là ko có gì sai cả nhưng nhìn thấu đáo thì portB có 8 bit trong khi portC có 7 bit theo như phần cứng của MCU, như vậy gán 8 bit vào 1 thanh ghi có 7 bit là ko hay cho lắm, bởi lẽ ta ko biết cái bit cuối bị thửa được xử lý như thế nào??? Ở đây mình thấy nó có vẻ bỏ qua bit thừa nhưng ko biết nó có tính lỗi ko nữa, chứ mấy dòng MCU khác nó cũng bỏ qua nhưng nó sẽ coi đó là 1 lỗi tràn, đến 1 lúc nào đó nó treo MCU.
                  Vì thế mình chọn PORTD=~PINB; 8bit làm việc với 8bit là đẹp nhất.

                  Code đây:


                  Code:
                  /*****************************************************
                  This program was produced by the
                  CodeWizardAVR V2.05.6 Evaluation
                  Automatic Program Generator
                  © Copyright 1998-2012 Pavel Haiduc, HP InfoTech s.r.l.
                  HP InfoTech - CodeVisionAVR C Compiler
                  
                  Project : 
                  Version : 
                  Date    : 04-05-2014
                  Author  : Freeware, for evaluation and
                  non-commercial use only
                  Company : 
                  Comments: 
                  
                  
                  Chip type               : ATmega8
                  Program type            : Application
                  AVR Core Clock frequency: 16.000000 MHz
                  Memory model            : Small
                  External RAM size       : 0
                  Data Stack size         : 256
                  *****************************************************/
                  
                  #include <mega8.h>
                  #include <delay.h>
                  
                  // Declare your global variables here
                  
                  void main(void)
                  {
                  // Declare your local variables here
                  
                  // Input/Output Ports initialization
                  // Port B 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 
                  PORTB=0x00;
                  DDRB=0x00;
                  
                  // Port C initialization
                  // Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
                  // State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
                  PORTC=0x00;
                  DDRC=0x7F;
                  
                  // 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
                  TCCR0=0x00;
                  TCNT0=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
                  MCUCR=0x00;
                  
                  // Timer(s)/Counter(s) Interrupt(s) initialization
                  TIMSK=0x00;
                  
                  // USART initialization
                  // USART disabled
                  UCSRB=0x00;
                  
                  // Analog Comparator initialization
                  // Analog Comparator: Off
                  // Analog Comparator Input Capture by Timer/Counter 1: Off
                  ACSR=0x80;
                  SFIOR=0x00;
                  
                  // ADC initialization
                  // ADC disabled
                  ADCSRA=0x00;
                  
                  // SPI initialization
                  // SPI disabled
                  SPCR=0x00;
                  
                  // TWI initialization
                  // TWI disabled
                  TWCR=0x00;
                  
                  while (1)
                        {
                        // Place your code here
                        PORTD=~PINB;
                        delay_ms(100);
                  
                        }
                  }
                  Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
                  Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

                  Comment


                  • #10
                    Cám ơn Bác queduong và hoahauvn2, Em tự học 8051 còn chưa vững đã chuyển qua học AVR, vì thế còn nhiều vấn đề chưa hiểu rõ. cái dòng code: PORTC=~PORTB; là do em vận dụng cái code: P1=~P0; bên 8051 đấy, thành ra sai bét cả.
                    Xin được hỏi bạn hoahauvn2: cái dòng trong code của bạn: delay_ms(100); có phải là để chống rung phím không vậy?
                    Email:
                    Đau đầu vì điện tử

                    Comment


                    • #11
                      Nguyên văn bởi lowpass Xem bài viết
                      Cám ơn Bác queduong và hoahauvn2, Em tự học 8051 còn chưa vững đã chuyển qua học AVR, vì thế còn nhiều vấn đề chưa hiểu rõ. cái dòng code: PORTC=~PORTB; là do em vận dụng cái code: P1=~P0; bên 8051 đấy, thành ra sai bét cả.
                      Xin được hỏi bạn hoahauvn2: cái dòng trong code của bạn: delay_ms(100); có phải là để chống rung phím không vậy?
                      Thật ra mình xem cái code ở bài post đầu tiên của bạn có chỗ delay_ms(500); khi cho mô phỏng do máy yếu nên nó delay lâu quá nên mình cho giảm xuống còn 100 ms thôi chứ ko có ý chống rung phím gì ở đây cả, Nếu trên thực tế bạn dùng nút nhấn thì đúng là nó giúp chống rung phím khi nhấn đó.
                      Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
                      Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X