Bagi yang suka bermain uC, mungkin sering menjumpai permasalahan berikut .
1. Signature dari uC tidak terbaca
2. Ada pesan "target doesn't answer" saat menjalankan avrdude
3. Tidak dapat melakukan penulisan flash ataupun EEPROM pada uC
1. Signature dari uC tidak terbaca
2. Ada pesan "target doesn't answer" saat menjalankan avrdude
3. Tidak dapat melakukan penulisan flash ataupun EEPROM pada uC
Jika pernah menjumpai permasalahan diatas, dapat dikatakan uC anda sedang sekarat. Sedih bukan ?
Jujur saja kami sendiri juga pernah pasrah menghadapi permasalahan diatas, dan satu - satunya solusi yang dapat kami lakukan adalah denga membeli uC baru. Akan tetapi setelah dipikir - pikir ternyata jasad uC yang sekarat dikotak komponen semakin banyak dan jika dihitung biaya untuk membeli uC serupa ternyata semakin tinggi sehingga kami mulai melakukan misi P3K (Pertolongan Pertama Pada uKontroler).
Diawali dengan identifikasi penyebab, ternyata faktor utama yang paling sering menyebabkan uC sekarat diantaranya adalah.
1. Kesalahan penulisan fuses
2. Suplai tegangan pada uC terlalu tinggi
Dari hasil googling kesana-kemari akhirnya ditemukan cara menyelamatkan uC sekarat dengan menggunakan High Voltage Programer (HVP).
Pada dasarnya HVP merupakan programer uC yang menggunakan port Parallel Computer (LPT). Dari sini permasalahan selanjutnya adalah unit komputer yang kami punya tidak memiliki port LPT dan tentunya anda sendiri juga paham untuk motherboard komputer keluaran sekarang tidak tersedia port LPT jadi kalau mau menggunakan port LPT harus beli slotnya tersendiri.
Akhirnya penyisiran area google kami lanjutkan kembali, dan menjumpai teknik HVP menggunakan uC yang mana uC berfungsi untuk mengatur tegangan masukan 12V pada pin RST uC target dan mengatur rutin jalanya operasi pemulihan kembali uC.
Program yang kami temukan merupakan source code untuk arduino firmware. Berikut list programnya.
/* Jujur saja kami sendiri juga pernah pasrah menghadapi permasalahan diatas, dan satu - satunya solusi yang dapat kami lakukan adalah denga membeli uC baru. Akan tetapi setelah dipikir - pikir ternyata jasad uC yang sekarat dikotak komponen semakin banyak dan jika dihitung biaya untuk membeli uC serupa ternyata semakin tinggi sehingga kami mulai melakukan misi P3K (Pertolongan Pertama Pada uKontroler).
Diawali dengan identifikasi penyebab, ternyata faktor utama yang paling sering menyebabkan uC sekarat diantaranya adalah.
1. Kesalahan penulisan fuses
2. Suplai tegangan pada uC terlalu tinggi
Dari hasil googling kesana-kemari akhirnya ditemukan cara menyelamatkan uC sekarat dengan menggunakan High Voltage Programer (HVP).
Pada dasarnya HVP merupakan programer uC yang menggunakan port Parallel Computer (LPT). Dari sini permasalahan selanjutnya adalah unit komputer yang kami punya tidak memiliki port LPT dan tentunya anda sendiri juga paham untuk motherboard komputer keluaran sekarang tidak tersedia port LPT jadi kalau mau menggunakan port LPT harus beli slotnya tersendiri.
Akhirnya penyisiran area google kami lanjutkan kembali, dan menjumpai teknik HVP menggunakan uC yang mana uC berfungsi untuk mengatur tegangan masukan 12V pada pin RST uC target dan mengatur rutin jalanya operasi pemulihan kembali uC.
Program yang kami temukan merupakan source code untuk arduino firmware. Berikut list programnya.
HVFuse - Use High Voltage Programming Mode to Set Fuses on ATmega48/88/168
09/23/08 Jeff Keyzer http://mightyohm.com
The HV programming routines are based on those described in the
ATmega48/88/168 datasheet 2545M-AVR-09/07, pg. 290-297
This program should work for other members of the AVR family, but has only
been verified to work with the ATmega168. If it works for you, please
let me know! http://mightyohm.com/blog/contact/
*/
// Desired fuse configuration
#define HFUSE 0xD9 // Default for ATmega48/88/168, for others see
#define LFUSE 0xE1 // http://www.engbedded.com/cgi-bin/fc.cgi
// Pin Assignments
#define DATA PORTD // PORTD = Arduino Digital pins 0-7
#define DATAD DDRD // Data direction register for DATA port
#define VCC 8
#define RDY 12 // RDY/!BSY signal from target
#define OE 11
#define WR 10
#define BS1 9
#define XA0 13
#define XA1 18 // Analog inputs 0-5 can be addressed as
#define PAGEL 19 // digital outputs 14-19
#define RST 14 // Output to level shifter for !RESET
#define BS2 16
#define XTAL1 17
#define BUTTON 15 // Run button
void setup() // run once, when the sketch starts
{
// Set up control lines for HV parallel programming
DATA = 0x00; // Clear digital pins 0-7
DATAD = 0xFF; // set digital pins 0-7 as outputs
pinMode(VCC, OUTPUT);
pinMode(RDY, INPUT);
pinMode(OE, OUTPUT);
pinMode(WR, OUTPUT);
pinMode(BS1, OUTPUT);
pinMode(XA0, OUTPUT);
pinMode(XA1, OUTPUT);
pinMode(PAGEL, OUTPUT);
pinMode(RST, OUTPUT); // signal to level shifter for +12V !RESET
pinMode(BS2, OUTPUT);
pinMode(XTAL1, OUTPUT);
pinMode(BUTTON, INPUT);
digitalWrite(BUTTON, HIGH); // turn on pullup resistor
// Initialize output pins as needed
digitalWrite(RST, HIGH); // Level shifter is inverting, this shuts off 12V
}
void loop() // run over and over again
{
while(digitalRead(BUTTON) == HIGH) { // wait until button is pressed
}
// Initialize pins to enter programming mode
digitalWrite(PAGEL, LOW);
digitalWrite(XA1, LOW);
digitalWrite(XA0, LOW);
digitalWrite(BS1, LOW);
digitalWrite(BS2, LOW);
// Enter programming mode
digitalWrite(VCC, HIGH); // Apply VCC to start programming process
digitalWrite(WR, HIGH); // Now we can assert !OE and !WR
digitalWrite(OE, HIGH);
delay(1);
digitalWrite(RST, LOW); // Apply 12V to !RESET thru level shifter
delay(1);
// Now we're in programming mode until RST is set HIGH again
// First we program HFUSE
sendcmd(B01000000); // Send command to enable fuse programming mode
writefuse(HFUSE, true);
// Now we program LFUSE
sendcmd(B01000000);
writefuse(LFUSE, false);
delay(1000); // wait a while to allow button to be released
// Exit programming mode
digitalWrite(RST, HIGH);
// Turn off all outputs
DATA = 0x00;
digitalWrite(OE, LOW);
digitalWrite(WR, LOW);
digitalWrite(PAGEL, LOW);
digitalWrite(XA1, LOW);
digitalWrite(XA0, LOW);
digitalWrite(BS1, LOW);
digitalWrite(BS2, LOW);
digitalWrite(VCC, LOW);
}
void sendcmd(byte command) // Send command to target AVR
{
// Set controls for command mode
digitalWrite(XA1, HIGH);
digitalWrite(XA0, LOW);
digitalWrite(BS1, LOW);
//DATA = B01000000; // Command to load fuse bits
DATA = command;
digitalWrite(XTAL1, HIGH); // pulse XTAL to send command to target
delay(1);
digitalWrite(XTAL1, LOW);
//delay(1);
}
void writefuse(byte fuse, boolean highbyte) // write high or low fuse to AVR
{
// if highbyte = true, then we program HFUSE, otherwise LFUSE
// Enable data loading
digitalWrite(XA1, LOW);
digitalWrite(XA0, HIGH);
delay(1);
// Write fuse
DATA = fuse; // set desired fuse value
digitalWrite(XTAL1, HIGH);
delay(1);
digitalWrite(XTAL1, LOW);
if(highbyte == true)
digitalWrite(BS1, HIGH); // program HFUSE
else
digitalWrite(BS1, LOW);
digitalWrite(WR, LOW);
delay(1);
digitalWrite(WR, HIGH);
delay(100);
}
Dan skematik rangkaian adalah sebagai berikut.
gb2. Skematik HVFuse
Sedikit pencerahan, dari sini ga pake lama langsung kita kumpulin kembali uC yang bermasalah.Setelah dikumpulin ternyata ada 5 buah uC yang sekarat, semuanya adalah atmega8 (jujur emang kita lebih suka mainan AVR yang 28 pin). Sebelumnya masing - masing uC diselidiki riwayat penyakitnya dan didapatkan hasil 2uC akibat salah seting fuse, 2uC tau-tau ga waras ga tau kenapa dan 1uC akibat kesalahan memasukan tegangan suplai pada pin Vcc (waktu itu Vcc kena tegangan 9V).
Sebelum upload ke arduino board (kita pake arduino deumilanove w/ atmega 328) source code dirubah sedikit untuk menyesuaikan dengan target yaitu pada baris berikut .
#define HFUSE 0xD9 // fuse bit untuk atmega8 default
#define LFUSE 0xC1 // (1MHz internal RC oscilator)
Setelah melakukan penyesuaian untuk fuse bit target langsung upload ke arduino dan menghubungkan kedua uC sesuai dengan skematik (gb2).
Setelah rangkaian siap, nyalakan power suplai dan akan terlihat LED RDY menyala ini menandakan uC target READY. Kemudian tekan push button dan LED akan padam selama sekitar 1 detik. Pada kondisi LED padam, uC sedang melakukan proses penulisan fuse pada uC target. Setelah LED menyala kembali berarti proses telah selesai.
Setelah proses rescue selesai, uC atmega8 yang sekarat tadi dicoba dibaca signature dengan menggunakan avrdude dan hasilnya....?
Jreng - jeng........!
gb3. Atmega8 setelah dipulihkan dari koma
CONGRITULATION......atmega8 telah selamat.Hmm....bagaimana kalau tidak punya arduino?
Kalau tidak punya arduino, maka source code HVfuse diatas dikonversi kedalam bahasa pemrograman yang biasa anda gunakan. Berikut contoh untuk menggunakan HVFuse pada bahasa c menggunakan winAVR.
#include
#include
#define HFUSE 0xD9 // Default for ATmega8
#define LFUSE 0xC1
// PORTB
#define _VCC (1<<0)
#define _RDY (1<<4)
#define _OE (1<<3)
#define _WR (1<<2)
#define _BS1 (1<<1)
#define _XA0 (1<<5)
// PORTC
#define _XA1 (1<<4)
#define _PAGEL (1<<5)
#define _RST (1<<0)
#define _BS2 (1<<2)
#define _XTAL1 (1<<3)
#define _BUTTON (1<<1)
void HardwareInit()
{
DDRB = ~(_RDY);
PORTB = 0x00;
DDRC = ~(_BUTTON);
PORTC = (_BUTTON)|(_RST);
DDRD = 0xff; //Port D sebagai jalur data di set output
PORTD = 0x00;
}
void sendcmd(unsigned char command)
{
PORTC |= _XA1;
PORTB &= ~(_XA0|_BS1);
PORTD = command;
PORTC |= _XTAL1;
_delay_ms(1);
PORTC &= ~(_XTAL1);
_delay_ms(1);
}
void writefuse(unsigned char fuse, char highbyte)
{
PORTC &= ~(_XA1);
PORTB |= _XA0;
_delay_ms(1);
PORTD = fuse;
PORTC |= _XTAL1;
_delay_ms(1);
PORTC &= ~(_XTAL1);
if (highbyte)
PORTB |= _BS1;
else
PORTB &= ~(_BS1);
PORTB &= ~(_WR);
_delay_ms(1);
PORTB |= _WR;
_delay_ms(100);
}
int main()
{
HardwareInit();
for (;;)
{
while (PINC & _BUTTON) {} // menunggu penekanan button
PORTC &= ~(_PAGEL|_XA1|_BS2);
PORTB &= ~(_XA0|_BS1);
// memprogram target
PORTB |= _VCC|_WR|_OE;
_delay_ms(1);
PORTC &= ~(_RST);
_delay_ms(1);
// Program HFUSE
sendcmd(0b01000000);
writefuse(HFUSE, 1);
// Program LFUSE
sendcmd(0b01000000);
writefuse(LFUSE, 0);
_delay_ms(1000);
// Selesai
PORTC |= _RST;
// Turn off output
PORTD = 0x00;
PORTB &= ~(_VCC|_WR|_OE|_XA0|_BS1);
PORTC &= ~(_PAGEL|_XA1|_BS2);
}
Setelah menulis kode sumber diatas menggunakan programer notepad, langkah selanjutnya adalah membuat mfile untuk mikrokontroler yang akan dimasuki program AVR rescue diatas.
Saya menggunakan MCU atmega 8 dengan mengeset frekuensi oscilator yang digunakan adalah internal oscilator yaitu 1MHz sedangkan nama file program rescue diatas dikasih nama Rescue.c
Setelah membuat mfile, kembali ke programer notepad untuk melakukan compilasi dengan menekan tool "make all".
Setelah itu upload file Rescue.hex ke uC dan selesai
Setelah uC semua siap, tinggal menyesuaikan skematik untuk uC tanpa arduino board. Dengan pin map arduino adalah sebagai berikut.
gb4. Pin Map Arduino
Dengan konfigurasi pin map sesuai gb4 maka skematik untuk rescue atmega8 adalah sebagai berikut.
gb5. Skematik AVR Rescue
Setelah semua selesai tinggal proses penekanan button dan seperti proses menggunakan arduino, led akan padam selama sekitar 1 detik setelah led menyala kembali berarti proses telah selesai dan tinggal di cek atmega8 selamat atau tidak.Hasil
Dari misi P3K terhadap 5 buah uC yang dijalankan diperoleh hasil 3 buah uC berhasil diselamatkan dan 2 buah uC yang gagal diselamatkan.
Tidak ada komentar:
Posting Komentar