Tutorial ATMega8535

From Sistem digital
Jump to: navigation, search

Contents

Port I/O Output

#include <avr/io.h>


int main(){

    DDRC = 0xff;
    PORTC = 0x00;

	while(1){
		PORTC=0x55;
	}	
}

Port I/O input dengan wait loop

#include <avr/io.h>

// software penghitung jumlah pulsa di PORTC.0

int main(){
	char counter=0;
	
    DDRC = 0x00;	// semua pin sebagai input
	DDRA = 0xff;	// port A sebagai output
    PORTC = 0xff;	// pull up
	counter=0;

	while(1){
	// tunggu sampai PORTC.0 menjadi 0
		while((PINC & 1) !=0){}
		counter++;	// naikkan angka counter
		PORTA=counter;
	// tunggu sampai PORTC.0 menjadi 1
		while((PINC & 1) ==0){}

	}	
}

Port I/O Input dengan sampling

#include <avr/io.h>

// software penghitung jumlah pulsa di PORTC.0

int main(){
	char counter=0;
	
    DDRC = 0x00;	// semua pin sebagai input
	DDRA = 0xff;	// port A sebagai output
    PORTC = 0xff;	// pull up
	counter=0;


	while(1){
		char sampel;
		static unsigned char sampel_sebelumnya=0x00;
		
		// ambil sampel
		sampel=PINC;	
		
		// cek apakah ada transisi 1 ke 0
		if((sampel&0x01)==0 && (sampel_sebelumnya&0x01)!=0){
			counter++;
			PORTA=counter;
		}

		// simpan isi sampel sekarang untuk putaran berikutnya
		sampel_sebelumnya=sampel;
	}	
}

// cara yang kurang tepat, tidak menggunakan sampling
// kelemahan: nilai PORTC dapat berubah di antara kedua pemakaian register tersebut
int main_kurang_tepat(){
char counter=0;
	
    DDRC = 0x00;	// semua pin sebagai input
	DDRA = 0xff;	// port A sebagai output
    PORTC = 0xff;	// pull up
	counter=0;

	while(1){		
		static char sampel_sebelumnya=0xff;						
		
		// cek apakah ada transisi 1 ke 0
		if((PORTC&0x01)==0 && (sampel_sebelumnya&0x01)!=0){
			counter++;
		}

		// simpan isi sampel sekarang untuk putaran berikutnya
		sampel_sebelumnya=PORTC;
	}	
}
// dalam sistem sesungguhnya, proses sampling dapat dilakukan dengan timer sehingga periodanya konstan

Input dengan external interrupt 0

#include <avr/io.h>
#include <avr/interrupt.h>

// menghitung pulsa dengan menggunakan interupsi external 0

int counter=0;
volatile int counterjuga=0;

// interrupt external0 = pin PD2
ISR(INT0_vect){
	counter++; 
	PORTC=counter;
}



int main(){
	
	PORTD=0x00; // port D sebagai input
	DDRB=0x00;
	DDRC=0xff;	// port C sebagai output

//CUCR=0x02;
	//CR!=0x40;
	//UCSR=0x00;
	//FR=0x40;

	GICR!=0x40;
	MCUCR=0x02;
	MCUCSR=0x00;
	GIFR=0x40;

	GICR|=0x40;
	MCUCR=0x02;
	MCUCSR=0x00;
	GIFR=0x40;	// aneh, di AVRStudio 4 inisialisasi musti 2x, baru bisa jalan interupsinya

	sei();					// global interrupt enable

	while(1){
		counterjuga++;		
	}	
}

Timer 1 Interrupt

#include <avr/io.h>
#include <avr/interrupt.h>

int counter=0;
volatile int counterjuga=0;

ISR(TIMER0_COMP_vect){
	counter++; 
	PORTC=counter;
}

int main(){
	
	PORTD=0x00; // port D sebagai input
	DDRB=0x00;
	DDRC=0xff;	// port C sebagai output

	TCCR0=0x0D;
	TCNT0=0x00;
	OCR0=0x88;
	TIMSK=0x02;	// aktifkan interupsi
	sei();					// global interrupt enable

	while(1){
		counterjuga++;		
	}	
}

Port Serial

Contoh software:

#include <avr/io.h>

int main(){
	unsigned char data=0;
    DDRC = 0xff;
    PORTC = 0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
	UCSRA=0x00;
	UCSRB=0x18;
	UCSRC=0x86;
	UBRRH=0x00;
	UBRRL=0x67;

	while(1){
		loop_until_bit_is_set(UCSRA,UDRE);
		UDR=data;
		data++;
	}	
}

Jam Digital

#include <avr/io.h>
#include <avr/interrupt.h>

// menghitung pulsa dengan menggunakan interupsi external 0

void Paint_Init();

int counter=0;
volatile int counterjuga=0;

// interrupt external0 = pin PD2
ISR(TIMER0_COMP_vect){
	counter++; 
	PORTC=counter;
}

unsigned char detik=0;
unsigned char menit=0;
unsigned char jam=0;

// 500 Hz interrupt
ISR(TIMER1_COMPA_vect){	
	unsigned char angka;
    static int counter=0;
    static unsigned char posisi=0;
       
	counter++;
	if(counter>=500){
		counter=0;
		detik++;
		if(detik>=60){
			detik=0;
			menit++;
		}
		if(menit>=60){
			menit=0;
			jam++;
		}
		if(jam>=24){
			jam=0;
		}
	}    

    posisi++;
    if(posisi>=8){
	   posisi=0;
	}
    angka=0xff;

	if(posisi==5)
		angka=detik%10;
	if(posisi==4)
		angka=detik/10;
	if(posisi==3)
		angka=menit%10;
	if(posisi==2)
		angka=menit/10;
	if(posisi==1)
		angka=jam%10;
	if(posisi==0)
		angka=jam/10;

    PaintLED7Sement(posisi, angka);   
	return;	
}

unsigned char paint_table[10];

int main(){
	
	PORTD=0x00; // port D sebagai input
	DDRB=0x00;
	DDRC=0xff;	// port C sebagai output
 	DDRA=0xff;	// port A sebagai output

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 62.500 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
	TCCR1A=0x00;
	TCCR1B=0x0C;
	TCNT1H=0x00;
	TCNT1L=0x00;
	ICR1H=0x00;
	ICR1L=0x00;
	OCR1AH=0x00;
	OCR1AL=0x7c;
	OCR1BH=0x00;
	OCR1BL=0x00;

	TIMSK=0x10;

	sei();					// global interrupt enable
	
	Paint_Init();
	while(1){
		counterjuga++;		
	}	
}

#define BIT_DOT 1<<1
#define BIT_A (1<<4)
#define BIT_B 1<<3
#define BIT_C 1<<2
#define BIT_D 1<<6
#define BIT_E 1<<7
#define BIT_F 1<<5
#define BIT_G 1<<0

// tampilkan angka tertentu pada posisi tertentu

void PaintLED7Sement(unsigned char posisi, unsigned char angka) {
    unsigned char kode;
    
    
    if(angka>=0 && angka<=9)
        kode = paint_table[angka];
    else
        kode=0xff; //matikan semua LED
// matikan dulu semua
    PORTC = 0xff; // active low , matikan semua row
    PORTA = kode;
    //    printf("kode %d\r\n", (int) kode);

    PORTC = ~(1 << posisi); // aktifkan row tertentu
//   printf("posisi %x\r\n", (int)posisi);
}

void Paint_Init() {
    int i;
    //printf("Paint init start\r\n");

    paint_table[0] = ~(BIT_A | BIT_B | BIT_C | BIT_D | BIT_E | BIT_F);
    paint_table[1] = ~(BIT_B | BIT_C);
    paint_table[2] = ~(BIT_A | BIT_B | BIT_D | BIT_E | BIT_G);
    paint_table[3] = ~(BIT_A | BIT_B | BIT_C | BIT_D | BIT_G);
    paint_table[4] = ~(BIT_B | BIT_C | BIT_F | BIT_G);
    paint_table[5] = ~(BIT_A | BIT_C | BIT_D | BIT_F | BIT_G);
    paint_table[6] = ~(BIT_A | BIT_C | BIT_D | BIT_E | BIT_F | BIT_G);
    paint_table[7] = ~(BIT_A | BIT_B | BIT_C);

    paint_table[8] = ~(BIT_A | BIT_B | BIT_C | BIT_D | BIT_E | BIT_F | BIT_G);
    paint_table[9] = ~(BIT_A | BIT_B | BIT_C | BIT_D | BIT_F | BIT_G);
    for (i = 0; i < 10; i++) {
//        printf("tabel %d\r\n", paint_table[i]);
    }                       
    //printf("Paint init end\r\n");
}

Keypad di PORT B

#include <avr/io.h>
#include <stdio.h>
#include <string.h>

void usart_kirim_string(char *string){
	int len;
	int i;
	len=strlen(string);
	for(i=0;i<len;i++){
		loop_until_bit_is_set(UCSRA,UDRE);
		UDR=string[i];
	}
}

void keypad_delay(){
volatile	int i;

	for(i=0;i<100;i++){

	}
}

int keypad_scan(){
	char buffer[100];
	unsigned char scan;
	// scan yg pertama
	// pin input pulled up, pin output 1 saja yang dibikin low
	if(1){
	PORTB=~(1<<7) & 0xff;
	keypad_delay();
	scan=PINB;	
	if(scan!=PORTB){	// artinya ada tombol yang ditekan
		sprintf(buffer,"test1 %x %x\r\n",(int)PORTB,(int)scan);
		usart_kirim_string(buffer);
	}
	}
	PORTB=~(1<<6) & 0xff;
	keypad_delay();
	scan=PINB;	
	if(scan!=PORTB){	// artinya ada tombol yang ditekan
		sprintf(buffer,"test2 %x %x\r\n",(int)PORTB,(int)scan);
		usart_kirim_string(buffer);
	}
	

	PORTB=~(1<<5) & 0xff;
	keypad_delay();
	scan=PINB;	
	if(scan!=PORTB){	// artinya ada tombol yang ditekan
		sprintf(buffer,"test3 %x %x\r\n",(int)PORTB,(int)scan);
		usart_kirim_string(buffer);
	}

	PORTB=~(1<<4) & 0xff;
	keypad_delay();
	scan=PINB;	
	if(scan!=PORTB){	// artinya ada tombol yang ditekan
		sprintf(buffer,"test4 %x %x\r\n",(int)PORTB,(int)scan);
		usart_kirim_string(buffer);
	}
	return scan;
}

int main(){
	unsigned int data=0;
    DDRC = 0xff;
    PORTC = 0x00;

	DDRB=0xf0;	// high nibble sebagai output

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
	UCSRA=0x00;
	UCSRB=0x18;
	UCSRC=0x86;
	UBRRH=0x00;
	UBRRL=0x67;

	usart_kirim_string("hallo\r\n");
	while(1){
		int hasil;
		char buffer[100];
//		loop_until_bit_is_set(UCSRA,UDRE);
//		UDR=data;
		data++;
		hasil=keypad_scan();
	//	sprintf(buffer,"angka data %x\r\n",hasil);
		
	}	
}

Referensi

  • Tutorial USART di AVRfreaks [1]
  • Tutorial USART dengan interrupt di AVRfreaks [2]


Personal tools