#include <iom16v.h>
#include "g_define.h"
// setup interrupt Vector
#pragma interrupt_handler layanan_timer0_ovf:10
#pragma interrupt_handler layanan_uart_rxd:12
#define ID_KITA 200
/* Tanggal : 3 Agustus 2011
* Implementasi ADC
* - Kirim data hasil akuisisi ke saluran komunikasi UART
* - Akuisisi dan pengiriman di lakukan tiap detik
* - PORT ADC yang dipakai adalah Channel - 1 (pin 39)
*/
//prototype fungsi
void layanan_timer0_ovf(void);
void layanan_uart_rxd(void);
void inisialisasi(void);
void serial_kirim(unsigned char data);
unsigned char hitung_checksum(void);
unsigned int akuisisi_adc(unsigned char ch);
void konversi_2_Volt(unsigned int x);
unsigned char counter_led;
unsigned char buffer_serial[32];
unsigned char index_buffer;
unsigned char ada_frame;
unsigned char counter_idle;
unsigned char lakukan_eksekusi;
unsigned char counter_10ms;
//------------------------------------------------------------------------------
void layanan_timer0_ovf(void)
{
unsigned int hasil_konversi;
TCNT0=184; // 10ms, n = 256 - [(clock * time)/(prescaler)]
if(counter_idle>0)counter_idle--;
else{
ada_frame =0;
}
if(counter_10ms<99)counter_10ms++;
else {
counter_10ms = 0;
hasil_konversi = akuisisi_adc(0x41);//pakai VRef = AVCC=5v, Channel = 1
serial_kirim(hasil_konversi/256);
serial_kirim(hasil_konversi%256);
serial_kirim('=');
konversi_2_Volt(hasil_konversi);
}
}
//---------------------------------
void layanan_uart_rxd(void)
{
unsigned char temp;
unsigned char x;
temp=UDR;
counter_idle = 5;
//check apakah start byte sebelumnya apakah sudah menerima frame
if(ada_frame==0)
{
if(temp==0xfe){
//kosongkan buffer
index_buffer=0;
ada_frame=1;
}
}
else{
buffer_serial[index_buffer]=temp;
if(index_buffer<32)index_buffer++;
//apakah isi buffernya sejumlah N (buffer_serial[0])
if(index_buffer==buffer_serial[0]){
//hitung checksum
x = hitung_checksum();
if(x==TRUE){
//lakukan eksekusi dari frame yang diterima
lakukan_eksekusi = TRUE;
}
}
}
}
//------------------------------------------------------------------------------
void inisialisasi(void)
{
unsigned int Y;
DDRA = 0xA0;
DDRB = 0x00;
DDRC = 0x94;
DDRD = 0x00;
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
// Setup/meng-enable-kan timer-0 overflow
// timer0 setup overflow untuk 10ms
TCCR0=0x05; //timer prescalar = 1024
TCNT0=184; //n = 256 - [(Clock * time)/Prescaler]
TIMSK|=BIT(TOIE0); //enable timer0 overflow interrupts
// Setup/meng-enable-kan UART
// Konfigurasi 9600bps,Data 8bit,Parity None,Stop bit 1 (96008N1)
/*enable UART receiver and transmitter */
Y=47;
UBRRHI = Y/256;
UBRRL = Y%256;
UCSRA &= ~BIT(U2X);
UCSRB = BIT(RXEN) | BIT(TXEN) | BIT(RXCIE); // receive pake interrupt
UCSRC = BIT(URSEL) | BIT(UCSZ1) | BIT(UCSZ0);
// setting pull-up di on-kan (enabled)
SFIOR &= ~BIT(PUD); //pull-up enabled
// Setting PD7 sebagai Output, PORT D yang lainnya sebagai input
DDRD = 0x80;
// Meng-enable-kan Interrupt
SREG = 0x80;
}
//----------------------------------------
void serial_kirim(unsigned char data)
{
while (!(UCSRA & (1<<UDRE))); //wait until byte send
UDR = data; // start transmittion
}
unsigned char hitung_checksum(void)
{
unsigned char i;
unsigned char y;
unsigned char chk_terkirim;
unsigned char hasil;
y=0;
for(i=0; i<buffer_serial[0]-1; i++){
y = y + buffer_serial[i];
}
//cek apakah ceksum yang terkirim sesuai dengan hasil hitungan
chk_terkirim = buffer_serial[buffer_serial[0]-1];
if(y==buffer_serial[0]){
hasil = TRUE;
}
else{
hasil = FALSE;
}
return hasil;
}
void eksekusi_perintah(void)
{
if(lakukan_eksekusi==TRUE){
lakukan_eksekusi==FALSE;
//cek apakah frame itu sesuai dengan ID kita
if(buffer_serial[1]==ID_KITA){
//cek perintah yang diinginkan
switch(buffer_serial[3]){
case 0x01:
if(buffer_serial[4]==1){
PORTA = buffer_serial[5];
}
if(buffer_serial[4]==2){
PORTB = buffer_serial[5];
}
if(buffer_serial[4]==3){
PORTC = buffer_serial[5];
}
if(buffer_serial[4]==4){
PORTD = buffer_serial[5];
}
break;
case 0x02:
break;
case 0x0A:
break;
}
}
}
}
//==============================================================================
unsigned int akuisisi_adc(unsigned char ch)
{
unsigned int hasil;
hasil = 0;
ADCSRA = 0x86;
ADMUX = ch;
ADCSRA |= BIT(ADSC);
while (ADCSRA&(1<<ADSC)){};
hasil = ADCL;
hasil += (ADCH*256);
ADCSRA = 0x00;
return hasil;
}
//==============================================================================
void konversi_2_Volt(unsigned int x)
{
float fVolt;
unsigned int z, desimal;
unsigned char y;
fVolt = 0.0048828125 * x;
fVolt = 1000*fVolt; //jadi miliVolt
desimal = (unsigned int) fVolt;
y = desimal/10000; //puluh ribuan
y = y + 48;
serial_kirim(y);
z = desimal%10000; //ribuan
y = z/1000;
serial_kirim(y+48);
z = z%1000; //ratusan
y = z/100;
serial_kirim(y+48);
z = z%100; //puluhan
y = z/10;
serial_kirim(y+48);
z = z%10; //satuan
serial_kirim(y+48);
serial_kirim(13);
}
//---------------------------------
void main(void)
{
inisialisasi();
while(1){
eksekusi_perintah();
}
}
ADC.zip_atmega16 adc_色系ADChere
版权申诉
58 浏览量
2022-09-14
19:16:58
上传
评论
收藏 89KB ZIP 举报
周楷雯
- 粉丝: 80
- 资源: 1万+
最新资源
- 基于Vue的电商购物网站设计源码
- 基于Java的elasticsearch视频教程配套Maven工程eshelloword设计源码
- 基于Typescript的兔子饭店经营类游戏源码设计免费送cocoscreator
- 基于Java的web快速开发数据权限管理脚手架wonder-server设计源码
- 基于Apache Log4cxx的C++日志库设计源码
- 基于Vue3的likeadmin免费任意商用管理后台设计源码
- 基于JavaScript的Chrome扩展WeNote分享插件设计源码
- 基于C++的中泰EM9108S动态库开发示例源码
- gxlx2-p291-1g.dts和gxlx2-p291-1g.dtb
- STM32WBxx Keil芯片包
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈