Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/89: Рейтинг темы: голосов - 89, средняя оценка - 4.96
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580

Usbasp и Atmel AT89C51ED2

05.01.2016, 11:29. Показов 19576. Ответов 189
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, подскажите пожалуйста на работу коллега принес usbasp заказанный в китае https://encrypted-tbn0.gstatic... NCR1lFBZkQ И принес списанный прибор, на борту которого чип Atmel AT89C51ED2, можно ли через данный программатор залить прошивку в данный чип ? если можно то подскажите как и чем ? потому как программатор не видит кристалл. Использовал программу avrdudeprog и SinaProg в списке данного кристалла не наблюдаю. Помогите пожалуйста разобраться с этим чудом. Всем спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.01.2016, 11:29
Ответы с готовыми решениями:

Чем программировать AT89C51ED2
У деда жены откопал на антресолях кучу AT89C51ED2. Хочу применить это чудо по назначению, но не знаю чем его программировать и какой...

Выполнение кода из внешней EEPROM (ASM, AT89C51ED2)
Задача: Необходимо в память (EEPROM) записать исполняющий код (не важно что он делает),который будет выполняться при включении...

Реверсинг "Эталон-01" на базе AT89C51ED2... или вопросы компетентности и степени жадности
Доброго времени суток. Моя проблема заключается в следующем. Работаю программистом ПЛК(только начинаю, только устроился). Дали задание: ...

189
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
12.01.2016, 22:02  [ТС]
Студворк — интернет-сервис помощи студентам
Там и Proteus на всякий
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
16.01.2016, 10:08
Ваш проект опять не открылся написал с нуля:
как я писал выше
Цитата Сообщение от Витальич Посмотреть сообщение
В общем случаи в IAR прерывание имеет синтаксис:

#pragma vector=0x03
__interrupt void Display_Name()
{
}
и это работает:
A - функция прерывания
B - Компилятор честно сделал по вектору переход на тело
С - Тело функции прерывания.
P.S. Как то писал, что полезно ассемблер знать.
Миниатюры
Usbasp и Atmel AT89C51ED2  
1
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
16.01.2016, 10:40
Вот ваши вектора, взято от сюда http://www.gaw.ru/pdf/Atmel/AT... D2_ED2.pdf
Миниатюры
Usbasp и Atmel AT89C51ED2  
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
16.01.2016, 14:27  [ТС]
Цитата Сообщение от Витальич Посмотреть сообщение
Ваш проект опять не открылся
Да что же такое .... может я случайно сохранил в самой iar а не в notepad++ поэтому такой эффект, извините.
Цитата Сообщение от Витальич Посмотреть сообщение
и это работает:
A - функция прерывания
B - Компилятор честно сделал по вектору переход на тело
С - Тело функции прерывания.
Большое спасибо.
Цитата Сообщение от Витальич Посмотреть сообщение
P.S. Как то писал, что полезно ассемблер знать.
Подумываю об этом, но пока еще не решился
Цитата Сообщение от Витальич Посмотреть сообщение
Вот ваши вектора, взято от сюда
Спасибо большое
0
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
18.01.2016, 16:19  [ТС]
Витальич, Доброго времени суток, добрался я наконец до своего МК, и к сожалению у меня нечего не получилось, или я не внимательно читал:
Пример того что я пробовал делать :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#pragma vector=0x03
__interrupt void Display_Name()
{
 pwm = ~pwm; //port 2.4
 
  //TH0 = 0xDC;
  //TL0 = 0x00;
 //  TCON_bit.TR0 = 1;
//  Lcd_Disp (0x80, "Good");
 // Lcd_Disp (0xC1, "В \273 а \266 \275 о с \277 \304");
 // Lcd_init();
 // Lcd_Cmd(0x01);
  //while (!TCON_bit.TF0);      // ждем переполнения таймера 
  //TCON_bit.TF0 = 0;         // обнуляем флаг переполнения  
  
 // while (1);
}
 
 
int main (void)
{  
  TMOD = 1;
  TH0 = 15536;    
  TL0 =  150;      
  TCON_bit.TR0 = 1;
  IEN0 = 1;
 
  while (1);//{
 //   TCON_bit.TR0 = 1;}
// Lcd_init();
 //Lcd_Cmd(0x01);
//Display_Name();
 //return 0;
 //while (1);
}
В итоге на выходе ничего не происходит. Что же я всетаки не правильно делаю ?
IEN0 = 1; вроде как активирует таймер interrupt
C
1
 unsigned char IEN0; /* Interrupt Enable Control 0 */
это взято из библиотеки.
посмотрев еще библиотеку вот нашел что :
C
1
2
unsigned char IPH0; /* Interrupt Priority Control High 0 */
unsigned char IPL0; /* Interrupt Priority Control Low 0 */
Спасибо за помощь ?
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
18.01.2016, 16:41
vector=0x03 - вектор внешнего прерывания, а Вам нужен вектор таймера, он 0X0B
Миниатюры
Usbasp и Atmel AT89C51ED2  
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
22.01.2016, 12:15  [ТС]
Всем доброго времени суток, у меня опять вопрос, не могу понять как задавать частоту прерывания:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma vector=0x0B
__interrupt void Display_Name()
{
  IPH0 = 15536;    
  IPL0 =  150;      
  Lcd_Disp (0x80, "Good");
// Lcd_Disp (0xC1, "В \273 а \266 \275 о с \277 \304");
  Lcd_init();
  Lcd_Cmd(0x01);
}
 
int main (void)
{  
  TCON_bit.IE0 = 1;
  IEN0 = 0x93;  
  while (1);
}
Пробовал и по таймеру :

C
1
2
3
4
5
6
7
TMOD = 1;
while (1){
TH0 = 0x6F; ;     // заносим старший байт числа
TL0 =  0xFF;      // заносим младший байт числа 
TCON_bit.TR0 = 1; // запускаем таймер
while (!TCON_bit.TF0);      // ждем переполнения таймера 
TCON_bit.TF0 = 0;         // обнуляем флаг переполнения
В итоге данные на дисплее моргают каждую секунду. Спасибо за помощь.
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
22.01.2016, 12:37
0. Нет глобального разрешения на прерывания.
1. Lcd_init(); - зачем каждый раз инициализировать дисплей (один раз в майне)
2. Lcd_Cmd(0x01); - не помню что она у Вас делает.
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
22.01.2016, 12:51
Цитата Сообщение от Витальич Посмотреть сообщение
Lcd_Cmd(0x01); - не помню что она у Вас делает.
насколько помню, очистка дисплея
1
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
22.01.2016, 12:53
C
1
2
3
4
5
6
7
8
#pragma vector=0x0B
__interrupt void Display_Name()
{
  IPH0 = 15536;    
  IPL0 =  150; 
  Lcd_Cmd(0x01);     
  Lcd_Disp (0x80, "Good");
}
Цитата Сообщение от Витальич Посмотреть сообщение
Нет глобального разрешения на прерывания.
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
22.01.2016, 13:24  [ТС]
Цитата Сообщение от Витальич Посмотреть сообщение
0. Нет глобального разрешения на прерывания.
Простите за наглость, не подскажите как ? на asm вроде уже разбирали эту тему, на С сколько примеров не пересмотрел везде того что у меня достаточно, или я чего-то не догоняю ?
Цитата Сообщение от Витальич Посмотреть сообщение
1. Lcd_init(); - зачем каждый раз инициализировать дисплей (один раз в майне)
Да глупость и невнимательность моя, вынес куда положено
Цитата Сообщение от Витальич Посмотреть сообщение
Lcd_Cmd(0x01); - не помню что она у Вас делает.
C
1
2
3
4
5
6
7
8
9
void Lcd_Cmd (unsigned char cmm)
{
  LCD_port = cmm;
  LCD_rs = 0;
  LCD_rw = 0;
  LCD_en = 1;
  Delay (2);
  LCD_en = 0;
}
Lcd_Cmd(0x01); - Очистка дисплея, в этом вся проблема и таилась.
Вынес все в main, и проблема исчезла текст не моргает.
Как уже говорил выше невнимателен.
Спасибо большое
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
22.01.2016, 15:00
По прерыванию вот:
Миниатюры
Usbasp и Atmel AT89C51ED2  
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
22.01.2016, 15:56  [ТС]
Витальич, Как вы считаете такое решение правильно ? или нужно делать иначе ?
Хочу услышать мнение специалиста :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#pragma vector=0x0B
__interrupt void Display_Name()
{
 
pwm = 1;
TH0 = 100; ;     // заносим старший байт числа 62036
TL0 =  10;      // заносим младший байт числа 62036
TCON_bit.TR0 = 1; // запускаем таймер
 
while (!TCON_bit.TF0);      // ждем переполнения таймера 
TCON_bit.TR0 = 0;          // остановка таймера
TCON_bit.TF0 = 0;         // обнуляем флаг переполнения 
 
pwm = 0;
TH0 = 100; ;            // заносим старший байт числа 62036
TL0 = 10;             // заносим младший байт числа 62036
TCON_bit.TR0 = 1;     // запускаем таймер
 
while (!TCON_bit.TF0);     // ждем переполнения таймера    
TCON_bit.TR0 = 0;         // остановка таймера
TCON_bit.TF0 = 0;        // обнуляем флаг переполнения  
  
}
 
 
int main (void)
{  
  Lcd_init();
  Lcd_Cmd(0x01);
  TCON_bit.IE0 = 1;
  IEN0 = 0x93;
  IEN0_bit.EA = 1;  
  while (1);
}
Добавлено через 3 минуты
где pwm = P2_bit.P2_4
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
22.01.2016, 16:24
Цитата Сообщение от Dostik Посмотреть сообщение
while (!TCON_bit.TF0); * * *// ждем переполнения таймера
Если прерывание сработало, то мы попали в обработчик прерываний и ждать в нём ни чего не надо!

Добавлено через 24 минуты
Нет у меня на работе компилятора 51го
Поэтому буду показывать на своём проекте.
Допустим мне надо постоянна генирить меандр на ножке МК не отвлекая ядро на это задержками, циклами итд
Что я делаю:
Пишу функцию настройки таймера.
C
1
2
3
4
5
6
7
8
9
10
11
#define TIM2_ARR ((uint16_t)(1 * 62500 - 1))
// настройка таймера
void Init_Taimer2()
{
  TIM2->PSCR = (uint8_t)(TIM2_PRESCALER_128);  //Настройка предделителя
  /* Настройка значения по которуму будет выполнятся сброс счетчика таймера */
  TIM2->ARRH = (uint8_t)((TIM2_ARR >> 8)& 0xFF);
  TIM2->ARRL = (uint8_t)((TIM2_ARR & 0xFF));
  TIM2->SR1 = (uint8_t)(~TIM2_FLAG_UPDATE);     // очистка флага прерывания TIM2 UPDATE
  TIM2->IER |= (uint8_t)TIM2_IT_UPDATE;         //включение прерывания TIM2 UPDATE
}
если я её вызову то настрою таймер.
Далее пишу функцию прерывания таймера по переполнению.
C
1
2
3
4
5
6
// прерывание таймера 
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{
  GPIOC->ODR ^= GPIO_PIN_3 | GPIO_PIN_4;  //инвертируем состояния светодиодов
  TIM2->SR1 = (uint8_t)(~TIM2_IT_UPDATE);  // очистка флага прерывания TIM2 UPDATE
}
когда таймер досчитает до конца, то АВТОМАТИЧЕСКИ попадет в эту функцию.
Пишем код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main( void )
{
  Init_CPU();       //настраиваю генератор
  Init_Ports();     //настраиваю порты
  Init_Taimer2(); //настраиваю таймер
 
  enableInterrupts();  //глобально разрешаем прерывания
  TIM2->CR1 |= TIM2_CR1_CEN; //запуск счета таймера
 while(1)
 {
   //тут делаем что то полезное, а меандр генирится сам по себе. (есть нюансы, но о них поже)   
 }
  //return 0;
}
что не понятно спрашивайте, а то вечером у меня по плану кабак.
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
23.01.2016, 15:34  [ТС]
Всем доброго времени суток, Витальич, извиняюсь вчера после работы тоже не было времени позаниматься, сейчас решил повникать. И сразу не доходя до вчерашней темы, столкнулся с проблемой следующего рода:
- Почему я не могу вывести цифры и текст ? вот по этому коду :
C
1
2
3
4
5
6
7
8
9
10
#pragma vector=0x0B
 __interrupt  void Display_Name()
{  
   int a = 55;
   char buf[4];
   //for (int i=0;i<256;i++) {
  sprintf(buf,"%d",a);
  Lcd_Disp (0x80, buf); 
  Lcd_Disp (0xC1, "Test");//}
}
- Второй вопрос схожий с первым, если вспомнить ранее вы меня учили заносить массив данных во flash память, но в прерываниях почему не работает ?
Код :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
__code const unsigned char  sin_tab[256] = {127,130,133,136,139,142, 145,148,151,154,157,160,164,
 166,169,172,175,178,181,184,187,189,192,195,197,200,202,205,207,210,212,214,217,
 219,221,223,225,227,229,231,232,234,236,237,239,240,242,243,244,245,246,247,248,
 249, 250,251,251,252,252,253,253,253,253,253,254,253,253,253,253,252,252,251,251,
 250,249,249,248,247,246,245,243,242,241,239,238,236,235,233,231,230, 228,226,224,
 222,220,218,215,213,211,209,206,204,201,199,196,193,191,188,185,182,180,177,174,
 171,168,165,162,159,156,153,150,147,144,141,137,134,131,128,125,122,119,116,112,
 109,106,103,100,97,94,91,88,85,82,79,76, 73,71,68,65,62,60,57,54,52,49,47,44,42,
 40,38,35,33,31,29,27,25,23,22,20,18,17,15,14,12,11,10,8,7,6,5,4,4,3,2,2,1,1,0,0,
 0,0,0,0,0,0,0,0,1,1,2,2,3,4,5,6,7,8,9,10,11,13,14,16,17,19,21,22,24,26,28,30,32,
 34,36,39,41,43,46,48,51,53,56,58,61,64,66,69,72,75,78,81,84,87,89,93,96,99,102,
 105,108,111,114,117,120,123,127};
 /**/
#pragma vector=0x0B
 __interrupt  void Display_Name()
{  
   //int a = 55;
   char buf[4];
   for (int i=0;i<256;i++) {
   sprintf(buf,"%d",sin_tab[i]);
  Lcd_Disp (0x80, buf); 
  Lcd_Disp (0xC1, "Test");}
}
Вывести получается один лишь текст. Почему так, и как с этим бороться ?
- Третий вопрос который мне не совсем ясен, так как кусок кода я нашел на просторах интернета, и из описаний было написано что это активация прерываний, но что это за адрес ? если поставить другой регистр, код становиться не рабочим.
C
1
 IEN0 = 0x93;
Почему 93 ? почему я просто не могу написать 1 либо 0
Всем спасибо за помощь.
P.s Пойду пока дальше читать вникать
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
23.01.2016, 19:13
Давайте по порядку.
У Вас МК вообще попадает в обработчик прерывания?

Не по теме:

вот и начали всплывать неудобства старого МК, в современном просто бы в JTAG посмотрели


Проверить просто. В прерывании напишите код изменения состояния порта и посмотрите мультиметром.
После этого пойдем дальше.
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
23.01.2016, 20:36  [ТС]
Цитата Сообщение от Витальич Посмотреть сообщение
У Вас МК вообще попадает в обработчик прерывания?
Я думаю что попадает. МК под рукой нет но есть протеус с его изумительным осциллографом
При таком коде :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma vector=0x0B
 __interrupt  void Display_Name()
{  
  pwm = ~pwm;
  //int a = 55;
   //char buf[4];
  // for (int i=0;i<256;i++) {
  // sprintf(buf,"%d",sin_tab[i]);
 // Lcd_Disp (0x80, buf); 
 // Lcd_Disp (0xC1, "Test");//}
}
 
int main (void)
{ 
  Lcd_init();
  Lcd_Cmd(0x01);
  TCON_bit.IE0 = 1;
  IEN0 = 0x93;
  IEN0_bit.EA = 1;  
while (1);
}
Вот такой эффект я уверен в том что это какраз и есть прерывание. Плюс хочу обратить ваше внимание на загруженность процессора которое показывает протеус оно колеблется от 40-80%

Не по теме:

Витальич, Мне для саморазвития, да и темболее не все же начинали сразу на bmw кататься :)

Миниатюры
Usbasp и Atmel AT89C51ED2  
0
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
23.01.2016, 20:36  [ТС]
Напоминаю что pwm = P2_bit.P2_4
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
23.01.2016, 20:45
Раз попадает это хорошо.
Теперь по выводу на экран:
char buf[4];
Lcd_Disp (0x80, buf);
А где код записи в буфер?
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
23.01.2016, 20:51  [ТС]
А это разве не подходит ?
C
1
sprintf(buf,"%d",sin_tab[i]);
Добавлено через 59 секунд
Либо так :
C
1
2
3
4
int a = 55;
char buf[4];
sprintf(buf,"%d",a);
Lcd_Disp (0x80, buf);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2016, 20:51
Помогаю со студенческими работами здесь

USBAsp
Вот собственно... Купил себе нетбук и появилась необходимость в USB программаторе. Делал по печатке DY HOTTa. Сторону с пайкой стыдно...

USBAsp
Всем привет. Собрал программатор USBAsp. Подключил к USB, по идее должен же загореться светодиод что питание поступило а он у меня...

tiny85 & USBasp
Попробовал сейчас залить програмку в тини85 при помощи усбаспа, программа заливается корректно, а фьюзы не читаются. Пользуюсь оболочкой...

Проблемы с USBASP
Здравствуйте. Начал изучение микроконтроллеров. Приобрел usb программатор USBASP. Пытаюсь прошить тини2313. Скачал проги eXtreme Burner...

Обновление USBasp
Добрый день. Некоторое время занимался arduino, решил вылазить из пеленок и самостоятельно травить платы, прошивать контроллеры... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
180
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru