Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 144 из 159 ПерваяПервая ... 4494134141142143144145146147154 ... ПоследняяПоследняя
Показано с 1,431 по 1,440 из 1581

Тема: Микроконтроллеры AVR

  1. #1431

    Регистрация
    14.06.2018
    Адрес
    Санкт-Петербург
    Сообщений
    1,025
    16 байт
    Код:
    00000000 <.sec1>:
       0:    b9 9a           sbi    0x17, 1    ; 23
       2:    8f ef           ldi    r24, 0xFF    ; 255
       4:    98 2f           mov    r25, r24
       6:    01 97           sbiw    r24, 0x01    ; 1
       8:    97 ff           sbrs    r25, 7
       a:    88 bb           out    0x18, r24    ; 24
       c:    e1 f7           brne    .-8          ;  0x6
       e:    f9 cf           rjmp    .-14         ;  0x2
    Здеся я сдулся, хоть нутром и чую, что тоже не предел

    Добавлено через 34 минут(ы):

    Накаркал (:
    14 байт
    Код:
    00000000 <.sec1>:
       0:    b9 9a           sbi    0x17, 1    ; 23
       2:    31 97           sbiw    r30, 0x01    ; 1
       4:    31 97           sbiw    r30, 0x01    ; 1
       6:    f7 ff           sbrs    r31, 7
       8:    e8 bb           out    0x18, r30    ; 24
       a:    e1 f7           brne    .-8          ;  0x4
       c:    fa cf           rjmp    .-12         ;  0x2
    10 байт.. уже даже не смешно.
    Код:
    00000000 <.sec1>:   0:    b9 9a           sbi    0x17, 1    ; 23
       2:    31 97           sbiw    r30, 0x01    ; 1
       4:    f7 ff           sbrs    r31, 7
       6:    e8 bb           out    0x18, r30    ; 24
       8:    fc cf           rjmp    .-8          ;  0x2
    Вложения Вложения
    • Тип файла: zip blink.zip (208 байт, Просмотров: 47)
    • Тип файла: zip blink.zip (216 байт, Просмотров: 41)
    • Тип файла: zip blink.zip (212 байт, Просмотров: 44)
    Последний раз редактировалось ozforester; 25.01.2023 в 04:16.


  2. #1432

    Регистрация
    12.09.2006
    Адрес
    Болгария, Силистра, KN34PC
    Сообщений
    1,463
    Позывной
    LZ2WSG
    ATtiny13A с MicroCore к Arduino IDE. "Сон" по кнопку "power on/off" ("глубокий сон": все остановлено ).

    При "пробуждении" хотел "сброса МК" (из-за возможного долгого стояния sleep (дни, месяцы) не могу рассчитывать на корректно сохраненные данные в RAM-памяти. Предпочитаю получать их из EEEPROM с первоначальным установлением периферии). Долгий поиск для методов софт-ресета, со множеством проб.

    Этот начин сработал. Теперь работает как кнопочный Т-триггер: работает (нагрузка потребляет ток) / не работает (нет потребления, ток как по документации без watchdog, даже не могу реально измерить).
    Код:
            sei();
            WDTCR &= ~(1 << WDTIE);               // disable watchdog timer interrupt
            set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // sleep
            sleep_enable();
            sleep_cpu();
            //----------
            sleep_disable();          // wake up
            WDTCR |= (1 << WDTIE);    // enable watchdog timer interrupt
            asm volatile ("rjmp 0");  // soft reset
    Другие возможные пути?
    Последний раз редактировалось veso74; 14.02.2023 в 20:54.

  3. #1433

    Регистрация
    14.06.2018
    Адрес
    Санкт-Петербург
    Сообщений
    1,025
    Джам на 0, это джам на джам на начало программы. Нет ресета реального, у регистров нет начального состояния и т.п. Я бы попробовал после пробуждения разрешить вотчдогу ресет с небольшим прескалером и уйти в реальный ресет. Если нужно знать по вотчдогу или по питанию был ресет, есть специальный бит у вотчдога в одном из котрольных регистров. (не помню на память, но разделы ресета и вотчдога в даташите короткие) Если в еепром сохраняются данные, то можно и по еепрому дселать вывод был ли ресет. Если у вотчдога разрешить прерывание и ресет, то можно сначала обработать прерывание и по выходу из него ресетнуться. Из такого "последнего" прерывания, наверное, можно и еепром записать тоже.

    Вот откуда это в памяти застряло
    Нажмите на изображение для увеличения. 

Название:	Screenshot_2023-02-14_23-07-08.jpg 
Просмотров:	53 
Размер:	44.4 Кб 
ID:	385006
    Последний раз редактировалось ozforester; 14.02.2023 в 23:11.

  4. #1434

    Регистрация
    12.09.2006
    Адрес
    Болгария, Силистра, KN34PC
    Сообщений
    1,463
    Позывной
    LZ2WSG
    Да, с rjmp было понятно, било первое рабочее решение.
    ---
    Код:
            sei();
            set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // sleep
            sleep_enable();
            sleep_cpu();
            //----------
            sleep_disable();  // wake up
            wdt_enable(WDTO_60MS);
    и в самом начале:
    MCUSR = 0;
    wdt_disable();
    Работает. МК и периферия не потребляют ток в состоянии покоя.

  5. #1435

    Регистрация
    14.06.2018
    Адрес
    Санкт-Петербург
    Сообщений
    1,025
    Ну, да. Если быть точным, то схема ресета, таймер вотчдога и энергосбережение это всё таки разные сущности, хотя и тяготеют друг к другу. Я понял пост, что необходим физический ресет по схеме, и так как ног у этого мк мало, то вырисовывается только вотчдог. Да, его нужно выключать перед сном, но после пробуждения и запрета сна, можно сконфигурить по нему ресет, ребутнуться, отметиться, что ресет прошел успешно, и опять запретить или там прескалер сменить на нужный и оставить лишь прерывание. Затем можно читать еепром и до следующего цикла сна выполнять задачи. Примерно так.

    Скрытый текст

    На недвних rtc-часах без вочдога обошелся в итоге, просто счетчик ставил в главном цикле, не хватало пары байтов. Вотчдог чуть больше команд требовал. А будил по int0, той же кнопкой что устанавливают календарь. Потому и не успел ещё забыть эти разделы даташита (:


  6. #1436

    Регистрация
    12.09.2006
    Адрес
    Болгария, Силистра, KN34PC
    Сообщений
    1,463
    Позывной
    LZ2WSG
    Нет, достаточно запустить программу сначала, с новой инициализацией периферии, потому что периферия остановлена ​​(по питанию, на меньший ток, иначе тоже есть sleep, но потребляет тока) во время сна. Радио на FM-модуль. У EEPROM: последняя использованная радиочастота и усиления. Пока одна кнопка (on/off). Остальные функции (и кнопки) проверены во временем. МК не так сильно потребляет ток, что тоже засыпает после какой-либо функции, но это тоже вариант. Просто эксперименты .
    Последний раз редактировалось veso74; 15.02.2023 в 00:30.

  7. #1437

    Регистрация
    14.06.2018
    Адрес
    Санкт-Петербург
    Сообщений
    1,025
    Еще иногда можно у вектора вотчдога указать ресет-вектор, и если программа "тупит" то будет начинаться с начала, а не рестаротвать и дергать ногами. Иногда актуально. Про эксперименты понятно. Я иногда на очевидный вопрос пропускаю ответ и отвечаю на такой же интересный ближайший, пока это не начинает раздражать (:

  8. #1438

    Регистрация
    14.06.2018
    Адрес
    Санкт-Петербург
    Сообщений
    1,025
    Случайно заглядываем под капот,

    Нажмите на изображение для увеличения. 

Название:	Screenshot_2023-05-21_18-42-38.png 
Просмотров:	105 
Размер:	357.0 Кб 
ID:	389174

    и что мы там видим?

    Скрытый текст


    Код:
    /usr/share/arduino/arduino-builder -dump-prefs -logger=machine -hardware /usr/share/arduino/hardware -hardware /home/oleg/.arduino15/packages -tools /home/oleg/.arduino15/packages -libraries /home/oleg/Arduino/libraries -fqbn=MicroCore:avr:13:clock=9M6,eeprom=keep,BOD=2v7,bootloader=no_bootloader -ide-version=10819 -build-path /tmp/arduino_build_149944 -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=/home/oleg/.arduino15/packages/MicroCore/tools/avrdude/7.1-arduino.1 -prefs=runtime.tools.avrdude-7.1-arduino.1.path=/home/oleg/.arduino15/packages/MicroCore/tools/avrdude/7.1-arduino.1 -prefs=runtime.tools.arduinoOTA.path=/home/oleg/.arduino15/packages/arduino/tools/arduinoOTA/1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=/home/oleg/.arduino15/packages/arduino/tools/arduinoOTA/1.3.0 -prefs=runtime.tools.avr-gcc.path=/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -verbose /home/oleg/Arduino/sketch_may21a/sketch_may21a.ino
    /usr/share/arduino/arduino-builder -compile -logger=machine -hardware /usr/share/arduino/hardware -hardware /home/oleg/.arduino15/packages -tools /home/oleg/.arduino15/packages -libraries /home/oleg/Arduino/libraries -fqbn=MicroCore:avr:13:clock=9M6,eeprom=keep,BOD=2v7,bootloader=no_bootloader -ide-version=10819 -build-path /tmp/arduino_build_149944 -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=/home/oleg/.arduino15/packages/MicroCore/tools/avrdude/7.1-arduino.1 -prefs=runtime.tools.avrdude-7.1-arduino.1.path=/home/oleg/.arduino15/packages/MicroCore/tools/avrdude/7.1-arduino.1 -prefs=runtime.tools.arduinoOTA.path=/home/oleg/.arduino15/packages/arduino/tools/arduinoOTA/1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=/home/oleg/.arduino15/packages/arduino/tools/arduinoOTA/1.3.0 -prefs=runtime.tools.avr-gcc.path=/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=/home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -verbose /home/oleg/Arduino/sketch_may21a/sketch_may21a.ino
    Using board '13' from platform in folder: /home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0
    Using core 'microcore' from platform in folder: /home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0
    Detecting libraries used...
    /home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -E -CC -mmcu=attiny13a -DF_CPU=9600000L -DARDUINO=10819 -DARDUINO_attiny -DARDUINO_ARCH_AVR -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/cores/microcore -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/variants/attiny13a /tmp/arduino_build_149944/sketch/sketch_may21a.ino.cpp -o /dev/null -DARDUINO_LIB_DISCOVERY_PHASE
    Generating function prototypes...
    /home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -E -CC -mmcu=attiny13a -DF_CPU=9600000L -DARDUINO=10819 -DARDUINO_attiny -DARDUINO_ARCH_AVR -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/cores/microcore -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/variants/attiny13a /tmp/arduino_build_149944/sketch/sketch_may21a.ino.cpp -o /tmp/arduino_build_149944/preproc/ctags_target_for_gcc_minus_e.cpp -DARDUINO_LIB_DISCOVERY_PHASE
    /usr/bin/arduino-ctags -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives /tmp/arduino_build_149944/preproc/ctags_target_for_gcc_minus_e.cpp
    Compiling sketch...
    /home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=9600000L -DARDUINO=10819 -DARDUINO_attiny -DARDUINO_ARCH_AVR -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/cores/microcore -I/home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/variants/attiny13a /tmp/arduino_build_149944/sketch/sketch_may21a.ino.cpp -o /tmp/arduino_build_149944/sketch/sketch_may21a.ino.cpp.o
    Compiling libraries...
    Compiling core...
    Using previously compiled file: /tmp/arduino_build_149944/core/pcrt.S.o
    Using previously compiled file: /tmp/arduino_build_149944/core/millis.S.o
    Using previously compiled file: /tmp/arduino_build_149944/core/wiring.c.o
    Using previously compiled file: /tmp/arduino_build_149944/core/wiring_analog.c.o
    Using previously compiled file: /tmp/arduino_build_149944/core/WInterrupts.c.o
    Using previously compiled file: /tmp/arduino_build_149944/core/wiring_digital.c.o
    Using previously compiled file: /tmp/arduino_build_149944/core/wiring_pwm.c.o
    Using previously compiled file: /tmp/arduino_build_149944/core/wiring_shift.c.o
    Using previously compiled file: /tmp/arduino_build_149944/core/wiring_pulse.c.o
    Using previously compiled file: /tmp/arduino_build_149944/core/Print.cpp.o
    Using previously compiled file: /tmp/arduino_build_149944/core/Tone.cpp.o
    Using previously compiled file: /tmp/arduino_build_149944/core/WMath.cpp.o
    Using previously compiled file: /tmp/arduino_build_149944/core/WString.cpp.o
    Using previously compiled file: /tmp/arduino_build_149944/core/main.cpp.o
    Using previously compiled file: /tmp/arduino_build_149944/core/HalfDuplexSerial.cpp.o
    Using previously compiled file: /tmp/arduino_build_149944/core/micros.cpp.o
    Using previously compiled file: /tmp/arduino_build_149944/core/picoUART.cpp.o
    Using previously compiled file: /tmp/arduino_build_149944/core/picoUART_rxISR.cpp.o
    Using previously compiled file: /tmp/arduino_build_149944/core/core.a
    Linking everything together...
    /home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-gcc -w -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -g -fuse-linker-plugin -Wl,--gc-sections -mrelax -mmcu=attiny13a -nostartfiles -Wl,--undefined=__vectors -o /tmp/arduino_build_149944/sketch_may21a.ino.elf /tmp/arduino_build_149944/sketch/sketch_may21a.ino.cpp.o /tmp/arduino_build_149944/core/core.a -L/tmp/arduino_build_149944 -lm
    /home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/arduino_build_149944/sketch_may21a.ino.elf /tmp/arduino_build_149944/sketch_may21a.ino.eep
    /home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy -O ihex -R .eeprom /tmp/arduino_build_149944/sketch_may21a.ino.elf /tmp/arduino_build_149944/sketch_may21a.ino.hex
    chmod +x /home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/scripts/create_disassembler_listing.sh
    /home/oleg/.arduino15/packages/MicroCore/hardware/avr/2.3.0/scripts/create_disassembler_listing.sh /home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-objdump "--disassemble --source --line-numbers --demangle --section=.text" /tmp/arduino_build_149944/sketch_may21a.ino.elf /tmp/arduino_build_149944/sketch_may21a.ino_attiny13a_9600000L.lst
    /home/oleg/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-size -A /tmp/arduino_build_149944/sketch_may21a.ino.elf
    Sketch uses 192 bytes (18%) of program storage space. Maximum is 1024 bytes.
    Global variables use 0 bytes (0%) of dynamic memory, leaving 64 bytes for local variables. Maximum is 64 bytes.
    экспорт "бинарного файла"

    дизассемблирование c комментариями

    Код:
    avr-objdump -mavr -D sketch_may21a.ino_attiny13a_9600000L.hex
    
    00000000 <.sec1>:
    ЭТО ТАБЛИЦА ВЕКТОРОВ
       0:    0a c0           rjmp    .+20         ;  0x16
       2:    08 c0           rjmp    .+16         ;  0x14
       4:    07 c0           rjmp    .+14         ;  0x14
       6:    06 c0           rjmp    .+12         ;  0x14
       8:    05 c0           rjmp    .+10         ;  0x14
       a:    04 c0           rjmp    .+8          ;  0x14
       c:    03 c0           rjmp    .+6          ;  0x14
       e:    02 c0           rjmp    .+4          ;  0x14
      10:    01 c0           rjmp    .+2          ;  0x14
      12:    00 c0           rjmp    .+0          ;  0x14
      14:    18 95           reti
    ОБЫЧНО ОПРЕДЕЛЯЕТСЯ СТЕК, СБРАСЫВАЕТСЯ РЕГИСТР СТАТУСА И Т.П.
      16:    11 24           eor    r1, r1
      18:    cf 93           push    r28
      1a:    df 93           push    r29
      1c:    cd b7           in    r28, 0x3d    ; 61
      1e:    dd 27           eor    r29, r29
      20:    c0 51           subi    r28, 0x10    ; 16
      22:    cd bf           out    0x3d, r28    ; 61
      24:    78 94           sei
    ЗАГРУЖАЮТСЯ РЕГИСТРЫ ДАННЫМИ ДЛЯ ОПЕРАЦИИ ДЕЛЕНИЯ И ПОМЕЩАЮТСЯ В ПАМЯТЬ
    формируем и пишем в память 900000000 
      26:    80 e0           ldi    r24, 0x00    ; 0
      28:    99 ee           ldi    r25, 0xE9    ; 233
      2a:    a4 ea           ldi    r26, 0xA4    ; 164
      2c:    b5 e3           ldi    r27, 0x35    ; 53
      2e:    8d 87           std    Y+13, r24    ; 0x0d
      30:    9e 87           std    Y+14, r25    ; 0x0e
      32:    af 87           std    Y+15, r26    ; 0x0f
      34:    b8 8b           std    Y+16, r27    ; 0x10
    формируем и пишем в память 25000000
      36:    80 e4           ldi    r24, 0x40    ; 64
      38:    98 e7           ldi    r25, 0x78    ; 120
      3a:    ad e7           ldi    r26, 0x7D    ; 125
      3c:    b1 e0           ldi    r27, 0x01    ; 1
      3e:    89 87           std    Y+9, r24    ; 0x09
      40:    9a 87           std    Y+10, r25    ; 0x0a
      42:    ab 87           std    Y+11, r26    ; 0x0b
      44:    bc 87           std    Y+12, r27    ; 0x0c
    900000000, и 25000000 тоже, читаем обратно из памяти, хотя нехватки регистров не было (:
      46:    6d 85           ldd    r22, Y+13    ; 0x0d
      48:    7e 85           ldd    r23, Y+14    ; 0x0e
      4a:    8f 85           ldd    r24, Y+15    ; 0x0f
      4c:    98 89           ldd    r25, Y+16    ; 0x10
      4e:    29 85           ldd    r18, Y+9    ; 0x09
      50:    3a 85           ldd    r19, Y+10    ; 0x0a
      52:    4b 85           ldd    r20, Y+11    ; 0x0b
      54:    5c 85           ldd    r21, Y+12    ; 0x0c
    
    
    ВЫПОЛНЯЕТСЯ ДЕЛЕНИЕ
      56:    12 d0           rcall    .+36         ;  0x7c
    СОХРАНЯЕТСЯ ОДИН ИЗ РЕЗУЛЬТАТОВ ДЕЛЕНИЯ В ПАМЯТЬ (остальные игнорируются)
      58:    2d 83           std    Y+5, r18    ; 0x05
      5a:    3e 83           std    Y+6, r19    ; 0x06
      5c:    4f 83           std    Y+7, r20    ; 0x07
      5e:    58 87           std    Y+8, r21    ; 0x08
    СНОВА ЧИТАЮТСЯ ИЗ ПАМЯТИ ОПЕРАНДЫ ДЛЯ ДЕЛЕНИЯ
    900000000
      60:    6d 85           ldd    r22, Y+13    ; 0x0d
      62:    7e 85           ldd    r23, Y+14    ; 0x0e
      64:    8f 85           ldd    r24, Y+15    ; 0x0f
      66:    98 89           ldd    r25, Y+16    ; 0x10
    25000000
      68:    29 85           ldd    r18, Y+9    ; 0x09
      6a:    3a 85           ldd    r19, Y+10    ; 0x0a
      6c:    4b 85           ldd    r20, Y+11    ; 0x0b
      6e:    5c 85           ldd    r21, Y+12    ; 0x0c
    СНОВА ВЫПОЛНЯЕТСЯ ДЕЛЕНИЕ
      70:    05 d0           rcall    .+10         ;  0x7c
    СНОВА СОХРАНЯЕТСЯ ОДИН ИЗ РЕЗУЛЬТАТОВ В ПАМЯТЬ
      72:    69 83           std    Y+1, r22    ; 0x01
      74:    7a 83           std    Y+2, r23    ; 0x02
      76:    8b 83           std    Y+3, r24    ; 0x03
      78:    9c 83           std    Y+4, r25    ; 0x04
      7a:    ff cf           rjmp    .-2          ;  0x7a
    это сама ПОДПРОГРАММА ДЕЛЕНИЯ (около 66 команд с циклом 32 прохода в середине
    19 команд, ну пусть будут по одному такту все, итого 19*32=608 тактов,
    плюс лишний раз подготовка операндов, и.. два раза два раза.
      7c:    a1 e2           ldi    r26, 0x21    ; 33
      7e:    1a 2e           mov    r1, r26
      80:    aa 1b           sub    r26, r26
      82:    bb 1b           sub    r27, r27
      84:    fd 01           movw    r30, r26
      86:    0d c0           rjmp    .+26         ;  0xa2
      88:    aa 1f           adc    r26, r26      <---------------
      8a:    bb 1f           adc    r27, r27
      8c:    ee 1f           adc    r30, r30
      8e:    ff 1f           adc    r31, r31
      90:    a2 17           cp    r26, r18
      92:    b3 07           cpc    r27, r19
      94:    e4 07           cpc    r30, r20
      96:    f5 07           cpc    r31, r21
      98:    20 f0           brcs    .+8          ;  0xa2
      9a:    a2 1b           sub    r26, r18
      9c:    b3 0b           sbc    r27, r19
      9e:    e4 0b           sbc    r30, r20
      a0:    f5 0b           sbc    r31, r21
      a2:    66 1f           adc    r22, r22
      a4:    77 1f           adc    r23, r23
      a6:    88 1f           adc    r24, r24
      a8:    99 1f           adc    r25, r25
      aa:    1a 94           dec    r1
      ac:    69 f7           brne    .-38         ;  0x88 -------->
      ae:    60 95           com    r22
      b0:    70 95           com    r23
      b2:    80 95           com    r24
      b4:    90 95           com    r25
      b6:    9b 01           movw    r18, r22
      b8:    ac 01           movw    r20, r24
      ba:    bd 01           movw    r22, r26
      bc:    cf 01           movw    r24, r30
      be:    08 95           ret
    1. 32 битное деление можно сделать на регистрах общего назначения без обращения к памяти
    2. можно разделить один раз.

    неверная аналогия для двоичного деления, но как бы здесь это не важно:

    1. отнимаем в цикле делитель от делимого пока не получим нехватку делимого для очередного отнимания
    2. подсчитанное количество проделанных циклов отнимания = целая часть
    3. то негодное для отнимания, что осталось от делимого, т.е. остаток = числитель дроби
    4. то, на что делили (что отнимали) это делитель = основание или знаменатель дроби

    Все необходимое имеем в конце первой операции в виде 4+4+4= 12 регистров или ячеек памяти.

    Что делаем? Правильно, сохраняем целую часть, удаляем остаток для того, чтобы сразу же начать его вычислять .
    Microcore, attiny13, параметры компиляции и сборки выше.

    Последний раз редактировалось ozforester; 21.05.2023 в 19:20.

  9. #1439

    Регистрация
    14.06.2018
    Адрес
    Санкт-Петербург
    Сообщений
    1,025

    Скрытый текст

    Имею собранную из доноров батарею в ноутбуке. Аккумуляторы в ней с разной остаточной емкостью. Время от времени приходится менять совсем плохие, на просто плохие. После того как ноутбук внезапно вырубается, ставлю батарею на ночь на зарядку и проверяю напряжение на отдельных элементах. Если какой-нибудь так и не поднялся выше 3.5, то вскрываю батарею и заряжаю отставший элемент отдельно. Через месяц эксплуатации он опять отстанет, и опять придется или дозаряжать, или заменять. Чтобы ещё до разборки оценить напряжение элементов собрал простое устройство на мк. Особого смысла в нём не было, батарея все равно вскрывается для замены элемента. Гнусные поделки - все эти батарейные контроллеры, и ещё гнуснее мысль шифровать их и блокировать. (=


    Просто поупражнялся с шиной и командами.
    Вложения Вложения
    • Тип файла: zip bat.zip (103.2 Кб, Просмотров: 46)


  10. #1440
    Господа! Нужен совет. Задача - нужно связать два контроллера по радио. То есть, нужно передать какое-то число от контроллера - передатчика к приемнику. Применяются простейшие китайские приемник-передатчик на 433 мгц. и два контроллера Atmega328. Попробовал использовать модуль USART. Передатчик и приемник, соединенные проводом обмениваются без проблем. А вот с радиоканалом никак. Проблема видимо в следующем - протокол UART, когда нет передачи данных, выдает на выходе тх единицу. Радиопередатчик, когда на него подается единица, выдает непрерывную немодулированную несущую. Радиоприемник, когда поступает непрерывный сигнал, выдает на своем выходе единицу, причем кратковременно, потом на выходе приемника - ноль. Кроме того, при достаточно высоком уровне сигнала, АРУ в приемнике уменьшает коэффициент усиления. Когда модуль UART начинает передачу, признаком начала служит спад уровня до нуля. Длительность этого спада определяется длительностью такта (зависит от битрейта, сейчас 9600). Так как в приемнике ноль присутствует все время, когда никакие данные не передаются, то, видимо, начало передачи приемник не распознает.
    Как решить эту проблему? Нужна конечно не программа, а алгоритм.
    Вот, например, если бы можно передавать не 8 бит, а скажем 12 или больше, загнать их в буфер и затем отделить последние, которые несут именно нужную информацию. Но, к сожалению UART, как только заполнится приемный буфер, а это 8 бит, выдает прерывание, что прием закончен, а там не то... Передать любое количество бит, из которых именно последние 8 нужные, не проблема. Но вот как приемнику сообщить, что именно эти 8 последних - нужная информация? Может есть какие-то протоколы и я велосипед изобретаю?

Страница 144 из 159 ПерваяПервая ... 4494134141142143144145146147154 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Микроконтроллеры PIC
    от R2DAD в разделе Конструкции на микроконтроллерах для радиолюбителей
    Ответов: 140
    Последнее сообщение: 29.10.2023, 10:32
  2. СОМ порт и микроконтроллеры
    от alex74 в разделе Технический кабинет
    Ответов: 1
    Последнее сообщение: 31.03.2008, 11:04

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •