Обсуждаем контроллеры компании Atmel.
Вс дек 06, 2020 13:27:22
BOB51 писал(а):У адуринки есть другой способ
я все пытаюсь как-то от ардуинки выше подпрыгнуть.
Ну так пока с переменным успехом. Нужны базовые знания по МК и логике.
Вот пытаюсь разобраться.
Вс дек 06, 2020 22:56:37
А я наоборот - к абсолютным знаниям по конкретным кристаллам под ассемблером добавил ардуинкин Си/С++.
теперь для прикладного применения в максимально жестких условиях можно "переферийку с мозгом" под ассемблером и с полным "потрошением" МК соорудить, а для дальнейшей обработки уже "ардуиноподобные" поставить.
Вариантов подхода достаточно много...
Пн янв 18, 2021 23:08:50
И снова здравствуйте!
Вот есть у меня такая задумка
Добавлено after 25 minutes 18 seconds:есть синтезатор на аttiny13 и lm7001
Lm 7001 управляется с тиньки по 3 пинам
Добавлено after 2 minutes 51 second:Помогите разобраться
у меня есть код для тиньки, он для СБ диапазона
А мне нужно для Двойки сделать
Вот код в котором я попробовал тупо написать частоту Двойки и мою ПЧ. Не удивительно, что ничего у меня не вышло.
- Код:
typedef unsigned char byte ;
typedef unsigned int real ;
#include <tiny13.h>
#include <bcd.h>
#include <delay.h>
#define CE PORTB.2
#define CL PORTB.1
#define DA PORTB.0
void lm7001SendByte(byte k)
{
byte i ;
for (i = 0; i < 8; i++) {
if (k&0x1) DA = 1;
else
DA = 0;
delay_us(3);
CL = 1;
delay_us(3);
CL = 0;
k = k >> 1;
delay_us(3);
DA = 0;
}
}
// Формируем команды
void send_lm7001(){
real divisor;
//divisor = (27030 + 465) / 10; //делим на шаг заданный программно для микросхемы
divisor = (140575 + 10700) / 10; //делим на шаг заданный программно для микросхемы
// частота + ПЧ
// пример: (частота + пч) * (кварц / шаг делителя) / реальный кварц
// (27135 + 455) * (7200 / 10) / 7200 = 2759
// (27135 + 455) * (7200 / 9) / 8000 = 2759
CL = 0;
CE = 1;
delay_us(3);
lm7001SendByte(divisor & 0x00FF);
lm7001SendByte((divisor & 0xFF00)>>8);
lm7001SendByte(0b11010000);
// Настройка делителя синтезатора (1-Fmin,101 - 9кГц шаг)
// (1-Fmin, 001 - 10кГц шаг)
delay_us(3);
CE = 0;
}
void main(void)
{
PORTB=0x00;
DDRB=0x07;
delay_ms (20);
send_lm7001(); // отправляем частоту
delay_ms (200);
while (1)
{
#asm("sleep");
}
}
подскажите как сделать что бы работало для Двойки.
Добавлено after 2 minutes 43 seconds:счас частота стоит на 161 102.5 что бы я не менял в коде.
Понимаю что не понимаю сути, но пробовал читать, но увы.
Вт янв 19, 2021 13:42:02
http://radio-hobby.org/modules/news/art ... oryid=1155почитал здесь, только вот не совсем понимаю
Рассмотрим примеры составления управляющей последовательности. Предположим, что синтезатор применен в УКВ радиоприемнике с промежуточной частотой 10,7 МГц, который принимает сигнал с несущей частотой 100 МГц. Шаг частотной сетки — 50 кГц.
Найдем необходимый коэффициент деления частоты. Если гетеродин работает на частоте ниже принимаемой, его частота равна 100 - 10,7 = 89,3 МГц. Коэффициент деления
Кдел = 89300:50 = 1786 = 6FA (hex) = 0110 1111 1010 (bin).
на входе F in подаем частоту с гетеродина, а оцифрованнгое значение этой частоты где находится и как сравнивается?
Вт янв 19, 2021 13:43:36
Тип данных unsigned int применённый для переменной divisor в микроконтроллерах AVR ограничен размером 2 байта или числа 0...65000. Возможно в этом и проблема, стоит попробовать изменить тип данных на больший.
Вт янв 19, 2021 14:45:13
Кстати да. Только 65535 максимальное.
Да вообще если эта часть так и будет статической, лучше макросом задавать.
- Код:
#define DIVISOR (140575 + 10700)/10;
...
lm7001SendByte(DIVISOR & 0x00FF);
lm7001SendByte((DIVISOR & 0xFF00)>>8);
...
Так оно будет вычисляться на этапе компиляции и не тратить кучу ресурсов МК на лишние расчет. Но если уже как есть, то вот так:
- Код:
divisor = (unsigned long)(140575 + 10700) / 10;
Последний раз редактировалось
NStorm Вт янв 19, 2021 19:08:22, всего редактировалось 1 раз.
Вт янв 19, 2021 17:14:11
radteh писал(а):Тип данных unsigned int применённый для переменной divisor
а я сюда смотрю
- Код:
real divisor;
а оказывает есть еще
- Код:
typedef unsigned char byte ;
typedef unsigned int real ;
ок, буду пробовать. спасибо.!
Вт янв 19, 2021 19:08:05
Да, в Си нет такого типа, как "real". Но typedef позволяет создавать свои типы.
Вт янв 19, 2021 20:23:33
NStorm,
- Код:
divisor = (unsigned long)(140575 + 10700) / 10;
не прокатило!
сижу, дальше чешу репу.
напряжение стоитт колом на выходе синтезатора.
Добавлено after 41 minute 1 second:поставил в другой приенмик и перешил снова на 27030 - все отлично работает. Напряжение скачет как-только катушку гетеродина трогаю
Ср янв 20, 2021 03:20:20
А переменная так и осталась объявлена как real? Если переменная объявлена как real (unsignet int), а присваивается значение unsignet long, то он всё равно не влезет.
Ср янв 20, 2021 08:59:13
radteh, там присваивается только тому, что в скобках (140575 + 10700), потом оно делится на 10 и должно влезть. Для теста просто можно написать divisor = 15127; временно.
Ср янв 20, 2021 10:36:51
NStorm писал(а):divisor = 15127
так это число в 2 байта влазит. Тогда зачем до unsignet long расширять?
Я тут прикинул , запущу приенмик на 28000, поменяю контур и посмотрю будет ли работать, может это прибавит ясности.
Это я к тому что может выход гетеродина как-то не так себя ведет.
Ср янв 20, 2021 10:56:23
olegue, это если вы напишите сразу это значение. Когда вы пишите divisor = (140575 + 10700)/10, компилятор смотрит на тип divisor и обрезает значение скобок до его величины, т.е. до 0xFFFF, потом делит уже это значение на 10 и в divisor попадает 6553, а не 15127. Чтобы этого не происходило, я сначала и предложил написать (unsigned long), чтобы 140575 и 10700 компилятор сложил как 32-битную величину.
Добавлено after 8 minutes 18 seconds:
Хотя с оптимизацией тут возможно как статическую величину на этапе компиляции и посчитает правильно...
Ср янв 20, 2021 20:07:32
NStorm,
понял, согласен. Попробую.
Добавлено after 3 hours 40 minutes 17 seconds:
Воткнул эту строчку
divisor = 15127;
Но, увы, напряжение стоит колом, а частота гетеродина гдето вдалеке от 151 270
Придется применить план Б и запустить приемник гдето в районе 28000 кгц
Добавлено after 37 minutes 5 seconds:
может с выходом гетеродина что-то не так.
Добавлено after 4 hours 36 minutes 59 seconds:
Не реагирует Lm7001 на сигнал с 20 вывода мс3362
странно, частотомер туда вешаю, и он мне частоту показывает
вывод 20 нормально на 3.3к повесил, коворят там открыты коллектор.
Странно
Пт янв 22, 2021 05:13:31
А нет ли нужды менять кварц на LM7001?
Вт июн 01, 2021 17:11:43
И снова здравствуйте!
У меня есть код синтезатора для Attiny13 и Lm7001 на четыре частоты (автор
audiocd)
Код написан для CodeVisionAVR.
Но я решил тоже потренировать и дорабоать код. для Этого решил перенести его в Proteus, но там как известно синтаксис WinAvr
поэтому я перебил на WinAVR, но не смог одолеть поддержску EEProm.
В итоге вообще не стал использовать EEprom. Просто объявил массив частот. Но все равно не уверен что все работает хорошо, так как в отладличке Протеуса в переменной
Frq, т.е вычесленную частоту вижу какую-то дичь.
Вот что получилось в протеусе
В железе не провелял. Осцилографом в Протеусе посмотрел, вроде дает сигналы на соответствующие ноги Лм7001, но вот в том что все правильно большие сомнения
посмотрите пож если кому не лень
Интересует правильно ли расчитывается частота в переменной
FrqДобавлено after 6 minutes 54 seconds:
Вт июн 01, 2021 18:00:50
с чего это в протеусе винавр? кому это известно?
Вт июн 01, 2021 19:17:34
olegue, к Протеусу можно подключить CVAVR и использовать его.
Вт июн 01, 2021 19:25:39
используемый компилятор задаем при создании проекта, winAvr, masm и еще что то
Добавлено after 44 seconds:
NStorm, была такая мысль, но я не нашел как это сделать
Вт июн 01, 2021 20:03:32
В меню System вроде есть настройки компиляторов. Там надо указать путь к CVAVR, тогда его станет давать выбирать. Но точно не скажу.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.