You are on page 1of 6

// muat pustaka yang diperlukan #include <mega16.h> #include <stdio.h> #include <delay.h> #include <ctype.h> #include <stdlib.

h> #include <float.h> // definisi macro #define loop for(;;) // Definisi konstanta // maksimum pencuplikan #define MAX_N 512 // mulai pencuplikan #define START 10 // Deklarasi fungsi-fungsi yang akan dipakai void setupTimer(); void setupComm(); void setupADC(); unsigned char readADC(); void writeDAC(unsigned char); void commTx(); unsigned char commRx(); void acquisition(); // Deklarasi variabel global volatile unsigned int _ts = 100; // waktu cacah, dalam mili detik volatile unsigned int _ns = 1024; // banyak data, 0 - MAX_N volatile unsigned int _nb = 0; // banyak data di buffer volatile unsigned char _buffer[MAX_N]; // buffer untuk tampung data volatile unsigned char _sp = 50; // set point volatile unsigned char state; volatile unsigned char sp; volatile unsigned int j; volatile unsigned int i; // Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { TCNT1H = 0x00; //reset counter timer TCNT1L = 0x00; i++; if (i<_ts){ } else if (i==_ts){ if (state == 1){ writeDAC(sp++); } else if (state == 2){ writeDAC(_sp); j++; } else if (state == 3){

writeDAC(sp--); } i=0; // reset nilai i _buffer[_nb++] = readADC(); } } // program utama void main(void) { char cmd; // inisialisasi awal setupComm(); setupADC(); setupTimer(); // loop selamanya for(;;) { // baca serial cmd=commRx(); // kalau command=N langsung akuisisi data if ( cmd == 'N') { acquisition(); commTx(); } } } // proses menerima perintah dari komunikasi, dalam format // T=9999 // N=9999 // Jika T: mengubah variabel global _ts // Jika N: mengubah variabel global _ns // return kode T atau N // oh ya, ini tanpa checking. // kalau data dari PC salah, misal N>512, bisa hung ! unsigned char commRx() { char line[16]; char cmd; int data; // baca 1 baris gets(line,15); sscanf(line, "%c=%d", &cmd, &data); switch(cmd) { case 'T' : _ts = data; break; case 'N' : _ns = data; break; case 'S' : _sp = data; break; } return cmd; } // // // // // // // proses mengirim data hasil sampling, dalam format T=9999 i, PV, SV 0, 123, 100 1, 123, 100 ..... S=9999

// S diakhir sebagai penutup dan error checking void commTx() { unsigned int sv; unsigned long sum = 0; i=0; printf("T=, %d\n", _ts); printf("i, PV, SV\n", _ts); for (i=0; i<_nb; i++) { // hitung kembali SV sv = (i>=START ? _sp: 0); printf("%d, %d, %d\n", i, _buffer[i], sv); sum=sum+_buffer[i]; } printf("S=, %d\n", sum); } // proses akuisisi data // banyak data _ns, waktu sampling _ts // disimpan ke _buffer, dengan jumlah yang sudah dicacah _nb void acquisition() { int penipu; i=0; penipu = 0; // baca dulu beberapa kali untuk pemanasan for (i=0; i<3; i++) { readADC(); delay_us(1000); } // reset jumlah pencuplikan _nb=0; i=0; TCNT1H = 0x00; TCNT1L = 0x00; #asm("sei"); //reset counter timer

//aktifkan INTERRUPT

// cuplik START kali di awal while (_nb<START) { } // buat fungsi ramp naik, sambil cuplik sp = 0; while((sp < _sp) && (_nb < _ns) && (penipu==0)){ state = 1; } // biarkan datar sesaat j=0; penipu = 1; while ((j <= START) && (_nb < _ns)) { state = 2;

} // buat fungsi ramp turun, sambil cuplik while((sp > 0) && (_nb < _ns) && (penipu == 1)){ state = 3; } penipu = 0; #asm("cli"); // matikan lagi motornya writeDAC(0); } //menulis dac 8 bit void writeDAC(unsigned char data) { PORTC = data; } // membaca ADC 8 bit, metode pooling unsigned char readADC() { // trigger unsigned char temp0; PORTD.4 = 0; delay_us(3); PORTD.4 = 1; // tunggu sampai selesai while (PORTD.2 != 0); // baca PORTD.3 = 0; delay_us(3); temp0 = PINB; PORTD.3 = 1; return(temp0); } // inisialisasi Timer // void setupTimer() { // Timer/Counter 0 setup // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 setup // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00;

TCCR1B=0x0B; //Prescaler = 64 TCNT1H=0x00; // Nilai awal hitungan TCNT1L=0x00; OCR1AH=0x00; // (1ms = 125 --> 0000000001111101, 0x00, 0x7d; 10ms = 1250 --> 0000010011100010, 0x40, 0xe2) OCR1AL=0x7D; // (100ms = 12500 --> 0011000011010100, 0x30, 0xd4) OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 setup // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) setup TIMSK=0x10; } // inisialisasi USART untuk komunikasi void setupComm() { // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 19200 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; } // Inisialisasi ADC void setupADC() { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0xFF; PORTD=0x00; DDRD=0xFB;

// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; SFIOR=0x00; }

You might also like