RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

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

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts

  • hoahauvn2
    replied
    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 đó.

    Leave a comment:


  • lowpass
    replied
    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?

    Leave a comment:


  • hoahauvn2
    replied
    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.
    [url=http://www.hpinfotech.com]HP InfoTech - CodeVisionAVR C Compiler[/url]
    
    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);
    
          }
    }

    Leave a comment:


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

    Leave a comment:


  • queduong
    replied
    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 !

    Leave a comment:


  • lowpass
    replied
    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à.?

    Leave a comment:


  • lowpass
    replied
    Thiếu gì vậy bạn?

    Leave a comment:


  • toi ngu kinh
    replied
    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.

    Leave a comment:


  • lowpass
    replied
    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, 22:14.

    Leave a comment:


  • toi ngu kinh
    replied
    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.

    Leave a comment:


  • 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é!.

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...