Чт фев 20, 2014 21:39:21
Пт фев 21, 2014 03:27:42
Чт май 01, 2014 17:51:47
Чт май 01, 2014 23:35:40
Сб май 03, 2014 17:42:26
Сб май 03, 2014 19:14:51
Вс май 04, 2014 17:17:28
Перепрошить контроллер пробовали?
Ср июн 11, 2014 11:25:05
Ср июн 11, 2014 12:25:23
nillsoft писал(а):С прошивкой 2.11 доходит до "Init programming..." и всё.
Ср июн 11, 2014 12:36:34
Ср июн 11, 2014 12:39:49
Ср июн 11, 2014 12:53:26
Ср июн 11, 2014 13:50:41
Ср авг 06, 2014 10:07:39
Чт авг 07, 2014 08:36:51
Сб сен 27, 2014 16:01:20
Чт ноя 06, 2014 00:31:54
// Проект "РЕАНИМАТОР AVR". Автор: Черняков С.С. chernyako-sergej@yandex.ru Евпатория апрель 2009
// Ардуино адаптация ZBUK@bk.ru
// - #include <avr/io.h>
// - #include <util/delay.h>
// #define PORT_DATD PORTD /*Двунаправленная шина данных*/
int RDY_BSY = A5; //#define RDY_BSY - Вход "состояние программируемого МК". 0-занят (выполняется предыдущая команда), 1-готов к приёму следующей команды
int OE = 12; //#define OE - Выход "управление режимом работы шины данных PORT_DATA" 0-выход, 1-вход
int WR = 11; //#define WR - Выход "сигнал записи" 0-активный уровень
int BS1 = 10; //#define BS1 - Выход "выбор байта" 0-младший байт, 1-старший байт
int XA0 = 9; //#define XA0 - Выход "определение действия по положительному импульсу на выводе XTAL1
int XA1 = 8; //#define XA1 - Выход "определение действия по положительному импульсу на выводе XTAL1
/*ХА1=0, ХА0=0 - загрузка адреса ячейки памяти (младшего или старшего байта, в зависимости от уровня сигнала BS1)*/
/*ХА1=0, ХА0=1 - загрузка данных (младшего или старшего байта, в зависимости от уровня сигнала BS1)*/
/*ХА1=1, ХА0=0 - загрузка команды*/
/*ХА1=1, ХА0=1 - нет действия, режим ожидания*/
int PAGEL = A0; //#define PAGEL - Выход "сигнал загрузки страницы памяти"
int Vpp_12V = A1; //#define Vpp_12V- Выход "напряжение 12 В"
int BS2 = A2; //#define BS2 - Выход "выбор байта" 0-младший байт, 1-старший байт
int XTAL1 = A3; //#define XTAL1 - Выход "тактовый сигнал"
int Vcc_5V = A4; //#define Vcc_5V - Выход "напряжение 5В
// RDY_BSY OE WR BS1 XA0 XA1 PAGEL Vpp_12V BS2 XTAL1 Vcc_5V - сигналы
// 13 12 11 10 09 08 A0 A1 A2 A3 A4 - разряды
int ledPin = 13; // номер выхода, подключенного к светодиоду
void setup()
{
DDRD = B11111111; // установить ноги порта D с 0 по 7 как цифровые выходы /*Двунаправленная шина данных подключаем к PB7-PB0*/
pinMode(RDY_BSY, INPUT); // устанавливает режим работы - выход для RDY_BSY входа
pinMode(OE, OUTPUT); // устанавливает режим работы - выход для OE вЫхода
pinMode(WR, OUTPUT); // устанавливает режим работы - выход для WR вЫхода
pinMode(BS1, OUTPUT); // устанавливает режим работы - выход для BS1 вЫхода
pinMode(XA0, OUTPUT); // устанавливает режим работы - выход для XA0 вЫхода
pinMode(XA1, OUTPUT); // устанавливает режим работы - выход для XA1 вЫхода
pinMode(PAGEL, OUTPUT); // устанавливает режим работы - выход для PAGEL вЫхода
pinMode(Vpp_12V, OUTPUT); // устанавливает режим работы - выход для Vpp_12V вЫхода
pinMode(BS2, OUTPUT); // устанавливает режим работы - выход для BS2 вЫхода
pinMode(XTAL1, OUTPUT); // устанавливает режим работы - выход для XTAL1 вЫхода
pinMode(Vcc_5V, OUTPUT); // устанавливает режим работы - выход для Vcc_5V вЫхода
pinMode(ledPin, OUTPUT); // устанавливает режим работы - выход для ledPin вЫхода ИЛИ КНОПКА INPUT
}
//---Перевод МК семейства MEGA (кроме ATmega161, ATmega163, ATmega323) в режим параллельного программирования---
void set_prog() //void set_prog (void)
{
//---Перевод МК ATmega8 в режим параллельного программирования (если запрограммирована ячейка RSTDISBL)---
// DDRC = 0b01111111;//RDY_BSY - вход, остальные выходы
// PORTC = 0b11100000;//Подать на выходы PAGEL, XA1, XA0, BS1 лог. 0
// RDY_BSY OE WR BS1 XA0 XA1 PAGEL BS2 - сигналы
// PORTC 7 6 5 4 3 2 1 0 - разряды порта
digitalWrite(PAGEL, LOW); //Подать на выходы PAGEL лог. 0
digitalWrite(XA1, LOW); //Подать на выходы XA1 лог. 0
digitalWrite(XA0, LOW); //Подать на выходы XA0 лог. 0
digitalWrite(BS1, LOW); //Подать на выходы BS1 лог. 0
digitalWrite(BS2, LOW); //Подать на выходы BS2 лог. 0
digitalWrite(RDY_BSY, HIGH); //Подать на выходы RDY_BSY лог. 1
digitalWrite(OE, HIGH); //Подать на выходы OE лог. 1
digitalWrite(WR, HIGH); //Подать на выходы OE лог. 1
delay(100); //Выждать не менее 100 nс
// DDRD = 0b00000111; //Выходы XTAL1, 12V, 5V
// Vcc_5V Vpp_12V XTAL1 - сигналы
// PORTD 7 6 5 4 3 2 1 0 - разряды порта
// PORTD |= 0b00000110;//Подать на МК ОДНОВРЕМЕННО Uпит, а на вывод RESET U = 12В
digitalWrite(Vcc_5V, HIGH); //Подать на выходы Vcc_5V лог. 1
digitalWrite(Vpp_12V, HIGH); //Подать на выходы Vpp_12V лог. 1
delay(10000); // _delay_us(100); //Выждать не менее 100 nс
digitalWrite(Vcc_5V, LOW); //Подать на выходы Vcc_5V лог. 0
digitalWrite(Vpp_12V, LOW); //Подать на выходы Vpp_12V лог. 0
digitalWrite(XTAL1, HIGH);
delay(10);
digitalWrite(XTAL1, LOW); //Подать на выходы XTAL1 лог. 0
delay(100);
//DDRA = 0b11111111;//Выход шины данных
}
//---Загрузка команды---
void loadcommand(byte command) //void loadcommand (unsigned char command)
{
digitalWrite(XA1, HIGH); // PORTC |= _BV(XA1);
digitalWrite(XA0, LOW); /* // PORTC &= ~_BV(XA0); Установить выводы ХА1, ХА0 в состояние 10 загрузка команды */
digitalWrite(BS1, LOW); // PORTC &= ~_BV(BS1); Подать на вывод BS1 лог.0
PORTD = command; // PORT_DATA = command; Выставить на шину DATA код команды
digitalWrite(XTAL1, HIGH);
delay(10);
digitalWrite(XTAL1, LOW); //PORTD |= _BV(XTAL1);_delay_us(10);PORTD &= ~_BV(XTAL1);//Подать на вывод XTAL1 положительный импульс
}
//---Загрузка данных---
void load_data(byte data)
{
//void load_data (unsigned char data)
digitalWrite(XA1, LOW); //PORTC &= ~_BV(XA1);
digitalWrite(XA0, HIGH); //PORTC |= _BV(XA0);//Установить выводы ХА1, ХА0 в состояние "01" загрузка данных
digitalWrite(BS1, LOW); //PORTC &= ~_BV(BS1);//Подать на вывод BS1 лог.0
PORTD = data; //PORT_DATA = data;//Выставить на шину DATA код команды
digitalWrite(XTAL1, HIGH);
delay(10);
digitalWrite(XTAL1, LOW); //PORTD |= _BV(XTAL1);_delay_us(10);PORTD &= ~_BV(XTAL1);//Подать на вывод XTAL1 положительный импульс
}
void loop() //int main (void)
{
byte command = 0;
byte data = 0;
byte low_fuse = 0;
byte high_fuse = 0; // unsigned char low_fuse, high_fuse;
int buttonState = 0; // variable for reading the pushbutton status
int CIPState = 0;
// PORTD |= _BV(PD6);//Вход с подтягивающим резистором - кнопка для перезаписи
pinMode(ledPin, INPUT); // устанавливает режим работы - OUTPUT для ledPin --- ИЛИ INPUT ДЛЯ КНОПКИ
digitalWrite(ledPin, HIGH); // включить подтягивающий резистор ДЛЯ КНОПКИ
// DDRB |= _BV(PB3);//Выход на светодиод, индицирующий успешную перезапись
while(1) //Бесконечный цикл
{
buttonState = digitalRead(ledPin);
if (buttonState == LOW) //Если нажата кнопка "PROG"
{
pinMode(ledPin, OUTPUT); // устанавливает режим работы - OUTPUT для ledPin --- ИЛИ INPUT ДЛЯ КНОПКИ
digitalWrite(ledPin, LOW); // выключить подтягивающий резистор
do //Начинаем цикл программирования
{
set_prog(); //Войти в режим паралельного программирования
//Стирание кристалла
loadcommand(0b10000000); //Загрузить команду "Стирание кристалла"
digitalWrite(WR, HIGH);// PORTC |= _BV(WR);//Подать на вывод WR лог.1 (задний фронт)
CIPState = digitalRead(RDY_BSY);
while(CIPState == LOW)
{
CIPState = digitalRead(RDY_BSY);
}//while(bit_is_clear(PINC, RDY_BSY));
//Запись младшего конфигурационного байта
loadcommand(0b01000000);//Загрузить команду "Запись конфигурационных ячеек"
load_data(0b11100001); //Загрузить младший конфигурационный байт
digitalWrite(BS1, LOW);// PORTC &= ~_BV(BS1);//Сбросить BS1 в лог.0
digitalWrite(BS2, LOW);// PORTC &= ~_BV(BS2);//Сбросить BS2 в лог.0
digitalWrite(WR, LOW); // PORTC &= ~_BV(WR);//Подать на вывод WR лог.0 (передний фронт)
delay(200); // _delay_us(20); //Длительность импульса
digitalWrite(WR, HIGH);// PORTC |= _BV(WR);//Подать на вывод WR лог.1 (задний фронт)
// while(bit_is_clear(PINC, RDY_BSY));//и ждать появления на выводе RDY/BSY сигнала лог.1
CIPState = digitalRead(RDY_BSY);
while(CIPState == LOW)
{
CIPState = digitalRead(RDY_BSY);
}
delay(100); //_delay_us(100);
//Запись старшего конфигурационного байта
loadcommand(0b01000000); //Загрузить команду "Запись конфигурационных ячеек"
load_data(0b11011001); //Загрузить старший конфигурационный байт
digitalWrite(BS1, HIGH);//PORTC |= _BV(BS1);//Установить BS1 в лог.1
digitalWrite(BS2, LOW); //PORTC &= ~_BV(BS2);//Сбросить BS2 в лог.0
digitalWrite(WR, LOW); //PORTC &= ~_BV(WR);//Подать на вывод WR лог.0 (передний фронт)
delay(20); //_delay_us(20);//Длительность импульса
digitalWrite(WR, HIGH); //PORTC |= _BV(WR);//Подать на вывод WR лог.1 (задний фронт)
//while(bit_is_clear(PINC, RDY_BSY));//и ждать появления на выводе RDY/BSY сигнала лог.1
CIPState = digitalRead(RDY_BSY);
while(CIPState == LOW)
{
CIPState = digitalRead(RDY_BSY);
}
digitalWrite(BS1, LOW); // PORTC &= ~_BV(BS1);//Сбросить BS1 в лог.0
delay(100); // _delay_us(100);
//Чтение младшего конфигурационного байта
loadcommand(0b00000100);
// DDRA = 0x00;//Порт А перевести на вход
DDRD = B00000000; // установить ноги порта D с 0 по 7 как цифровые входы /*Двунаправленная шина данных подключаем к PB7-PB0*/
PORTD = 0xFF; //с подтягивающими резисторами
digitalWrite(OE, LOW); //PORTC &= ~_BV(OE);//Сбросить ОЕ
digitalWrite(BS2, LOW); //PORTC &= ~_BV(BS2);// BS2
digitalWrite(BS1, LOW); //PORTC &= ~_BV(BS1);// BS1 в лог.0
delay(250); //_delay_us(250);
low_fuse = PIND; //Считать значение младшего конфигурационного байта
//Чтение старшего конфигурационного байта
digitalWrite(OE, LOW); //PORTC &= ~_BV(OE);//Сбросить OE в лог.0
digitalWrite(BS2, HIGH); //PORTC |= _BV(BS2);//Установить BS2
digitalWrite(BS1, HIGH); //PORTC |= _BV(BS1);// BS1 в лог.1
delay(250); //_delay_us(250);
high_fuse = PIND; //Считать значение старшего конфигурационного байта
digitalWrite(OE, HIGH); //PORTC |= _BV(OE);//Установить OE в лог.1
DDRD = 0xFF; //Порт А - выход
PORTD = 0;
PORTB = 0;
PORTC = 0; //Обнулить порты для предотвращения паразитного питания (через порты)
//PORTD &= 0b11111000;//Снять питание
}
while((low_fuse != 0b11100001) || (high_fuse != 0b11011001));//Закончить цикл программирования если запись произведена успешно
digitalWrite(ledPin, HIGH); //PORTB |= _BV(PB3); //и подсветить светодиод
}
}
}
Ср ноя 12, 2014 22:06:07
Ср ноя 12, 2014 22:48:47