Nguyên văn bởi lowpass
Xem bài viết
Mới học ATMEGA8, Mô phỏng không chạy?
Collapse
X
-
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 đó.
-
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:
-
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.Nguyên văn bởi lowpass Xem bài viếtMì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à.?
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:
-
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:
-
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:
-
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:
-
thiếu chứ có sai đâu.Nguyên văn bởi lowpass Xem bài viếtvấ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
}
}
Leave a comment:
-
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:
-
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:
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é!.Tags: None
dự án của bạn Tra theo mã, xem datasheet và đặt hàng trực tuyến. MicrochipROHMEpsonTaejin
Đặt hàng & tư vấn
Hà Nội024.3640 8561
TP.HCM028.3811 9870
Quét mã hoặc bấm để chat Zalo với R&PChat Zalo
Quét mã hoặc bấm để chat Zalo với R&PChat Zalo
Bài viết mới nhất
Collapse
-
Trả lời cho Tìm bạn thân quen cũ.bởi thuaimiVẫn nhớ và kính trọng Bác cũng các cao nhân trên dientuvietnam.net. Tính từ ngày tham gia trên này cũng đã hơn 20 năm rồi. Quá nhiều thay đổi cả trong công việc và cuộc sống. Nhưng được thấy lại các nick cũ vẫn sáng đèn là thấy vui rồi....-
Channel: Tâm tình dân kỹ thuật
26-10-2026, 16:33 -
-
Trả lời cho Tìm bạn thân quen cũ.bởi nhathung1101Còn sống không lão??? Mất một thời gian chữa bệnh nên quên hỏi thăm.......
-
Channel: Tâm tình dân kỹ thuật
25-10-2026, 03:09 -
-
Trả lời cho Công suất truyền qua lõi máy biến ápbởi nhathung1101Thời buổi năng lượng xanh, nhất là xanh cả mặt... Thì Điện mặt giời, điện gió, sẽ lên ngôi.
Nếu không nắm bắt được cái cơ bản đó thì đi làm coder à? Mà coder giờ thất nghiệp cả lũ vì AI rồi!!!









...
-
Channel: Điện tử công suất
25-10-2026, 03:03 -
-
Trả lời cho Công suất truyền qua lõi máy biến ápbởi quangdonguehChà, lâu lắm rồi nhưng diễn đàn vẫn còn những chủ đề cốt lõi của điện tử công suất...-
Channel: Điện tử công suất
24-10-2026, 07:53 -
-
bởi bqvietNếu muốn tăng công suất cần tăng con chip và tăng biến áp lên lớn hơn. Thiết kế ban đầu dùng TNY25x và biến áp EE16 hoặc EE13. Tăng con chip lên TNY268 vẫn mạch nguyên lý đó và biến áp lên EE19 sẽ nâng công suất ra thêm nhiều. Tăng tối đa...-
Channel: Điện tử công suất
24-10-2026, 02:14 -
-
bởi Nexus 6PMạch này chỉ chạy cho LED 10W trở xuống, còn muốn chạy Led công suất cao thì sao bác thớt ơi?-
Channel: Điện tử công suất
22-10-2026, 14:33 -
-
bởi Nexus 6PMạch này chỉ chạy cho LED 10W trở xuống, còn muốn chạy Led công suất cao thì sao bác thớt ơi?-
Channel: Điện tử công suất
22-10-2026, 10:49 -
-
Trả lời cho Tìm VR 5 chânbởi dinhthuong80Cảm ơn bác bqviet . Nhưng hình như các VR 5 chân của linhkienchatluong là loại có 2 chân là công tắc đóng mở. Thấy trên Shopee có chỗ bán linh kiện đàn Organ, mà không biết đúng loại không, với lại sao ... mắc dữ dội luôn ấy!!!
...-
Channel: Hướng dẫn tìm thông tin linh kiện
19-10-2026, 11:30 -
Leave a comment: