Обсуждаем контроллеры компании Atmel.
Ответить

Re: Что неправильно в коде ?

Чт мар 24, 2022 21:58:10

Пробовал найти "Оптимизацию", и не нашел, в меню "Проект" тоже ничего нет похожего, и нет - >Configuration Options->.
У меня AVR Studio 5 версии. Вроде все пишут, что версия 4,19 самая лучшая, но у меня она почему то глючила. Так что работаю в "5".

Re: Что неправильно в коде ?

Чт мар 24, 2022 22:16:27

Погуглил...
Нужно не в Solution свойства открывать, а именно проекта. Там очень много полезностей.

viewtopic.php?p=822808#p822808

Re: Что неправильно в коде ?

Пт мар 25, 2022 00:41:07

УРА !!!! БОльшое спасибо. Долго искал и наконец нашел где спрятана эта оптимизация. Установил Os, и ЧУДО, вместо бывших 9 килобайт скомпилированный файл занял только 312 байт. СУПЕР. И в Протеусе все работает как нужно.

Re: Что неправильно в коде ?

Пт мар 25, 2022 01:25:14

Хорошо, что получилось. Хотя разница в размере что-то очень уж большая, но, наверное, для Протеуса такое в норме.
Однако, ждём-с, чтобы заработало вне Протеуса ;)

Re: Что неправильно в коде ?

Пт мар 25, 2022 12:26:59

Это разница в объеме не "ДЛЯ ПРОТЕУСА", а я смотрел объем фактически откомпилированного файла .HEX. И получается что до оптимизации этот файл бал объемом - более 8 килобайт, а после оптимизации всего 312 байт. Это действительно так.
Теперь о программе которую я поставил целью написать:
А задумка была такая, есть МК, к нему к порту "D" подключен 7-сегментный индикатор. А к порту "В" подключены 3 кнопки, к "В0", к "В1" и к "В2". После запуска программы индикатор ничего не высвечивает, а при нажатии на кнопки высвечивает соответствующие цифры.
Ничего у меня не получалось. А вот покопался, и кое что уже получается. Пока что эмуляция в Протеусе идет и кое что так как было задумано.
Вот исходный текст программы:
Код:
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>

//----------
void segchar (unsigned char i)
{
   switch (i)
   {
      case 1: PORTD = 0b11111001; break;
      case 2: PORTD = 0b10100100; break;
      case 3: PORTD = 0b10110000; break;
      case 4: PORTD = 0b10011001; break;
      case 5: PORTD = 0b10010010; break;
      case 6: PORTD = 0b10000010; break;
      case 7: PORTD = 0b11111000; break;
      case 8: PORTD = 0b10000000; break;
      case 9: PORTD = 0b10010000; break;
      case 0: PORTD = 0b11000000; break;
   }
}
//----------
int main(void)
{
   unsigned char i;
   //unsigned butcount=0,butstate=0;
   DDRD = 0xFF;
   DDRB = 0x00;
   PORTD = 0b00000000;
   PORTB = 0b00000000;
   while(1)
   {
      if (!(PINB&0b00000001))
      {
      i=0; segchar(i);
      }
      if (!(PINB&0b00000010))
      {
      i=1; segchar(i);
      }
      if (!(PINB&0b00000100))
      {
      i=2; segchar(i);
      }
      if (!(PINB&0b00001000))
      {
      i=3; segchar(i);
      }
      if (PINB==11111111)   
      {
      i=9; segchar(i);
      }
   
   _delay_ms(50);
   }
}

Но еще работает не совсем так как нужно.
При эмулировании в Протеусе сразу после запуска выполнения, появляется случайная комбинация сегментов индикатора.
На нажатие кнопок нет реакции, кроме последней 4 кнопки.
После ее нажатия уже выводиться на индикаторе цифра "3", и после этого цуже все начинает работать так как нужно.
Т.е. после нажатия на кнопку "1" загорается цифра "0"
после нажатия на кнопку "2" загорается цифра "1"
после нажатия на кнопку "3" загорается цифра "2"
после нажатия на кнопку "4" загорается цифра "3"
И работает так как нужно, каждая кнопка вызывает свою цифру на индикаторе.
Вот в прилождении подсылаю соответствующий файл Протеуса.

Re: Что неправильно в коде ?

Пт мар 25, 2022 13:57:05

if (PINB==11111111) забыт признак двоичной системы

Re: Что неправильно в коде ?

Пт мар 25, 2022 16:05:22

ВСе уже сделал правильно, заработало так как нужно.
Да существенно что программа написана для Attiny261.
После запуска в Протеусе, 7-сегментный индикатор не светиться, программа ждет реакции на кнопки.
Если нажимать кнопки от "1" до "5" подключенные к ногам А0....А4 порта "А", то на индикатору будут высвечиваться соответствующие цифры - от "0" до "4", в зависимости от того какая кнопка нажата.
Теперь осталось только запрограммировать МК Attiny261 т проверить работу на реальний схеме. Как только это сделаю отпишусь.
Здесь привожу полный текст программы:
Код:
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>

//----------
void segchar (unsigned char i)
{
   switch (i)
   {
      case 1: PORTB = 0b11111001; break;
      case 2: PORTB = 0b10100100; break;
      case 3: PORTB = 0b10110000; break;
      case 4: PORTB = 0b10011001; break;
      case 5: PORTB = 0b10010010; break;
      case 6: PORTB = 0b10000010; break;
      case 7: PORTB = 0b11111000; break;
      case 8: PORTB = 0b10000000; break;
      case 9: PORTB = 0b10010000; break;
      case 0: PORTB = 0b11000000; break;
   }
}
//----------
int main(void)
{
   unsigned char i;

   DDRB = 0xFF;
   DDRA = 0x00;
   PORTB = 0b11111111;
   PORTA = 0b11111111;
   while(1)
   {
      if   (!(PINA&0b00000001))
      {
      i=0; segchar(i);
      }
      if   (!(PINA&0b00000010))
      {
      i=1; segchar(i);
      }
      if   (!(PINA&0b00000100))
      {
      i=2; segchar(i);
      }
      if   (!(PINA&0b00001000))
      {
      i=3; segchar(i);
      }
      if   (!(PINA&0b00010000))
      {
      i=4; segchar(i);
      }   
   _delay_ms(5);
   }
}

Re: Что неправильно в коде ?

Вс мар 27, 2022 01:18:59

И опять облом!!! Не могу залить программу в Attiny261.
Мучаюсь второй день.
Уже пытался пробовать залить простейшую программу мигания светодиода, .... и никак.
ПРобовал используя AvrDUDEPROG.EXE. версии 3.3 Вроде все правильно, программатор обнаружился, порт установлен правильно, чип правильный - Attiny261. При нажатии на "ЧТЕНИЕ" процесс проходит так как нужно и выдает сообщение - ЦКалибровочные ячейки генератора считаны ОК"
Запускаю программирование - программирование идет и посте 10-12 сек. миргания выдает сообщение -
Сброс Lick битов ... ОК
Очистка Flash.....ОК
Программирование Flash ....ОК
Верификация Flash ....ОК
А программа не работает, светодиод не моргает. Хотя в Протеусе программа работает нормально и светодиод моргает.
Что это может быть ????

Re: Что неправильно в коде ?

Вс мар 27, 2022 01:28:07

Ничего не знаю о Вашем "железе" и не вижу фото тестовой конструкции, поэтому банально спрашиваю: после программирования есть ли высокий уровень на RESET (напр. резистор 10 kOm к +)?
---
hex для сравнения: AТtiny261 blink на PB3 (pin 4):
Вложения
blink_pb3_pin4.zip
(731 байт) Скачиваний: 75

Re: Что неправильно в коде ?

Вс мар 27, 2022 13:50:56

Да, RESET подтянут к "+" через 11ком. !0ком не нашел, я думаю что это не критично. И еще кондексатор 10uF между RESET и землей, прочитал от этом в сатье, что нужно обязательно.
На счет схемы соединений, каюсь, не подумал, постараюсь нарисовать и показать.
Да е еще информация, как то сразу от этом не подумал, что можно ведь провести верификацию заливки, для этого есть средства.
Так что сегодня повторил и провел верификацию, и вот результат:
Поле верификации сообщение - "Верификация Flash....OK!"
И еще ниже информация:
\Debug\test9.hex":a

avrdude.exe: AVR device not responding
avrdude.exe: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.

avrdude.exe done. Thank you.

Т.е. какая т о ошибка при инициализации, вроде неправильность с подсоединении. Но я сто раз проверял. Буду искать.

Добавлено after 3 hours 15 minutes 49 seconds:
Вот нарисовал подключение контролера к программатору:
[img]
Изображение
[/img]
В процессе рисования обнаружил ошибку в подключении RESET, была подключена к 8 ноге МК(не понимаю как я так сделал), а нужно к 10 ноге.
Перепаял. Снова проделал процесс программирования в AVRDUDEPROG. И ничего не изменилось, сообщение что программирование и проверка прошло ОК. А в нижнем окне все равно вот твкое сообщение:
\Debug\test9.hex":a

avrdude.exe: AVR device not responding
avrdude.exe: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.

avrdude.exe done. Thank you.
ПРооверил подключение еще раз - все подключено теперь правильно, но программа не работает.

Re: Что неправильно в коде ?

Вс мар 27, 2022 14:15:18

Подключите ATtiny261 RESET не к Arduino RESET, а к D10 (Arduino as ISP?), либо отключите его (пусть он будет присоединен резистором к +) и вручную заземлите во время записи.

Re: Что неправильно в коде ?

Вс мар 27, 2022 15:12:14

Сделал все по рекомендации, вот схемка:
[img]
Изображение
[/img]
Пробовал снова хапрограммировать.
Все та же самая история, все тот же результат и те же сообщения.

Re: Что неправильно в коде ?

Вс мар 27, 2022 15:49:08

Дайте фото если можно, будет что-то элементарное: монтаж или что-то там ...
Попробуйте файл blink_pb3_pin4 сообщения вверх, светодиод мигает на pin 4.

Re: Что неправильно в коде ?

Пн мар 28, 2022 00:04:30

Давать фото бесполезно, я сделал все на унниверсальной плате, все припаяно навесным монтажем, по фотографии трудно будет разобраться.
Я вот что сделаю, смонтирую все на макетной плате чтобы все было хорошо видно. Сделаю фото и выставлю.
Но это займет немного времени.
А пока по вашему совету (пару постов выше) я замерил напряжение на "RESET"ю
До программирования было - 4,63В
После програамирования - тоже 4,63В
Сделал кнопку и пробовал программировать наверное раз 15 чтобы вовремя в начале программирования нажать кнопку. Ничего не получилось, все как и прежде, напряжение на "RESET" - 4,63 В.
Сделаю на макетке и пришлю фотку.

Re: Что неправильно в коде ?

Пн мар 28, 2022 00:08:36

10 мин назад для себя попробовал именно так и успешно записал для теста ATtiny13a. На бредборде.
Програматор: Arduino, с ArduinoISP. Софт: avrdudess_2.13_portable.
RESET AVR - к D10 Arduino. MCU записывается и читается нормально.
Скриншоты могут быть полезны для Вашего микроконтроллера.
Вложения
c3.jpg
(238.13 KiB) Скачиваний: 54
c2.gif
(17.57 KiB) Скачиваний: 50
c1.jpg
(154.33 KiB) Скачиваний: 53

Re: Что неправильно в коде ?

Пн мар 28, 2022 09:49:43

Вот высылаю как обещал фотку с монтажем на макетной плате. ТОже пробовал прорраммировать с кнопкой и5-6 раз и все то же самое.
[img]
Изображение
[/img]
Спасибо за присылку скриншотов.
Уже скачал вашу версию АВРДУДЕ Портейбл.
Буду пробовать.
Еще раз спасибо за участие.

Re: Что неправильно в коде ?

Пн мар 28, 2022 10:20:14

На фото мало что видно из-за низкого разрешения, но думаю что ... микросхема подключили наоборот :) - ключ для 1-го пина с другой стороны. Просто вставьте чип наоборот :) и если он остался работающий ...
---
внизу: на втором фото - ATtiny261 из интернета - большой круг копуса: на контактах 10-11.
Вложения
s-l1600.jpg
(38.52 KiB) Скачиваний: 47
2rbk631t7p_w.jpg
(220.71 KiB) Скачиваний: 52

Re: Что неправильно в коде ?

Пн мар 28, 2022 11:24:54

Уже попробовал запрогреммировать в новом AVRDUDE.
Вроде запрограммировалось. Вот скрин зделал:
[img]
Изображение
[/img]
ПРошу проверить, все ли так как нужно ?
Потому что программа не работает, светодиод не мигает.

Re: Что неправильно в коде ?

Пн мар 28, 2022 11:33:53

- корпус был наоборот? (см. предыдущее сообщение)
- добавьте скорость передачи Baud rate: 19200
- попробуйте найти автоматически mcu: Detect
- попробуйте прочитать фюзы: Fuses & lock bits Read
- если с чтением все в порядке, fuses в порядке (были прочитаны), то можно попробовать записать hex.
Последний раз редактировалось veso74 Пн мар 28, 2022 11:37:34, всего редактировалось 1 раз.

Re: Что неправильно в коде ?

Пн мар 28, 2022 11:36:17

Прошу извинить, прислал не то что нужно. НЕ ту кнопку нажал.
Теперь высылаю уже фактически скриины программирования и проверки.
Вот скрин программирования:
Изображение
А это скрин проверки:
Изображение
ВСе равно программа не работает, светодиод не мигает.
Ответить