Hiển thị các bài đăng có nhãn AVR. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn AVR. Hiển thị tất cả bài đă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 !


Chú ý:    OSC/16k mau reset nhất

OSC/2048k, lâu reset nhất


Nguồn: codientu.org

Thứ Bảy, 23 tháng 6, 2018

ATMEGA16 + DS1307 + LCD + LED 7 DOAN



Chức năng của mạch hiển thị thời gian nhiệt độ trên led 7, thông điệp trên LCD chức năng hẹn giờ , báo chuông . 
Mạch khá thú vị 

Link download: MediaFire

Thứ Sáu, 22 tháng 6, 2018

Hướng dẫn Fuse bit cho chip ATMega8 dùng mạch nạp AVR910, phần mềm AVR Prog

Hôm nay chipn24 - chip24h sẽ hướng dẫn các bạn Fuse bit cho chip ATMega8 dùng mạch nạp AVR910, phần mềm AVR Prog

Chú ý, để AVR Prog nhận ra mạch nạp, thì cổng COM phải nhỏ hơn hoặc bằng 4

Các bước làm như sau:
1) Mở phần mềm AVR Studio
Vào Tool, chọn AVR Prog




2) Chọn chip. Ở đây là ATmega8




3) Bấm Advanced để vào Fuse bit




4) Chip mới mua về thì nhấp Read, để phần mềm đọc cấu hình chip
Nhiều bạn tới bước này ko biết, nhào vô bấm Write, chip lên đường





Chú ý, ko đụng tới 2 cái sau, đụng vào là chip bạn sẽ ra đi vĩnh viễn, ko nạp được nữa
- SPI Enable: bật tắt chức năng nạp ISP của AVR
- Reset Disable: bật tắt chân Reset





4) Mặc định của chip mới mua về là chạy thạch anh nội, tần số 1M
Bây giờ bạn muốn chạy 8M thì sao? chọn như hình





Nếu mạch chạy thạch anh ngoài, thì chọn như hình. 




5) Sau đó bấm Write




Chú ý: Có thể dùng 2 mạch sau để cứu lại chip AVR , nếu vô tình bạn Fuse sai cầu chì
1) Mạch STK500 Full

2) Mạch Reset cầu chì AVR


Chúc các bạn thành công
www.chipn24.com