эта конструкция с условным переходом давать шаг 150 нсек при 1 байте 300 при 2х байтах и 600 при 4х
напрашивается конструкция с 16 бит таймером и коррекцией времени перезагрузки например нужна задержка 100000+ начальная предустановка циклов это 65536+ 34464 - вторая предустановка таймера . все сложно но теоретических препятствий нет
Посмотрите в даташит описания регистров таймеров. В частности, для ATmega168
Код:
(1<<CS12) | (0<<CS11) | (0<<CS10)
(оно же 0b100) означает установку делителя в 256. При переходе на большую в 8 раз частоту надо бы и делитель в 8 раз увеличить, чтобы таймеры работали по-прежнему. Но максимум делителя (0b101) позволяет лишь увеличение в 4 раза.
Нужно смотреть, что там в прерывании происходит. Возможно, там сразу же TCNT1x подбрасываются до какого-то значения, чтобы быстрее досчитать до переполнения. Тогда помимо увеличения делителя в 4 раза нужно будет это значение тоже поменять, чтобы досчитывало вдвое дольше - итого получится требуемое 8-кратное замедление. Например, в Вашем случае при TCNT1 = 0xA473 = 42099 до переполнения остаётся 23436 тактов таймера. А нужно x2 = 46872 тактов, значит в прерывании надо выставлять TCNT1 в 65535-46872 = 18663 = 0x48E7
По прочим таймерам тоже надо смотреть их биты CSxx на предмет текущего делителя и его увеличения в 8 раз.
Ну я же написал, что надо по другим таймерам тоже делители смотреть. Да, 0x02 => 0x04 для Timer0 как раз повысит делитель в 8 раз. Но я бы лучше пользовался битами вида (1<<CS02), как и для первого. Так код более читабелен и портируем.
Подскажите. Есть два массива: unsigned char ENC_Data[8]; unsigned char ENC_SN[8]; Нужно передать в функцию адреса начала этих массивов. Чтоб можно было в этой функции с ними на ассемблере поколдовать. Как это сделать? Пример очень приветствуется.
может вам начать с чтения книг по языку Си? а то не понятно, откуда вы набрались своих знаний... unsigned char * - это указатель. в Си он (во всяком случае для AVR) совпадает по размерности с int, т.е. sizeof(unsigned char *) == sizeof(int) учите матчасть
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Неее спасибо. Моя язык паскаль. На С только в оооочень оооочень редких случаях и если ооочень сильно попросят. Даже вникать не хочу в тонкости avrовского языка у которого однобайтовые переменные резко в двухбайтовые превращаются, а Int с какого-то перепуга 2-х байтный.
Последний раз редактировалось realm Вт ноя 08, 2016 08:29:03, всего редактировалось 1 раз.
Даже вникать не хочу в тонкости языка у которого однобайтовые переменные резко в двухбайтовые превращаются
хозяин - барин, как говорится. в приведенном мною выше примере нет никаких однобайтных переменных (я о параметрах функции, через который вы хотели бы получить адрес начала массивов).
и боюсь вас огорчить: в паскале неявное преобразование типов постоянно и непрерывно происходит... а тот факт, что вы об этом не в курсе, лишь говорит о вашем уровне неуча.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Никто не во что не превращается. Переменная может быть сколько угодно байт, а указатель асегда двухбайтовый (для AVR). Если Вы не различаете переменную и указатель и даже не хотите пытаться это понять - дело Ваше.
Есть два массива: unsigned char DES_ENC_Data[8]; unsigned char DES_ENC_SN[8]; И функция: void tde (unsigned int Data_RAM_Address, unsigned int SN_RAM_Address) Которая написана на ассемблере. На входе она должна получить физический адрес нулевой ячейки массивов DES_ENC_Data и DES_ENC_SN. И никак по другому, иначе я на ассемблере с массивами работать не могу. Есть идеи? В С - шных заморочках я не селен.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения