Sunday, December 20, 2009

AVR Tutorial 1: Оролт гаралт

Энэ бичлэгтээ микроконтроллерийн оролт гаралтыг яаж ашигладаг болохыг товч тайлбарлая. AVR маань 8 битийн архитектуртай тул оролт гаралт болон бусад бүх тохиргоонуудыг 8 битийн регистрүүдээр хийдэг. Иймд микроконтроллерийн хөлийг найм наймаар нь A, B, C гэх мэтээр хувааж тус тусых нь DDR, PIN, PORT регистрүүдээр удирдана. Жишээ нь B -гийн найман хөлийг удирдъя гэвэл DDRB, PINB, PORTB регистрүүдийг ашиглана.

DDR регистрээр микроконтроллерийн хөлийг оролт уу гаралт уу гэдгийг зарладаг. Регистрийн X дэх бит 0 байвал X дүгээр хөл оролт, харин 1 байвал гаралт болно. Жишээ нь доорх код B -ийн 0 дугаар (PB0) хөлийг оролт харин 1 дүгээр (PB1) хөлийг гаралт болгоно.

// PB0 хөл оролт
DDRB &= ~(1 << PB0);
// PB1 хөл гаралт
DDRB |= (1 << PB1);

Хэрвээ хөлөө гаралт гэж тохируулсан бол PORT регистрээр тэр хөлөөрөө тог гаргах уу (битийн утга 1) үгүй юу (битийн утга 0) гэдгээ тохируулдаг. Доорх жишээ код B -ийн 1 дэх (PB1) хөлөөр эхэлж тэжээл гаргаад дараа нь унтрааж байна.

// PB1 хөлөөр тэжээл тараана
PORTB |= (1 << PB1);
// PB1 хөлөөр тог гарахгүй
PORTB &= ~(1 << PB1);

Хэрвээ та хөлөө оролтын хөл гэж зарласан бол PIN регистрээр тухайн хөл дээр тэжээл очсон эсэхийг шалгаж болдог. PIN регистрийн X дэх битийн утга 1 байвал тухайн хөл дээр тог очсон байна харин 0 байвал үгүй гэсэн үг. Доорх код PB0 хөл дээр тэжээл байгаа үгүйг шалгана.

if(PINB & (1 << PB0)) {
// PB0 хөл дээр тог очиж байна
} else {
// PB0 хөл дээр тог очихгүй байна
}

За ингээд өмнөх бичлэгийнхээ үндсэн хэлхээ дээр диод болон товчлуур нэмье. Товчлуур болон гэрэлт диод яаж залгадаг болохыг mncontroller -ын бичлэгүүдээс хараарай. Attiny2313 -ын PB0 хөл дээр товчлуур (энэ хөл оролт) харин PB1 дээр диод (гаралт) залгав.


Одоо товчлуур дээр дарвал диод асдаг харин боливол диод унтардаг болгох программ бичье:

#include "avr/io.h"

int main() {
// PB0 хөл дээр товчлуур залгагдсан -> оролт
DDRB &= ~(1 << PB0);
// PB1 хөл дээр гэрэлт диод залгагдсан -> гаралт
DDRB |= (1 << PB1);

while(1) {
if (PINB & (1 << PB0)) {
// товчлуур дарагдсан байна -> диод асаа
PORTB |= (1 << PB1);
} else {
// товчлуур дарагдаагүй байна -> диод унтраа
PORTB &= ~(1 << PB1);
}
}

return 0;
}

Дээрх программыг WinAVR ашиглаж хөрвүүлээд AVRStudio -оор микроконтроллер уруу хуулав. Үр дүн нь нэг иймэрхүү харагдаж байна. Товчлуур дараагүй байхад:


Товчлуур дарахад диод асаж байгаа байдал:

2 comments:

  1. шууд өөрийнх нь програмын кодыг бичиж болох у? эсвэл заавал (си хэл байх шиг байна?) дээд төвшний хэл дээр бичээд хөрвүүлэх ёстой юм уу?

    Аан бас нэг ?.. Заавал өөрийнх нь програматораар нь програмаа суулгах уу?

    ReplyDelete
  2. shuud ooriih ni programmin code bichne gej yu gesen ug ve? Assembler deer bichehiig helj baival bololgui yahav. Attiny12 geh met SRAM gui tsoohon heden AVR microcontroller uud baidag. Ene hed RAM gui tul C deer kode bichej bolohgui (C helnii stack RAM deer bairladag), zaalavchgui assembler deer bicheh yostoi baidag.

    Microcontroller deeree bootloader suulgatsan bol programchlahiin tuld zaavalchui programmer tai baih hereggui.

    ReplyDelete