Professional Documents
Culture Documents
Program To SPI
Program To SPI
h> #define MOSI PB5 void SPI_init(); unsigned char SPI_RX(void); int main() { DDRD=0xFF; PORTD=0x00; SPI_init(); while(1) { PORTD=SPI_RX(); POTRD } } void SPI_init() initialization { DDRB=(1<<MOSI); pin, rest as input SPCR=(1<<SPE); } unsigned char SPI_RX() { while(!(SPSR &(1<<SPIF))); high return SPDR; } //SPI // set MOSI as output // Enable SPI
Mampu membuat program yaang meggunakan SPI (Serial Peripheral Interface) pada AVR ATMEGA8535 untuk membaca / memprogram mikrokontroler AVR ATTINY2313.
B. Bahan Praktikum
Kit latih development board AVR ATMEGA8535 o Mikrokontroler AVR ATTINY2313 ( SPI ) o Resistor 4,7 Kohm ( pull up) o Project Board o Kabel Penghubung
C. Praktikum
___________________________________________________________________________ _____ #include <mega8535.h> #include <stdio.h> #include <delay.h> unsigned char SPI(unsigned char data){ SPDR = data; while(SPSR.7==0); //Mengirimkan sebuah data ke komunikasi SPI //Menunggu flag SPIF (Pengiriman data selesai)
return(SPDR); }
flash unsigned char string[]={Signature Byte %u: %X H}; void main(void){ unsigned char data; PORTB = 000; DDRB = 0xB0; //inisialisasi SPI //Tipe SPI : Master //SPI Clock Rate : 31,250 kHz(XTAL/128) //SPI Clock Phase: Cycle Half //SPI Data Order : MSB First SPCR = 053; SPSR = 000; //Inisialisasi USART //Format frame : 8 Data, 1 Stop , No Parity //USART Transmitter : On (enable) //USART Mode : Asynchronous // USART Baud Rate: 9600 UCSRA=000; UCSRB=0xD8; UCSRC=086; UBRRH=000; UBRRL=047; PORTB.4=1; //Untuk kristal 11.05920 Mhz //set RESET //SCK, MOSI, SS = 0 //PB7(SCK), PB5(MOSI), dan PB4(SS) sebagai output
//Enable serial programming while RESET is low SPI(0xAC); SPI(053); SPI(000); SPI(000); while(1){ delay_ms(60); //Read Signature byte 00H SPI(030); SPI(000); SPI(000); data = SPI(0); printf(string,0,data); putchar(0x0D); putchar(0x0A); delay_ms(60); //Read Signature byte 01H SPI(030); SPI(000); SPI(001); data = SPI(0); printf(string,1,data); //Kirim ENTER pada terminal untuk baris baru //Instruction Byte 1 //Instruction Byte 2 //Instruction Byte 3 //Read Byte 4 //Instruction Byte 1 //Instruction Byte 2 //INstruction Byte 3 //Instruction Byte 4
//Read Signature byte 02H SPI(030); SPI(000); SPI(002); data = SPI(0); printf(string,2,data); putchar(0x0D); putchar(0x0A); } } ___________________________________________________________________________ _____
//Kirim ENTER pada terminal untuk baris baru //Read Signature byte 02H
Program untuk menulis suatu data ke memori program mikrokontroler AVR ATTINY2313.
___________________________________________________________________________ _____ #include <mega8535.h> #include <spi.h> #include <stdio.h> #include <delay.h> void chip_reset_and_program_enable(void){ PORTB.4=1; delay_ms(20); PORTB.4=0; //SET RESET //tunggu 20 ms //clear reset
//enable serial programming while reset is low spi(0xAC); spi(053); spi(000); spi(000); } flash unsigned char string[]={ Data pada Flash alamat 000H %p byte : %X H}; flash unsigned char hi[]={high}; flash unsigned char lo[]={low}; void main(void){ unsigned char data; PORTB=000; DDRB=0xB0; SPCR = 053; SPSR = 000; // USART Baud Rate: 9600 UCSRA=000; UCSRB=0xD8; UCSRC=086; UBRRH=000; UBRRL=047; //Untuk kristal 11.05920 Mhz //SCK , MOSI , SS = 0 //PB7(SCK),PB5(MOSI), dan PB4(SS) sebagai output //instruction byte 1 //instruction byte 2 //instruction byte 3 //instruction byte 4
spi(000); spi(000); delay_ms(4); /*sesudah perintah chip erase diperlukan reset dan programming enable , untuk lebih jelasnya dapat dilihat pada datasheet cara memprogram mikrokontroler*/ //AVR ATTiNY2313 secara serial (Serial Downloading SPI) chip_reset_and_program_enable(); //Load Program Memory(Flash) : Low byte //data yang ditulis AAH pada alamat 000H spi(040); spi(000); spi(000); spi(0xAA); //instruction Byte 2 (alamat) //instruction Byte 3 (alamat) //instruction Byte 4 (Data = AAH)
//Load Program Memory(Flash) : High byte //data yang ditulis 33H pada alamat 000H spi(048); spi(000); spi(000); spi(033); //instruction Byte 2 (alamat) //instruction Byte 3 (alamat) //instruction Byte 4 Data = 33H)
//Write Program Memory(Flash) spi(0x4C); spi(000); spi(000); spi(000); delay_ms(5); while(1){ //instruction Byte 2 (alamat) //instruction Byte 3(alamat) //instruction Byte 4
delay_ms(60); /*read Program Memory(flash) : High Byte Data yang dibaca pada alamat 000H*/ spi(028); spi(000); //instruction Byte 2 (alamat) spi(000); //instruction Byte 3 (alamat) data=spi(0); //instruction Byte 4 (Baca Data) printf(string,hi,data); putchar(0x0D); putchar(0x0A); delay_ms(60); //read program memory(flash): low byte data yang dibaca pada alamat 000H spi(020); //instruction Byte 2 (alamat) spi(000); //instruction Byte 3 (alamat) spi(000); //instruction Byte 4 (Baca Data) data=spi(0); printf(string,lo,data); putchar(0x0D); putchar(0x0A); } }