Tiếp tục sau bài LED và các ví dụ với Energia thì mình giới thiệu với các bạn các ví dụ về lập trình ADC và Serial với TIVA C dùng Energia.

Mình lại tiếp tục đăng lại hình sơ đồ chân của TIVA dùng trong Energia

Đọc giá trị điện áp

Có một điểm lưu ý ở TIVA là độ phân giải của ADC là 12 bit hơn hẳn so với 10 bit của Arduino, đo đó cho chúng ta có thể đọc được giá trị chính xác hơn, trong ví dụ dưới thì chỉ vài dòng lệnh là ta đã có thể đọc được ADC giá trị điện áp một cách nhanh chóng.

Ví dụ sử dụng biến trở kết nối với chân A3 (chân số 18 của TIVA)

//Chuong trinh doc gia tri dien ap cua bien tro
void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop()
{
  // put your main code here, to run repeatedly:
  int sensorValue = analogRead(A3);
  //Chuyen gia tri tuong tu(0-4096 tuong ung voi dien ap la 0-3.3V)
  float voltage = sensorValue * (3.3/4096.0);
  //Xuat gia tri doc duoc len man hinh
  Serial.println(voltage);
}

Đọc biến trở điều khiển độ sáng LED

Sau khi đã đọc được giá trị ADC từ biến trở thì ta thử sử dụng các giá trị này để lập trình điều khiển LED xem sao

Ở ví dụ này chuyển sang dùng chân A0(chân 29) và LED xanh chân 40

//Chuong trinh ket hop doc bien tro dieu khien chop tat LED
//Khai bao bien
const int analogInPin = A0;
const int analogOutPin = 40;  //Blue LED
int sensorValue = 0;
int outputValue = 0;

void setup()
{
  // put your setup code here, to run once:
  //Cau hinh uart hien thi du lieu
  Serial.begin(9600);
}

void loop()
{
  // put your main code here, to run repeatedly:
  //Doc gia tri bien tro
  sensorValue = analogRead(analogInPin);
  //Map gia tri nay voi nguong cua gia tri analog out
  outputValue = map(sensorValue,0 , 4096,0,255);
  //Thay doi gia tri cua analog out
  analogWrite(analogOutPin, outputValue);
  
  //In cac gia tri len may tinh
  Serial.print("sensor = ");
  Serial.print(sensorValue);
  Serial.print("\t output = ");
  Serial.print(outputValue);
  Serial.print("\n");
  //Doi 10ms cho den vong lap tiep theo
  delay(10);
}

In bảng mã ASCII

Tiếp tục với giao tiếp máy tính bằng cách in bảng mã ASCII ra màn hình máy tính thông qua terminal có sẵn từ Energia với tốc độ baud là 9600

/*
  ASCII table
  Prints out byte values in all possible formats: 
  * as raw binary values
  * as ASCII-encoded decimal, hex, octal, and binary values
  For more on ASCII, see http://www.asciitable.com and http://en.wikipedia.org/wiki/ASCII
  created 2006
  by Nicholas Zambetti 
  modified 9 Apr 2012
  by Tom Igoe
  modified 25 April 2013
  by Sean Alvarado
---------------------------------------------------
  Yêu cầu phần cứng:
  * TIVA LaunchPad
  
  This example code is in the public domain.
*/
void setup() { 
  //Mở cổng COM để giao tiếp với tốc độ baud 9600
  Serial.begin(9600); 

  // In tiêu đề
  Serial.println("ASCII Table ~ Character Map"); 
} 

// Kí tự đầu tiên trong bảng mã ASCII '!' tương ứng với 33:
int thisByte = 33; 
// Bạn có thể khai báo cách khác như
// int thisByte = '!'; 

void loop() { 
  // Bắt đầu in giá trị

  Serial.write(thisByte); 

  Serial.print(", dec: "); 
  // In giá trị dưới dạng số thập phân đây là định dạng mặc định khi dùng
  // Serial.print() và Serial.println(),
  Serial.print(thisByte); 
  //Dòng lệnh bên dưới sẽ tương ứng là cách khác để in số thập phân
  // Serial.print(thisByte, DEC); 


  Serial.print(", hex: "); 
  // In giá trị dưới dạng số thập lục phân
  Serial.print(thisByte, HEX); 

  Serial.print(", oct: "); 
  // In giá trị dưới dạng số bát phân
  Serial.print(thisByte, OCT); 

  Serial.print(", bin: "); 
  // In giá trị dưới dạng hệ số nhị phân
  Serial.println(thisByte, BIN); 

  // Nếu giá trị cuối cùng là  '~' hoặc 126 thì dừng lại: 
  if(thisByte == 126) { // bạn có thể sử dụng cách khác là (thisByte == '~') {
  // Vòng lặp vô tận không làm gì cả
  while(true) { 
    continue; 
  } 
 } 
 // In tiếp các kí tự tiếp theo
 thisByte++; 
}

Sự kiện với Serial

Sau khi đã in đươc giá trị lên máy tính thông qua terminal thì thử lập trình sự kiện với Serial, ở đây có thể xem như là ngắt UART, cứ có dữ liệu tới thông qua chân RX thì sẽ lưu giá trị lại

Trong ví dụ này sẽ thực hiện bắt dòng chữ mình gõ trên terminal, bạn có thể thấy khi mình gõ chữ Hello và ấn enter sẽ hiện ra ngay dòng chữ ở bên dưới.

Lưu ý là chọn newline ngay bên cạnh tốc độ baud 9600 nhé.

/*
  Ví dụ về Serial Event
  Khi có dữ liệu tới thì thêm dữ liệu vào chuỗi và khi 
  nhận được dấu xuống dòng '\n' (newline) thì sẽ in ra chuỗi 
  và dừng quá trình nhận đồng thời xóa chuỗi.
  Chương trình này có thể được sử dụng để nhận tín hiệu GPS
  Created 9 May 2011
  by Tom Igoe
  Modified 24 April 2013
  by Sean Alvarado
-----------------------------------------
  Hardware Required:
  * TIVA LaunchPad
  Lưu ý:
  Chọn trong terminal hiển thị của Energia là newline
  
  This example code is in the public domain.
*/

String inputString = ""; // Khai báo chuỗi lưu các data nhận được
boolean stringComplete = false; // biến thông báo nhận chuỗi thành công

void setup() {
  // Thiết lập cổng COM giao tiếp tốc độ baud 9600
  Serial.begin(9600);
  // khai báo 200 byte cho inputString:
  inputString.reserve(200);
}

void loop() {
  // In chuỗi khi có một dòng mới
  if (stringComplete) {
    Serial.println(inputString); 
    // Xóa chuỗi:
    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent xảy ra khi có dữ liệu trên RX. Chương trình này
  chạy mỗi khi có loop(), do đó nếu sử dụng delay trong hàm loop
  sẽ tăng thời gian nhận phản hồi.
*/
void serialEvent() {
  while (Serial.available()) {
    // Nhận byte mới:
    char inChar = (char)Serial.read(); 
    // thêm byte này vào inputString:
    inputString += inChar;
    // Nếu có kí tự mới là newline, set cờ
    if (inChar == '\n') {
    stringComplete = true;
    } 
  }
}

Bạn có thể thay đổi tốc độ baud 9600 thành 115200 hoặc các tốc độ khác qua dòng lệnh Serial.begin(x); với x là tốc độ baud

Tạm kết

Thế là mình đã giới thiệu xong 2 bài ADC và giao tiếp với máy tính, các bạn có thể thấy là nếu lập trình giống Arduino thì rất đơn giản và không phải mất thời gian để cấu hình nhiều như cách lập trình thông thường.