ассемблер ногодрыг

Тема в разделе "Микроконтроллеры AVR", создана пользователем Ардуинщик55055, 17 сен 2018.

?

какая плата

  1. атмега

    0 голосов
    0,0%
  2. уно

    0 голосов
    0,0%
  3. нано

    3 голосов
    42,9%
  4. про мини

    0 голосов
    0,0%
  5. еще какие то спец платы

    1 голосов
    14,3%
  6. и те и другие

    3 голосов
    42,9%
  1. parovoZZ

    parovoZZ Гуру

    я уже удалил, успел перехватить))) Я ж внутренней частотой мыслю))) То бишь 8 МГц.
     
  2. parovoZZ

    parovoZZ Гуру

    мы можем и данные и синхронизацию выдавать за один раз. С таймером так не выйдет.
     
  3. b707

    b707 Гуру

    нисколько, имхо - выход все время в высоком состоянии, какой же это ногодрыг?
     
  4. parovoZZ

    parovoZZ Гуру

     
  5. AlexU

    AlexU Гуру

    Ни чё не понял.
    Таймер работает от тактовой частоты контроллера. Можно с точностью до такта указать, когда таймер переключит состояние ноги.
     
  6. parovoZZ

    parovoZZ Гуру

    Если выставить бит CKOUT в фьюзе, то с одноименной ноги можно тупо снимать тактовую. Но как подобраться к fuse битам из программы - мне не ведомо.
     
  7. parovoZZ

    parovoZZ Гуру

    Допустим - нам надо выставить известные 8 бит со стробом. Как это сделать на таймере с частотой в половину от тактовой?
     
  8. Asper Daffy

    Asper Daffy Иксперд

    Тоже мне, бином Ньютона
    Код (C++):
    #define    LFUSE    0
    #define    HFUSE    3
    #define    EFUSE    2
    #define    LOCKB    1

    uint8_t readFuse(const uint8_t fuse = 0) {
        uint8_t retval = 0;
        __asm__ __volatile__ (
            "mov zl, %[param] \n"  
            "ldi zh, 0 \n"
            "in    r25, %[reg] \n"
            "ori    r25, %[mask] \n"
            "out    %[reg], r25 \n"
            "lpm    %[retval], Z \n"
        :  [retval] "=r" (retval)
        :  [reg] "I" (_SFR_IO_ADDR(SPMCSR)), [mask] "I" (bit(BLBSET) | bit(SPMEN)), [param] "r" (fuse)
        : "r25", "r30", "r31"
        );
        return retval;
    }

    void setup() {
        Serial.begin(115200);
        Serial.print("Low fuse="); Serial.println(readFuse(LFUSE), HEX);
        Serial.print("High fuse="); Serial.println(readFuse(HFUSE), HEX);
        Serial.print("Extended fuse="); Serial.println(readFuse(EFUSE), HEX);
        Serial.print("Lock bits="); Serial.println(readFuse(LOCKB), HEX);
    }

    void loop() {}
     
     
  9. parovoZZ

    parovoZZ Гуру

    А запись то где?
    И можно к коду комментарии? Откуда взялись mask, reg?
     
  10. Asper Daffy

    Asper Daffy Иксперд

    Я думал Вам чтение нужно, а не запись. Запись можно, конечно, но только в режиме программирования.

    Комментарии в даташите на 328P, раздел 26.2.2.

    mask и reg - просто имена переменных. Замените на kaka и mumu (только везде) - ничего не изменится.

    А вообще фьюзы и локбиты читаются просто. Нужно сделать три вещи
    1. В регистр Z засунуть число от 0 до 3, которое отвечает за то, что именно будет прочитано (см. дефайны в начале, если я их не напутал :))
    2. В регистре SPMCSR выставить в 1 биты BLBSET и SPMEN
    3. В течение не более 4-х тактов после этого прочитать заказанный байт командой lpm
    Собственно, именно это здесь и делается. Ничего больше.
     
    parovoZZ и DetSimen нравится это.