LINUX.ORG.RU

Не могу поморгать светодиодом на arduino mega2560

 ,


2

2

Код крайне примитивен:

#include <stdbool.h>
#include <avr/io.h>

int main(void)
{
    DDRB |= 1 << 7;

    while (true)
    {
        volatile long int i;
        for (i = 0; i < 50000; i++)
          ;
        PORTB |= 1 << 7;
        for (i = 0; i < 50000; i++)
          ;
        PORTB &= ~(1 << 7);
    }

    return 0;
}

Если собираю и заливаю из arduino ide, то все ок.

Если собираю avr-gcc и заливаю через usbasp, то не работает. Сам usbasp рабочий.

Собираю так:

avr-gcc -mmcu=atmega2560 -o test.elf test2.c
avr-objcopy -O binary test.elf test.bin
avrdude -c usbasp -p atmega2560 -U flash:w:test.bin

Я как-то в непонимании, что я делаю не так

UPD: заливка прошивки проходит нормально, но светодиод не мигает.

UPD2: fuses E:FD, H:D8, L:FF

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 5)

Так посмотри, как заливает ардуина, с какими параметрами. На первый взгляд - не задана частота

vvviperrr ★★★★★
()
Ответ на: комментарий от vvviperrr

А, сама то заливка проходит норм. Но светодиод не моргает

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от sergej

ну конкретно в sei смысла тут нет, т.к. нет прерываний. Но мне вообще не понятно, а что еще может тут требоваться, кроме указания того, что PB7 работает на выход?

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от sergej

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

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от sergej

При этом то же самое, но на atmega328p, работает

cvs-255 ★★★★★
() автор топика

А ты ассемблер получившийся посмотрел? Он случайно пустые циклы не выкидывает как бессмысленные? Оптимизирует как бы. Вот эти:

for (i = 0; i < 50000; i++)
Zubok ★★★★★
()

Должно работать, лень форматировать, подправь под себя (шил atmega8)

#include <avr/io.h>
#include <util/delay.h>


void main() {

    DDRB = 0b00000001;
    
    while (1) {
        PORTB = 0b00000001;
        _delay_ms(SPEED);
        PORTB = 0b00000000;
        _delay_ms(SPEED);
    }
}
compile:
		avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -O2 -g -o src.o src.c

convert:
		avr-objcopy -O ihex  src.o  src.hex


write:
		avrdude  -p atmega8  -c avr910  -P /dev/ttyACM0  -U flash:w:src.hex

test:
		avrdude -n -p atmega8  -c avr910  -P /dev/ttyACM0

clear:
		avrdude -p atmega8  -c avr910  -P /dev/ttyACM0  -e
#clearf:
#		avrdude -p atmega8  -c avr910  -P /dev/ttyACM0 -U lfuse:w:0xe1:m -U hfuse:w:0xd9:m

clean:
		rm ./*.hex ./*.o

LINUX-ORG-RU ★★★★★
()

Если собираю и заливаю из arduino ide, то все ок.

Если собираю avr-gcc и заливаю через usbasp, то не работает.

Была похожая фигня - крутил mcu, baudrate и board_tag. Но уже не помню вынул из ардуино студии или перебором нашёл. Но я через arduino-mk собирал.

ya-betmen ★★★★★
()

Выяснилось в ходе обсуждения на avrfreaks, что проблема в usbasp. Он какую-то фигню загружал в контроллер вместо прошивки, т.к. он плохо работает при объеме флешки более 128к

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от Oberstserj

Вот я тоже совсем не ожидал такой подлянки. Зашиваю код через ардуино, читаю -cwiring - прочиталось то, что надо. читаю -cusbasp - читается куча 0xFF.

Т.е. он и читает тоже плохо

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от Oberstserj

Вот пример того, что прочиталось через usbasp

0000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
*
0360000 0d 94 89 f1 0d 94 b2 f1 0d 94 b2 f1 0d 94 b2 f1
0360020 0d 94 b2 f1 0d 94 b2 f1 0d 94 b2 f1 0d 94 b2 f1
*
0360340 0d 94 b2 f1 41 54 6d 65 67 61 32 35 36 30 00 41
0360360 72 64 75 69 6e 6f 20 65 78 70 6c 6f 72 65 72 20
0360400 73 74 6b 35 30 30 56 32 20 62 79 20 4d 4c 53 00
0360420 42 6f 6f 74 6c 6f 61 64 65 72 3e 00 48 75 68 3f
0360440 00 43 6f 6d 70 69 6c 65 64 20 6f 6e 20 3d 20 00
0360460 43 50 55 20 54 79 70 65 20 20 20 20 3d 20 00 5f
0360500 5f 41 56 52 5f 41 52 43 48 5f 5f 3d 20 00 41 56
0360520 52 20 4c 69 62 43 20 56 65 72 3d 20 00 47 43 43
0360540 20 56 65 72 73 69 6f 6e 20 3d 20 00 43 50 55 20
0360560 49 44 20 20 20 20 20 20 3d 20 00 4c 6f 77 20 66
0360600 75 73 65 20 20 20 20 3d 20 00 48 69 67 68 20 66
0360620 75 73 65 20 20 20 3d 20 00 45 78 74 20 66 75 73
0360640 65 20 20 20 20 3d 20 00 4c 6f 63 6b 20 66 75 73
0360660 65 20 20 20 3d 20 00 4d 61 72 20 20 37 20 32 30
...

И вот что через wiring:

0000000 0c 94 72 00 0c 94 7e 00 0c 94 7e 00 0c 94 7e 00
0000020 0c 94 7e 00 0c 94 7e 00 0c 94 7e 00 0c 94 7e 00
*
0000340 0c 94 7e 00 11 24 1f be cf ef d1 e2 de bf cd bf
0000360 00 e0 0c bf 0e 94 80 00 0c 94 8f 00 0c 94 00 00
0000400 8f ef 84 b9 2f ef 83 ec 99 e0 21 50 80 40 90 40
0000420 e1 f7 00 c0 00 00 85 b1 80 95 85 b9 f3 cf f8 94
0000440 ff cf ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0000460 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
*
...

И как раз второе довольно (с точностью до того, что еще добавляется загрузчик) совпадает с бинарником, который зашивался:

0000000 0c 94 72 00 0c 94 7e 00 0c 94 7e 00 0c 94 7e 00
0000020 0c 94 7e 00 0c 94 7e 00 0c 94 7e 00 0c 94 7e 00
*
0000340 0c 94 7e 00 11 24 1f be cf ef d1 e2 de bf cd bf
0000360 00 e0 0c bf 0e 94 80 00 0c 94 8f 00 0c 94 00 00
0000400 8f ef 84 b9 2f ef 83 ec 99 e0 21 50 80 40 90 40
0000420 e1 f7 00 c0 00 00 85 b1 80 95 85 b9 f3 cf f8 94
0000440 ff cf
cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 2)
Ответ на: комментарий от cvs-255

А не пробовал на пониженной частоте? Я помню когда еще с аспом игрался ставил перемычку на пониженную частоту на постоянку. Как раз из-за косяков с некоторыми контроллерами.

Oberstserj ★★
()

Прошивай последнюю прошивку в usbasp https://www.fischl.de/usbasp/

Changelog.txt

usbasp.2011-05-28 (v1.4)
------------------------
...
- added support for controllers with flash >128kb (by Slawomir Fraś)
С Ali присылают с более старой прошивкой.
Удобно шить вторым таким-же. Соединяй их шлейфом что идет с ними. У подопытного замкни джампер нужный для обновления прошивки и шей как-то так:
./avrdude -C../etc/avrdude.conf -e -v -pm8 -cusbasp -b19200 -U flash:w:usbasp.atmega8.2011-05-28.hex

superuser ★★★★☆
()
Последнее исправление: superuser (всего исправлений: 3)
Ответ на: комментарий от superuser

Ещё согласно https://www.avrfreaks.net/forum/solved-avrdude-atmega8-reading-back-fuses-was...
перед прошивкой, я правил avrdude.conf. Вот патч:

--- a/hardware/tools/avr/etc/avrdude.conf
+++ b/hardware/tools/avr/etc/avrdude.conf
@@ -6640,9 +6640,9 @@
     # Required for Arduino IDE
     # see: https://github.com/arduino/Arduino/issues/2075
     #      https://github.com/arduino/Arduino/issues/2075#issuecomment-238031689
-    memory "efuse"
-        size            = 0;
-      ;
+    #memory "efuse"
+    #    size            = 0;
+    #  ;
 
     memory "lock"
         size            = 1;

Но наверно прошьётся и без патча

superuser ★★★★☆
()
Последнее исправление: superuser (всего исправлений: 1)

PORTB |= 1 << 7; , PORTB &= ~(1 << 7);

конец стр 68 https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microco...

13.2.2 Toggling the Pin Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the SBI instruction can be used to toggle one single bit in a port.

PINB = (1 << 7);

Емнип это даже меньше тактов процессора и инструкций во флеше. На тиньке 13 использую только так.

bga_ ★★★★
()
Ответ на: комментарий от superuser
  • added support for controllers with flash >128kb (by Slawomir Fraś)

Точно. Сам же перешивал на эту и как раз по этой же проблеме лет 7 назад.

Oberstserj ★★
()
Ответ на: комментарий от superuser

Но наверно прошьётся и без патча

Это не имеет значения, дудка один фиг все выставляет в нули не глядя на конф.

Oberstserj ★★
()
Ответ на: комментарий от Oberstserj

Да, без патча там просто вводящее в заблуждение сообщение
avrdude: safemode: Sorry, reading back fuses was unreliable. I have given up and exited programming mode

superuser ★★★★☆
()
Последнее исправление: superuser (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

А зачем компилировать в два прохода? Ну, в смысле, зачем линковка отдельно?

Я всю жись за раз делал…

pihter ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.