Jump to content

На чем писать  

580 members have voted

  1. 1. Что чаще используете в разработках?

    • Assembler
      162
    • C
      295
    • Что-то еще
      62


Recommended Posts

Ошибка где-то в программе. Я попробовал компилировать правильнее, такой последовательностью

#

rm -f lighting_c.o lighting_c.lst lighting_c.hex lighting_c.elf
avr-gcc -c -Wall -mmcu=atmega1284p -Wa,-warn,-als=lighting_c.lst,-mmcu=atmega1284p,"-o lighting_c.o" lighting_c.S
set stts = $?
/bin/echo "gcc status="$stts
if ( $stts == 0 ) then
avr-ld -o lighting_c.elf lighting_c.o
set stts = $?
/bin/echo "ld status="$stts
if ( $stts == 0 ) then
#avr-objcopy -j .text -j .data -O ihex lighting_c.elf lighting_c.hex
avr-objcopy -S -O ihex lighting_c.o lighting_c.hex
set stts = $?
/bin/echo "as status="$stts
endif
endif

и получил сообщение от avr-ld

gcc status=0
avr-ld: avr:51 architecture of input file `lighting_c.o' is incompatible with avr output
avr-ld: lighting_c.elf section `.text' will not fit in region `text'
avr-ld: region `text' overflowed by 53454 bytes

Пётр.

Edited by Peter_I

Share this post


Link to post
Share on other sites

Вроде бы надо вызов avr-ld делать так:

avr-ld -o lighting_c.elf -b binary lighting_c.o

при этом всё строится, но hex по-прежнему неправильный из-за ошибки в секции .text.

Если отказаться от части, начинающейся с

.org 0xF000

то создаётся hex-файл размером 1506.

Пётр.

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Новинки и уникальные решения Molex. На что обратить внимание и почему»

15 апреля приглашаем на вебинар, который будет интересен разработчикам и инженерам-схемотехникам, интересующимся тенденциями рынка, новыми перспективными решениями для соединений «провод-провод», «провод-плата», «плата-плата». Для инженеров КИПиА и IT будут освещены уникальные решения Molex для «удлинения» интерфейсов HDMI, DisplayPort и USB даже в условиях сильного зашумления, а также семейство бесконтактных датчиков Contrinex. Помимо этого, будет уделено внимание дальнейшему развитию направления антенн, где Molex имеет ряд интересных и уникальных решений.

Подробнее

Ещё вот возник вопрос: в программе для ATmega1284 адреса векторов прерывания должны быть кратны 2 или 4?

У него FLASH - 128K. Я заметил, что команда jmp отбирает 4 байта памяти.

Пётр.

Share this post


Link to post
Share on other sites
                     

Как снизить потери при включении силового ключа: простая схема управления скоростью нарастания

Снижение потерь на переключения в силовых электронных системах, например, в приводах, зачастую противоречит требованиям ЭМС и ограничивается таким параметром как скорость нарастания напряжения. Простой способ решения, предлагаемый Infineon – параллельное использование двух традиционных драйверов.

Читать статью

тема из "кто на чем пишет" превратилась в - пофик кто на чем пишет, надо на асме )


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Эту таблицу, я, конечно, видел, но, как я понял из iom1284p.h, в байтах вектор прерываний занимает (35 * 4),

т.е. 4 байта на каждый jmp. М.б., это адреса в словах?

И почему-то у меня avr-ld считает, судя по map-файлу, что размер .data - 65440, а размер .text - 8192, хотя это SRAM имеет размер 8K.

Пётр.

Share this post


Link to post
Share on other sites

Ещё есть различия. Если avr-gcc сам вызывает линковщик и строит elf,

либо он создаёт o-файл и я сам вызываю avr-ld с подключением того, что ему надо.

В 1-м случае размер text в map-файле правильный - 0x20000, а во 2-м почему-то 0x2000,

а длина data в в 1-м случае0xff00, а во 2-м - 0xffa0.

Если же в 1-м случае через avr-gcc передать линковшику -Tmem_def, он ниже,

то длина data становится равной указанному - 0x2000, т.е. 8KB, но hex остаётся неправильной длины,

а во 2-м, когда -Tmem_def указывается непосредственно как опция avr-ld,

происходит его крах.

MEMORY
{
text (xr) : ORIGIN = 0x0000000000000000, LENGTH = 0x0000000000020000
data (rw !x) : ORIGIN = 0x0000000000800100, LENGTH = 0x0000000000002000
eeprom (rw !x) : ORIGIN = 0x0000000000810000, LENGTH = 0x0000000000010000
fuse (rw !x) : ORIGIN = 0x0000000000820000, LENGTH = 0x0000000000000400
lock (rw !x) : ORIGIN = 0x0000000000830000, LENGTH = 0x0000000000000400
signature (rw !x) : ORIGIN = 0x0000000000840000, LENGTH = 0x0000000000000400
user_signatures (rw !x) : ORIGIN = 0x0000000000850000, LENGTH = 0x0000000000000400
}

Пётр.

Edited by Peter_I

Share this post


Link to post
Share on other sites

Эту таблицу, я, конечно, видел...

Команда jmp занимает 4 байта(2 слова). Размер адреса памяти программ 1 слово. Поэтому, когда получаете адрес массива из области памяти программ, его надо умножать на 2. Например, ldi zl,low(имя<<1).

Share this post


Link to post
Share on other sites

Эту таблицу, я, конечно, видел...

Команда jmp занимает 4 байта(2 слова). Размер адреса памяти программ 1 слово. Поэтому, когда получаете адрес массива из области памяти программ, его надо умножать на 2. Например, ldi zl,low(имя<<1).

Да, я так и предполагал.

Осталось последнее - добиться, чтобы при отведении места под bootloader, а он занимает старшие килобайты FLASH,

hex строился правильного размера, а не в полтора раза больше. Т.е. он начинается с адреса 0xF000, если адрес в словах

то это и есть начало последних 8K из 128K, а hex получается 171K, а не 120K. пока не понял, где у меня ошибка.

Пётр.

Кстати, насчёт умножения на 2 и в книге сказано, но у меня вместо low() и ligh() - lo8() и hi8().

Edited by Peter_I

Share this post


Link to post
Share on other sites

Посмотрите структуру hex. Там много избыточной информации (адреса, кс). Преобразуйте его в bin, тогда увидите истинный размер. Сейчас Вы делаете две таблицы векторов прерываний. Зачем?

Share this post


Link to post
Share on other sites

Посмотрите структуру hex. Там много избыточной информации (адреса, кс). Преобразуйте его в bin, тогда увидите истинный размер. Сейчас Вы делаете две таблицы векторов прерываний. Зачем?

Как я понял из описания процессора, если запрограммирован BOOTRST, то по сбросу управление передастся на адрес 0xF000,

поэтому там и должны находится и переход на загрузчик и далее вектор прерываний. Когда bootloader закончит работу, он передаёт

управления на адрес 0, там, как обычно, находится переход на собственно программу и за ним - рабочий вектор прерываний,

перенести указатель на который должен тоже bootloader. В описании именно так и с примером.

Посмотреть hex я бы и сам хотел, но мне до сих пор никогда не приходилось этого делать.

Я не знаю, есть ли специальная программа для его просмотра или как преобразовать его в bin.

Вообще там область между концом программы и bootloader просто заполняется нулями.

Пётр.

Share this post


Link to post
Share on other sites

Странно, пытаешься написать программу для контроллера а не знаешь как открыть любой файл на просмотр... может, еще и MS-DOS не застал? и файлы *.DBF?


Учение - изучение правил. Опыт - изучение исключений.

Share this post


Link to post
Share on other sites

Intel HEX

Это просто текстовый файл.

Так-то я его смотрел во viewer'e, но формата не знал, хотя адреса там ясно видны.

Благодарю за ссылку. Конечно, удобнее бы смотреть специальной для этого программой.

Пётр.

Странно, пытаешься написать программу для контроллера а не знаешь как открыть любой файл на просмотр... может, еще и MS-DOS не застал? и файлы *.DBF?

DOS застал, но не помню, чтобы мне приходилось работать с файлами *.dbf. Вообще я с базами данных дела не имел.

Мне приходилось делать небольшие программы на ассемблере для IBM PC и для PIC,

но ещё ни разу не требовалось просматривать прошивку.

Пётр.

Edited by Peter_I

Share this post


Link to post
Share on other sites

Пётр, прошивка для МК - это далеко не исполняемый файл, как .exe на PC. Не путайте.

.hex - это обычный текстовый файл, в котором хранятся данные в текстовом представлении. Естественно, объём такого файла будет в разы больше объёма самих данных.

Share this post


Link to post
Share on other sites

Пётр, прошивка для МК - это далеко не исполняемый файл, как .exe на PC. Не путайте.

.hex - это обычный текстовый файл, в котором хранятся данные в текстовом представлении. Естественно, объём такого файла будет в разы больше объёма самих данных.

Несколько лет назад мне приходилось иметь дело с программой для AVR, написанной на C другим человеком.

Когда мне приходилось записывать получившийся hex в микроконтролер, то, насколько я помню, там требовалось,

чтобы он был не больше размера FLASH. Опять же я не интересовался, как именно hex записывается в МК,

но по работе avreal у меня сложилось впечатление, что один к одному. Она может также и считать прошивку

из МК и результат совпадал с ранее зашитым hex. Это был atmega168.

А в данном случае hex получился больше FLASH.

Пётр.

Share this post


Link to post
Share on other sites

Возможно, там был какой-нибудь бинарный файл (что-то типа .bin). Тогда объём будет совпадать, т.к. данные хранятся в явном виде.

Share this post


Link to post
Share on other sites

Возможно, там был какой-нибудь бинарный файл (что-то типа .bin). Тогда объём будет совпадать, т.к. данные хранятся в явном виде.

Нет, это был именно hex, такого же формата, как и у меня сейчас. Он получался в полтора раза меньше, чем elf.

Но мне сейчас подтвердили, что это bin записывается как есть, а из hex при записи в МК команды извлекаются.

Действительно, не записывать же в него двоеточия.

Пётр.

Edited by Peter_I

Share this post


Link to post
Share on other sites

Здравствуйте!

Возник дополнительный вопрос.

Вообще я удовлетворился полученными здесь разъяснениями, но хотелось бы получить больше гибкости

и я попытался avr-gcc вызывать только для компиляции, с опцией "-c", а потом самому вызывать avr-ld

и это у меня не получилось.

Во-первых, в map-файле размер сегмента .text оказывается 0x2000,

а не 0x20000, как должно быть и как получается, когда avr-gcc сам строит elf.

Во-вторых, avr-ld при этом не извлекает .text из объектного файла, т.е. собственно программы нет в elf,

а "avr-objcopy -t .text" даёт пустой hex, только с конечной строкой.

В-третьих, при указании опции -Tmem_def, где mem_def - это файл с описанием распределения памяти,

с avr-ld происходит segmentation fault, а когда всё делает avr-gcc и передаёт эту опцию линковщику через Wl,

он её принимает. При этом оказалось, что она должна идти после -Map=<map-file>, а иначе тоже происходит крах.

Ниже приведён маленький скрипт на tcsh, в котором я сам вызываю avr-ld, а за ним mem_def.

Образец mem_def я взял из программы, написанной другим человеком и приспособил к своим условиям.

Не скажете ли, что не так в скрипте? Там надо смотреть две строки после #crtm1284p.o only.

#

set flnm = $1
rm -f ${flnm}.o ${flnm}.lst ${flnm}.hex ${flnm}.elf ${flnm}.map
avr-gcc -c -o ${flnm}.o -Wall -mmcu=atmega1284p -Wa,-warn,-als=${flnm}.lst,-mmcu=atmega1284p,"-o ${flnm}.o" ${flnm}.S
#avr-gcc -c -o ${flnm}.o -Wall -mmcu=atmega1284p -Wa,-warn,-als=${flnm}.lst,-mmcu=atmega1284p ${flnm}.S
set stts = $?
/bin/echo "as status="$stts

#crtm1284p.o only
#avr-ld -r -S -o ${flnm}.elf -Map=${flnm}.map -Tmem_def -b binary /usr/lib/avr/lib/avr51/crtm1284p.o -b binary ${flnm}.o
avr-ld -r -S -Map=${flnm}.map -o ${flnm}.elf -b binary /usr/lib/avr/lib/avr51/crtm1284p.o -b binary ${flnm}.o

#crtm1284p.o and libgcc.a
#avr-ld -r -S -Map=${flnm}.map -Tmem_def -L /usr/lib/gcc/avr/4.8.2/avr51 -b binary -lgcc -L /usr/lib/avr/lib/avr51 -b binary -lc -lm -o ${flnm}.elf -b binary /usr/lib/avr/lib/avr51/crtm1284p.o -b binary ${flnm}.o
#avr-ld -r -S -Map=${flnm}.map -L /usr/lib/gcc/avr/4.8.2/avr51 -b binary -lgcc -L /usr/lib/avr/lib/avr51 -b binary -lc -lm -o ${flnm}.elf -b binary /usr/lib/avr/lib/avr51/crtm1284p.o -b binary ${flnm}.o

#crtm1284p.o, libgcc.a, libc.a, libm.a
#avr-ld -r -S -L -Map=${flnm}.map -Tmem_def /usr/lib/gcc/avr/4.8.2/avr51 -b binary -lgcc -o ${flnm}.elf -b binary /usr/lib/avr/lib/avr51/crtm1284p.o -b binary ${flnm}.o
#avr-ld -r -S -L -Map=${flnm}.map /usr/lib/gcc/avr/4.8.2/avr51 -L /usr/lib/avr/lib/avr51  --start-group -b binary -lgcc -b binary -lc -lm --end-group -o ${flnm}.elf -b binary /usr/lib/avr/lib/avr51/crtm1284p.o -b binary ${flnm}.o
set stts = $?
/bin/echo "ld status="$stts
if ( $stts == 0 ) then
avr-objcopy -j .text -O ihex ${flnm}.elf ${flnm}.hex
set stts = $?
/bin/echo "objcopy status="$stts
endif

mem_def:

MEMORY
{
 text (xr) :						   ORIGIN = 0x0000000000000000, LENGTH = 0x0000000000020000
 data (rw !x) :					    ORIGIN = 0x0000000000800100, LENGTH =  0x0000000000002000
 eeprom (rw !x) :					  ORIGIN = 0x0000000000810000, LENGTH = 0x0000000000010000
 fuse (rw !x) :					    ORIGIN = 0x0000000000820000, LENGTH = 0x0000000000000400
 lock (rw !x) :					    ORIGIN = 0x0000000000830000, LENGTH =  0x0000000000000400
 signature (rw !x) :		   ORIGIN = 0x0000000000840000, LENGTH =  0x0000000000000400
 user_signatures (rw !x) : ORIGIN = 0x0000000000850000, LENGTH = 0x0000000000000400
}

Пётр.

Share this post


Link to post
Share on other sites

С МК AVR начал работать в 2007 году. Писал только на асме и был ярым его поклонником. Но когда начал делать проекты с многоуровневым меню, понял что пора переходить на си. В этот момент я отложил все проекты, пока более-менее не освоил си. С тех пор все мои проекты на си. Многие проекты на асме перенес на си. На асме писал примеры для форумов, и пару-тройку раз писал простенькие тестовые программки, когда срочно нужно было кое-что проверить. Ни одного проекта на асме не было написано с тех пор как перешел на си.

Share this post


Link to post
Share on other sites

mikroPascal


В окружающем нас мире мы можем встретить два радикально противоположных взгляда на программирование:

• Взгляд А: Программирование в основном весьма просто. • Взгляд В: Программирование – это очень сложно.

(Э. Дейкстра)

Share this post


Link to post
Share on other sites

Си как таковой уже давно стал лишь оболочкой в серьезных проектах. Говорить о нем как о чистом языке уже врятли будет уместным. Асм так же уже давно стал нишевым.

Так что чистого пречистого языка уже не встретить наверное


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

угу, я тоже на паскале. Вполне себе. Удобно. Если чего, можно ассемблерную вставку.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • Guest Роман
      By Guest Роман
      Добрый день, форумчане. Такая задача. Хочу создать несколько устройств на светодиодах. Задача каждого в том, чтобы от движения (датчик вибрации, наклона) светодиод начинал моргать, переливаться и т.д. Подпитывается всё от батарейки, конечно же как можно меньших размеров (таблетка).
      Собственно я уже реализовал такое пробное устройство на ATtiny13, вибродатчике 18015 и батарейке CR1220. Всё работает, но хотелось бы это дело и удешевить и уменьшить в размерах, если это конечно же возможно. Особо в параметрах МК я не разбираюсь, но могу сказать что мне от неё точно нужно:
      1) Маленький размер
      2) Как минимум 1 канал ШИМ (а лучше 3, для переливания трёх светодиодов RGB)
      3) Память на 1Кб (программу для одного такого устройства приложу ниже, может её можно и сократить, но не факт что такую же, но на три диода получится ужать)
      4) Низкое потребление или возможность подключения режимов с низким потреблением.
      5) Работа от 3В. (от таблетки)
      6) Возможность программирования через Arduino UNO (но другие варианты тоже рассматриваю, просто Arduino уже есть)

      Повторюсь пока что нашел и использовал только ATtiny13, который меня вполне устроил, но он достаточно дорогой и в корпусе SOIC его найти достаточно проблематично. К тому же как мне показалось, он слишком хорош для такого проекта. Повторюсь, я чайник, и может есть какие-то более дешевые аналоги.

      Очень надеюсь на Вашу помощь. Заранее большое Вам спасибо!
      Прикладываю обещанный мною код:
      int vib = 4; int led = 0; long loopTime = 5000; void setup() { pinMode(led, OUTPUT); pinMode(vib, INPUT); } void loop() { if (digitalRead(vib)){ unsigned long currentMillis = millis(); while(millis()-currentMillis<=loopTime) { for(int fadeValue = 0; fadeValue <=255; fadeValue+=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 255; fadeValue >=0; fadeValue-=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 0; fadeValue <=255; fadeValue+=5){ analogWrite(led,fadeValue); delay(2); } for(int fadeValue = 255; fadeValue >=0; fadeValue-=5){ analogWrite(led,fadeValue); delay(2); } digitalWrite(led, LOW); delay(600); } } }  
    • By Evgeniy90
      Здравствуйте! Столкнулся со следующей проблемой: при сборке МД "Шанс" дошел до этапа прошивки МК, в итоге запорол 3 атмеги. Прошивал 3 способами:
      1. Через Arduino UNO(As ISP) просто МК
      2. Через Arduino UNO(As ISP) МК внутрисхемно(соответственно с обвязкой)
      3. Через USB ASP внутрисхемно(с обвязкой соответственно).
      Вышло так, что в наличии кварца 11.0592 МГц не было, и я временно впаял 12 МГц. Прошил трижды всё правильно(фьюзы , контакты и т.д). После прошивки просто не видит МК (ну и плата не работает без МК.да и Бог с ней, но МК всеравно не могу считать). В чем причина понять не могу. Одно думаю, что это разница между 11.0592 и 12 МГц. Посоветуйте как решить проблему.
      Коды ошибок после прошивки во всех трёх случаях одинаковые:
      Sinaprog -invalid device signature
      Averdude -avrdude: warning: cannot set sck period, please check for usbasp firmware update
      target don't answer
    • By Engineerr
      Кто использует microPascal for AVR? 
      Полезные ссылки, программы, примеры.
    • By Sova
      Добрый день. Опять ATMega, опять таймер 1, вопрос рутинный, но я за сегодня уже извёлся. Что я хотел сделать: МК должен рассчитывать положения моторов (SG90, регулируются временем импульса), включать их все вместе по совпадению таймера 2, затем рассчитывать, когда какой мотор надо отключить, получившийся список сортировать и ставить таймер 1. Таймер 1 сработал - выключили мотор, переставили таймер 1 на подальше. Снова сработал - снова что-то там сделали, увеличили OCR1A и так далее. Конечно же с первого раза не заработало и я начал упрощать и локализировать проблему.
      Получилось вот что: при срабатывании прерывания на совпадение таймера 1 с OCR1A я смотрю в отладчик - а там во-первых TIFR = OCF1A + OCF1B + TOV1, а TCNT1 равен чему угодно, но не OCR1A. Таймер как будто срабатывает не тогда. А когда я ставлю значение поменьше, допустим, OCR1A = 1000 и перехожу в пустой цикл while(1){}, то при наступлении OCR1A == 1000 просто ничего не происходит, прерывание не срабатывает. В целом так. Сейчас очень упрощённый, минимально не работающий код выглядит так:
      #define SET(_REGISTER, _BIT) _REGISTER |= 1 << _BIT #define UNSET(_REGISTER, _BIT) _REGISTER &= ~(1 << _BIT) void local_timer_setup(void) { SET(TCCR1B, CS10); //Setting timer 1 to x1 mode }; void local_timer_start(void) { TCNT1 = 0; SET(TIMSK, OCIE1A); //Allow timer 1 match A interruption }; void local_timer_off(void) { UNSET(TIMSK, OCIE1A); //Prohibit timer 1 match A interruption }; ISR(TIMER1_COMPA_vect) { PORTD = 0xFF; local_timer_off(); }; ISR(TIMER2_COMP_vect) { if (global_timer_count == 2) { global_timer_count = 0; TIFR = 0; PORTD = 0; if (current_step < 10) OCR1A = 0xFFF; else OCR1A = 0xFFFF; if (current_step == 20) current_step = 0; else current_step++; local_timer_start(); } else global_timer_count++; }; Полный код в файле. sei() не забыл. Кстати, таймер нормально выключать/включать через TIMSK, как у меня? Заранее спасибо. 
      Scarecrow_embeded.rar
    • By dron92
      Подскажите как вернуть к жизни контролер или в утиль!
      Решил собрать программатор AVRISP mkII купил микросхему собрал подключил а устройств нет в диспетчере и  Flip не видит его!
      Начал искать косяки в сборке не нашел решил спаять Отладочная плату
      тот же результат, попробовал подключить через ISP не отвечает !
      Решил пойти на крайние меры  подключил через FuseDoctor сигнатуру он не видел вел 1e9482 вроде увидел но результата сбросить не проучилось но теперь он начал видится в таком формате фото внизу




  • Сообщения

    • Думал и РУз перешёл, у меня в новострое меньше 230в не бывает, обычно в районе 240-250в.
    • Снято с продажи. Тема закрыта.
    • — То есть выходом из сделки с ОПЕК нам все-таки удалось их уесть и заставить прекратить добычу? — Если к концу года хотя бы в результате каких-то заявлений цена подскочит до 40-45 долларов, вся сланцевая нефть снова пойдет, ее добычу очень легко возродить, легко вернуться на остановленные скважины, возобновить гидроразрыв — завершение работ на пробуренной скважине. У них потенциал колоссальный. Хоронить сланцевую нефть не надо, она выстоит. А вот если сейчас придется глушить наши скважины, то многие месторождения просто будут утрачены. Хорошо, если вернуть к жизни удастся 20 процентов. — Вы не верите, что Россия и Саудовская Аравия договорятся 9 апреля. А когда они могут договориться? И о чем в итоге? ..... Я ожидаю сначала, как я уже говорил, каких-то санкций для российских государственных компаний — «Роснефть», «Зарубежнефть», «Татнефть» и так далее. Потом, возможно, вообще эмбарго на нефтяную торговлю с Россией. Тогда никому не потребуется снижать добычу, мировые цены будут поддержаны только за счет того, что Россию уберут с глобального рынка. Это будет колоссальный удар и по российской нефтяной отрасли, и по российскому бюджету. Из интервью М.Крутихина https://novayagazeta.ru/articles/2020/04/08/84795-rossiyu-prosto-uberut-rynka  
    • Акустика в продаже.
×
×
  • Create New...