thanhphu2304
Blog của Điện tử Minh Nguyên (www.chipn24.com)
Thứ Hai, 29 tháng 11, 2021
Thứ Hai, 22 tháng 11, 2021
Thứ Hai, 30 tháng 12, 2019
Thứ Sáu, 20 tháng 12, 2019
Thứ Tư, 7 tháng 8, 2019
Mạch khuếch đại âm thanh dùng LM386
Mạch khuếch đại âm thanh dùng LM386
Thứ Hai, 10 tháng 6, 2019
Led nháy theo nhạc qua MIC dùng LM3915
Mọi người thử làm mạch này xem, nháy rất chuẩn. Led nháy theo nhạc qua MIC dùng LM3915
Mạch có 2 chế độ nháy, phụ thuộc vào jumper trên mạch
- Nháy điểm
- Nháy cột
Mạch in
Download tại đây
Sơ đồ gắn mạch
Video Youtube
Chúc mọi người thành công!
Thứ Hai, 27 tháng 5, 2019
Chia sẻ - Sử dụng Watchdog cho AVR với codevision (ATmega16)
Vừa mới trầy trật với cái vụ mò mẫm về watchdog này xong .nên làm luôn bài chia sẻ cho những anh em cần dùng đến . Lưu ý đây là chia sẻ cá nhân ,nên viết dựa theo hiểu biết cá nhân, ai thấy đúng sai hay cần bổ sung gì cứ tự nhiên nhá . Bài viết này dành cho những người chưa biết gì về Watchdog
+Định nghĩa : Hiểu nôm na 1 cách dân dã là nếu chúng ta bật chức năng Watchdog này lên thì sẽ có 1 timer chạy ngầm .đến 1 khoảng thời gian đã cài đặt nó sẽ tràn ( hoặc có thể 1 vòng lặp vô hạn nào đó của bạn tạo nên hiện tượng này,hay vdk bị treo vì lý do gì đó ) thì nó sẽ giúp Vi điều khiển tự động reset lại giống như chúng ta nhấn nút reset cứng ở ngoài mạch vậy.
+ Ứng dụng : bạn vẫn chưa hiểu dùng nó để làm gì ??? hãy tưởng tượng chương trình của bạn đang chạy ngon ơ..tự nhiên bị lỗi..treo đứng luôn...chẳng nhẽ cứ chờ mà căn chạy lại nhấn nút reset à..hiện tượng này rất dễ xảy ra khi bạn thiết kế mạch công nghiệp( thường thì chương trình nào chạy công nghiệp cũng hay thấy có Watchdog ,và chẳng thấy cái nút nhấn reset mạch như KIT thực hành của các bạn ở đâu cả ), hoặc đơn giản bạn muốn lâu lâu chương trình lại refresh lại để cập nhật thông tin gì đó..cần các thanh ghi,các biến ,các mảng,giá trị..v..v..trở lại trạng thái ban đầu...thì lúc này watchdog rất hữu dụng đó
+ Khai báo WD với codevision
bảng trên lấy từ datasheet của Atmega16 .ở đây bạn sẽ thấy mức thời gian mà Watchdog(WD) của chúng ta tràn. trên khai báo bạn có thể chọn mức tùy theo ý của bạn.
Ví dụ : ở trên tôi chọn OSC/16k thì code sinh ra sẽ như dưới đây:
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/16k
#pragma optsize-
WDTCR=0x18;
WDTCR=0x08;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
Thanh ghi WDTCR chính là để khai báo bật WD theo giá trị của bản trên hoặc tắt nó cũng bằng cái đó luôn.
+ Sử Dụng :
rồi sau khi khai báo như trên thì trong chương trình của của bạn cứ sau 16.3 ms VDK sẽ tự động reset1 lần
nếu bạn muốn ko cho WD tràn thì hãy dùng câu lệnh #asm("WDR") trong chương trình của mình ( thời gian gọi cái này phải nhỏ hơn thời gian tràn của WD)
1 chú ý nữa nhá.. cái này mình mò mãi mới biết nguyên nhân..nếu bạn dùng hàm delay_ms () trong chương trình thì WD không reset VDK của bạn được vì trong thư viện của codevision ,hàm này đã chứa câu lệnh reset WD làm cho nó ko thể tràn được...vì vậy nếu trong chương trình của bạn muốn delay thì hãy dùng hàm delay_us() hoặc bạn tự viết lấy nhá ^^...
hoặc nếu vẫn muốn delay_ms() bình thường thì bạn có thể dùng câu vòng lặp vô hạn ở bất cứ chỗ nào .thì nó vẫn reset bình thường . VD ở đây :
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/1024k
#pragma optsize-
WDTCR=0x1E;
WDTCR=0x0E;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
n=1;
lcd_clear();
void main (void)
{
while (1)
{
itoa(n,xuat);
lcd_puts(xuat);
PORTC.1=1;
PORTC.2=1;
PORTC.3=1;
delay_ms(100);
while(1);
}
}
tôi đã khai báo cho 3 chân của PORTC có giá trị bằng 1. nếu bạn mắc led vào những chân này thì bình thường led sẽ sáng mãi..nhưng bạn có thấy câu lệnh while(1) của tôi ở dưới ko.. vì nó là vòng lặp vô hạn nên nó cứ chạy mãi ( ko biết có treo ko ^^) nên WD sẽ tràn và reset VDK nên tất cả các chân PORTC ở trên sẽ lại trở lại trạng thái ban đầu bằng 0.. vì thế bạn sẽ nhìn thấy cái led cứ chớp sáng chớp sáng chứ ko sáng hoàn toàn..
trên đây chỉ là ví dụ cho bạn hiểu ,hãy thật cẩn thận với những vòng lặp vô hạn để tránh những lỗi phát sinh không thể ngờ nhé ^^
trên đây là những hướng dẫn cơ bản ,cũng như những ví dụ đơn giản nhất để bạn có thể hiểu phần nào về cách sử dụng Watchdog .Ai có thắc mắc hay bổ sung gì cứ trao đổi tự nhiên nhé..cùng học hỏi để phát triển !
+Định nghĩa : Hiểu nôm na 1 cách dân dã là nếu chúng ta bật chức năng Watchdog này lên thì sẽ có 1 timer chạy ngầm .đến 1 khoảng thời gian đã cài đặt nó sẽ tràn ( hoặc có thể 1 vòng lặp vô hạn nào đó của bạn tạo nên hiện tượng này,hay vdk bị treo vì lý do gì đó ) thì nó sẽ giúp Vi điều khiển tự động reset lại giống như chúng ta nhấn nút reset cứng ở ngoài mạch vậy.
+ Ứng dụng : bạn vẫn chưa hiểu dùng nó để làm gì ??? hãy tưởng tượng chương trình của bạn đang chạy ngon ơ..tự nhiên bị lỗi..treo đứng luôn...chẳng nhẽ cứ chờ mà căn chạy lại nhấn nút reset à..hiện tượng này rất dễ xảy ra khi bạn thiết kế mạch công nghiệp( thường thì chương trình nào chạy công nghiệp cũng hay thấy có Watchdog ,và chẳng thấy cái nút nhấn reset mạch như KIT thực hành của các bạn ở đâu cả ), hoặc đơn giản bạn muốn lâu lâu chương trình lại refresh lại để cập nhật thông tin gì đó..cần các thanh ghi,các biến ,các mảng,giá trị..v..v..trở lại trạng thái ban đầu...thì lúc này watchdog rất hữu dụng đó
+ Khai báo WD với codevision
bảng trên lấy từ datasheet của Atmega16 .ở đây bạn sẽ thấy mức thời gian mà Watchdog(WD) của chúng ta tràn. trên khai báo bạn có thể chọn mức tùy theo ý của bạn.
Ví dụ : ở trên tôi chọn OSC/16k thì code sinh ra sẽ như dưới đây:
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/16k
#pragma optsize-
WDTCR=0x18;
WDTCR=0x08;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
Thanh ghi WDTCR chính là để khai báo bật WD theo giá trị của bản trên hoặc tắt nó cũng bằng cái đó luôn.
+ Sử Dụng :
rồi sau khi khai báo như trên thì trong chương trình của của bạn cứ sau 16.3 ms VDK sẽ tự động reset1 lần
nếu bạn muốn ko cho WD tràn thì hãy dùng câu lệnh #asm("WDR") trong chương trình của mình ( thời gian gọi cái này phải nhỏ hơn thời gian tràn của WD)
1 chú ý nữa nhá.. cái này mình mò mãi mới biết nguyên nhân..nếu bạn dùng hàm delay_ms () trong chương trình thì WD không reset VDK của bạn được vì trong thư viện của codevision ,hàm này đã chứa câu lệnh reset WD làm cho nó ko thể tràn được...vì vậy nếu trong chương trình của bạn muốn delay thì hãy dùng hàm delay_us() hoặc bạn tự viết lấy nhá ^^...
hoặc nếu vẫn muốn delay_ms() bình thường thì bạn có thể dùng câu vòng lặp vô hạn ở bất cứ chỗ nào .thì nó vẫn reset bình thường . VD ở đây :
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/1024k
#pragma optsize-
WDTCR=0x1E;
WDTCR=0x0E;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Global enable interrupts
#asm("sei")
n=1;
lcd_clear();
void main (void)
{
while (1)
{
itoa(n,xuat);
lcd_puts(xuat);
PORTC.1=1;
PORTC.2=1;
PORTC.3=1;
delay_ms(100);
while(1);
}
}
tôi đã khai báo cho 3 chân của PORTC có giá trị bằng 1. nếu bạn mắc led vào những chân này thì bình thường led sẽ sáng mãi..nhưng bạn có thấy câu lệnh while(1) của tôi ở dưới ko.. vì nó là vòng lặp vô hạn nên nó cứ chạy mãi ( ko biết có treo ko ^^) nên WD sẽ tràn và reset VDK nên tất cả các chân PORTC ở trên sẽ lại trở lại trạng thái ban đầu bằng 0.. vì thế bạn sẽ nhìn thấy cái led cứ chớp sáng chớp sáng chứ ko sáng hoàn toàn..
trên đây chỉ là ví dụ cho bạn hiểu ,hãy thật cẩn thận với những vòng lặp vô hạn để tránh những lỗi phát sinh không thể ngờ nhé ^^
trên đây là những hướng dẫn cơ bản ,cũng như những ví dụ đơn giản nhất để bạn có thể hiểu phần nào về cách sử dụng Watchdog .Ai có thắc mắc hay bổ sung gì cứ trao đổi tự nhiên nhé..cùng học hỏi để phát triển !
Chú
ý: OSC/16k mau reset nhất
OSC/2048k, lâu reset nhất
Nguồn: codientu.org
Đăng ký:
Bài đăng (Atom)