1

Тема: Вывод частоты на "ногу"

Доброго всем.
Попытаюсь объяснить по-русски. :-)
Какими методами можно вывести на определенный выход меандр? Такое вообще возможно в данном изделии?

2

Re: Вывод частоты на "ногу"

Неужели никто не знает как это сделать???

3

Re: Вывод частоты на "ногу"

rusmax пишет:

Неужели никто не знает как это сделать???

Знают наверное, но почему-то не отвечают.
Задачу можно решить разными путями. Самый простой (если больше ничем микроконтроллер заниматься не будет) - это выставлять ногу в 1, делать паузу, выставлять в 0, делать еще паузу. И все это в цикле.
Более правильных путей решения проблемы несколько.
В микроконтроллере ATmega168 есть 3 таймера, и ШИМ на нагаз 3, 5, 6, 9, 10, 11 управляются ими.
По умолчанию на ногах 5 и 6 частота около 1кГц, а на остальных - около 500Гц.
Выставив например через analogWrite(11, 128); значение 128 на 11й ноге - мы получим 50% меандр на частоте
около 500Гц.
Перепрограммируя таймеры можно менять частоту и разрешение таймеров.
Несколько полезных ссылок на английском:
http://softsolder.wordpress.com/2009/02 … frequency/
http://www.arduino.cc/cgi-bin/yabb2/YaB … 764073/all
http://www.cs.mun.ca/~rod/Winter2007/47 … imer0.html
http://www.arduino.cc/cgi-bin/yabb2/YaB … 1195922336
http://usethearduino.blogspot.com/2008/ … duino.html

Если Вы напишете какую частоту нужно получить, я нарисую соответствующий кусочек кода.

4

Re: Вывод частоты на "ногу"

Admin пишет:
rusmax пишет:

Неужели никто не знает как это сделать???

Знают наверное, но почему-то не отвечают.

Странная логика. Партизаны чтоль?

Спасибо, ознакомлюсь. Но т.к. я в eng не особо спец ждите, завалю вопросами.

Admin пишет:

Если Вы напишете какую частоту нужно получить, я нарисую соответствующий кусочек кода.

Нужно чтоб помимо своего основного назначения (ну программа и тд) на одной незадействованной ного был 3,5 МГц. Если такие частоты - это "нереально". То  хотябы 1 кГц, я его потом подам на модулятор сам.
Смысл затеи - умный радиомаяк.

5 (2009-10-08 16:45:04 отредактировано rusmax)

Re: Вывод частоты на "ногу"

Я так понял, что из всего выше подсказанного ЭТО более менее подходящее. Но как понимаю самое высокое что можно "выжать" из платы - это 31кГц... Хм... маловато.
И еще вопрос, а куда этот код прописать то? Чтоб получить эффект, попробовать так сказать.

If you use the default values set by the Arduino Diecimila's bootloader, these are your PWM frequencies:


Arduino Pins 5 and 6: 1kHz
Arduino Pins 9, 10, 11, and 3: 500Hz


How do you change the PWM frequency?
In the void setup() part of your Arduino code, set or clear the CS02, CS01, and CS00 bits in the relevant TCCRnB register. For example, if you want to set pins 5 and 6 to output a PWM signal at the highest possible frequency (see "List of Possible Frequencies" at the end of this post), insert the following code in the void setup() section of your Arduino code:


//First clear all three prescaler bits:
int prescalerVal = 0x07; //create a variable called prescalerVal and set it equal to the binary                                                       number "00000111"
TCCR0B &= ~prescalerVal; //AND the value in TCCR0B with binary number "11111000"


//Now set the appropriate prescaler bits:
int prescalerVal = 1; //set prescalerVal equal to binary number "00000001"
TCCR0B |= prescalerVal; //OR the value in TCCR0B with binary number "00000001"


The above code cleared bits CS02 and CS01, and set bit CS00.


Another way to do this, is with the following code:


//First clear the three prescaler bits
TCCR0B &= ~(1<<cs02);>
                                                   Invert that to get "11111011". AND that with TCCR0B.
TCCR0B &= ~(1<<cs01);>
TCCR0B &= ~(1<


//Now set the appropriate prescaler bits
TCCR0B |= (1<<cs00);>
                                                OR that with TCCR0B.


If the above code is confusing, try the Bit math explanation here: http://www.arduino.cc/playground/Code/BitMath


List of Possible Frequencies:


For pins 6 and 5 (OC0A and OC0B):


If TCCR0B = xxxxx001, frequency is 64kHz
If TCCR0B = xxxxx010, frequency is 8 kHz
If TCCR0B = xxxxx011, frequency is 1kHz (this is the default from the Diecimila bootloader)
If TCCR0B = xxxxx100, frequency is 250Hz
If TCCR0B = xxxxx101, frequency is 62.5 Hz


For pins 9, 10, 11 and 3 (OC1A, OC1B, OC2A, OC2B):


If TCCRnB = xxxxx001, frequency is 32kHz
If TCCRnB = xxxxx010, frequency is 4 kHz
If TCCRnB = xxxxx011, frequency is 500Hz (this is the default from the Diecimila bootloader)
If TCCRnB = xxxxx100, frequency is 125Hz
If TCCRnB = xxxxx101, frequency is 31.25 Hz

6

Re: Вывод частоты на "ногу"

rusmax пишет:

Я так понял, что из всего выше подсказанного ЭТО более менее подходящее. Но как понимаю самое высокое что можно "выжать" из платы - это 31кГц... Хм... маловато.

Если не сильно менять режим работы таймеров, то да, 31кГц. (timer0 лучше вообще не трогать - от него тактуются ф-ии delay() и  millis()).
Хорошая табличка с частотами и способом изменения есть тут:
http://www.arduino.cc/playground/Main/T … Cheatsheet
Но в принципе, можно сделать ШИМ не 8-битным, а например 1-битным, и тогда получить на выходе 8МГц - вот это уже предел для 16Мгц микроконтроллера.
Нарисовал тут примерчик:

void setup() {
  //Как это работает:
  //Заводим таймер1 на самый быстрый ШИМ режим без делителя чатсоты. Тикать будет на 16МГц.
  //Обнуление таймера при достижени ICR1, при этом ноги 9 и 10 выставляются в 1
  //при достижении таймера OCR1A нога 9 переключается на 0
  //при достижении таймера OCR1B нога 10 переключается на 0
  //Максимально можно получить 8МГц - установив ICR1 = 1, а OCR1A = 0
  //тогда таймер будет считать   0 1 0 1 0 1 0 1 0 1 ...
  //а нога 9 будет перключаться  1 0 1 0 1 0 1 0 1 0 ...
  //Ближайшая к 3.5МГц - это 16Мгц/5=3.2МГц. Нужно сделать ICR1 = 4, а OCR1A = 2
  //тогда таймер будет считать   0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
  //а нога 9 будет перключаться  1 1 1 0 0 1 1 1 0 0 1 1 1 0 0
  //...аналогично по ноге 10 - нужно использовать OCR1B
  
  TCCR1A = B11110010;  //Собственно настройка таймера
  TCCR1B = B00011001;  //Собственно настройка таймера
  ICR1 = 1;            //Выставляем
  OCR1A = 0;           //           на 8МГц
  pinMode (9, OUTPUT);
}

void loop()
{
  ICR1 = 1;            //Выставляем
  OCR1A = 0;           //           на 8МГц
  delay(4000);         //пауза 4 сек.
  ICR1 = 4;            //Выставляем
  OCR1A = 2;           //           на 3.2МГц
  delay(4000);         //пауза 4 сек.
}

И еще вопрос, а куда этот код прописать то? Чтоб получить эффект, попробовать так сказать.

...как видете, вызывать можно где угодно
Подобные трюки конечно немного отклоняются от идеологии "очень простого в работе микроконтроллера", но зато и позволяют "выжать" из него больше.
Очень детальное описание всего функционала микроконтроллера ATmega168 можно взять на сайте Atmel, например тут: http://www.atmel.com/dyn/resources/prod … oc2545.pdf
Это очень серьезная документация, охватывающая все что он умеет, и занимает порядка 400 страниц.
...мне все-таки кажется, что лучше иметь отдельный модулятор для радиосигнала, хотя для каких-то задач может можно и так - "набортными средствами"

7

Re: Вывод частоты на "ногу"

Из этого примера следует, что все выходы шим уйдут с нормального режима работы. Е-мое... А нужен-то только один. Поэтому с экспериментами хватит. И эту идею воплотить в "кварце" все же лечге, пусть и муторнее, но легче.
Тогда лерейдем ко второй задаче:как заставить передавать код Морзе.Например, значение аналлог\входа в данный код который после  на цифровую ногу. Хотел сделать это кодирование с помощью массива, но знаки имеют разную длину. Оказалось, что так проще кодировать код Бодо,там фиксированная длина 5 бит.Но использовать в радиомаяке сигналы буквопечатания вообще бессмысленно.
Идеи?

8

Re: Вывод частоты на "ногу"

rusmax пишет:

Из этого примера следует, что все выходы шим уйдут с нормального режима работы.

Не все, а только висящие на таймере1 - это выходы 9 и 10.

Тогда лерейдем ко второй задаче:как заставить передавать код Морзе. Например, значение аналлог\входа в данный код который после  на цифровую ногу. Хотел сделать это кодирование с помощью массива, но знаки имеют разную длину.

Если речь идет именно о коде Морзе, то с учетом того, что памяти программ у нас значительно больше, чем ОЗУ, да и еще с учетом переменной длины кода, проще сделать через оператор switch.
Именно так сделано в этих 2-х проектах:
http://www.flatline.net/journal/2008/04 … orse-code/
http://blog.shaunoneil.com/2008/07/26/a … e-library/
в последнем даже целая библиотека имеется.

...а почему именно код Морзе? Принимать сигнал уже человек будет?

9

Re: Вывод частоты на "ногу"

Admin пишет:

Не все, а только висящие на таймере1 - это выходы 9 и 10

Да потом уже понял, но переделывать топик не стал. В любом случае не подошло.

Admin пишет:

Если речь идет именно о коде Морзе

, да именно о нем. Телеграф одним словом ибо на то "том" конце будет человек и не один. Чуть позже раскрою суть затеи, правда тогда придется и тему переименовать. Но не главное.

Admin пишет:

НЕсли речь идет именно о коде Морзе, то с учетом того, что памяти программ у нас значительно больше, чем ОЗУ, да и еще с учетом переменной длины кода, проще сделать через оператор switch.
Именно так сделано в этих 2-х проектах:
http://www.flatline.net/journal/2008/04 … orse-code/
http://blog.shaunoneil.com/2008/07/26/a … e-library/
в последнем даже целая библиотека имеется.

Все бы ничего, но ни один из них у меня не работает ((( Начал с библиотечного. Прописал все как надо (читай "скопировал") Проверил, оболочка ее видит. При заливке даже простого примера "Всему миру, прием" Фиг. Ошибок вылазит столько, что глаза ломаются. И кажется в самой библиотеке ибо в программе на 10 строк "ничего такого нет".
Второй пример постигла та же учесть. Мало того что там ругается на дубляжи, так и вовсе при загрузке в "плату" светодиод ведет себя подобно мигалке.

Никаким реальным рабочим эффектом там не пахнет. Утро вечера мудренее (у нас +7 МСК) но думаю при втором заходе ничего не измениться, проверил все вроде. Правда библиотеки не копал... Надеялся на автора.

10

Re: Вывод частоты на "ногу"

rusmax пишет:

Все бы ничего, но ни один из них у меня не работает ((( Начал с библиотечного. Прописал все как надо (читай "скопировал") Проверил, оболочка ее видит. При заливке даже простого примера "Всему миру, прием" Фиг. Ошибок вылазит столько, что глаза ломаются.

Попробовал. Действительно сходу не заводится.
Выяснилось следующее:
ссылка на страничке на http://files.shaunoneil.com/arduino/mor … se-0.2.zip - это уже измененная библиотека - чтобы не светодиодом моргать, а динамиком пиликать.
В ней инициализация делается примерно так:

Morse morse(13, 10, 400, 3);

13 - нога светодиода, 10 - частота символов, 400 частота пиликалки, 3 - нога с пиликалкой
Светодиодная версия: http://files.shaunoneil.com/arduino/mor … e-0.1.zip.
Пример на страничке для светодиодной версии.
Кроме того, из файла Morse.h нужно удалить строчку

#include "WConstants.h"

Светодиодную версию попробовал - вроде завелась.
...не всегда авторы пишут грамотные библиотеки и нормально их описывают :(

11 (2009-10-15 16:45:57 отредактировано rusmax)

Re: Вывод частоты на "ногу"

А вот что каждый раз получаю я... Строку в библиотеке удалил. Не работает что с первой что со второй версией, как ни крути.

hardware\libraries\Morse_SP\Morse.o: In function `Morse::DoSym()':
M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse/Morse.cpp:77: multiple definition of `Morse::DoSym()'
hardware\libraries\Morse_LED\Morse.o:M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse_LED/Morse.cpp:58: first defined here
hardware\libraries\Morse_SP\Morse.o: In function `Morse::DoSpace()':
M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse/Morse.cpp:72: multiple definition of Morse::DoSpace()'
hardware\libraries\Morse_LED\Morse.o:M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse_LED/Morse.cpp:53: first defined here
hardware\libraries\Morse_SP\Morse.o: In function `Morse::DoDash()':
M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse/Morse.cpp:61: multiple definition of `Morse::DoDash()'
hardware\libraries\Morse_LED\Morse.o:M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse_LED/Morse.cpp:44: first defined here
hardware\libraries\Morse_SP\Morse.o: In function `Morse::DoDit()':
M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse/Morse.cpp:56: multiple definition of `Morse::DoDit()'
hardware\libraries\Morse_LED\Morse.o:M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse_LED/Morse.cpp:37: first defined here
hardware\libraries\Morse_SP\Morse.o: In function `Morse::DoLetter(char)':
M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse/Morse.cpp:80: multiple definition of `Morse::DoLetter(char)'
hardware\libraries\Morse_LED\Morse.o:M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse_LED/Morse.cpp:61: first defined here
hardware\libraries\Morse_SP\Morse.o: In function `Morse::letter(char)':
M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse/Morse.cpp:53: multiple definition of `Morse::letter(char)'
hardware\libraries\Morse_LED\Morse.o:M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse_LED/Morse.cpp:34: first defined here
hardware\libraries\Morse_SP\Morse.o: In function `Morse::send(char*)':
M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse/Morse.cpp:44: multiple definition of `Morse::send(char*)'

hardware\libraries\Morse_LED\Morse.o:M:\arduino-0016-win\arduino-0016/hardware\libraries\Morse_LED/Morse.cpp:25: first defined here

Couldn't determine program size: M:\arduino-0016-win\arduino-0016\hardware/tools/avr/bin/avr-size: 'M:\arduino-0016-win\sketch_091015a\applet\sketch_091015a.hex': No such file

avrdude: can't open input file M:\arduino-0016-win\sketch_091015a\applet\sketch_091015a.hex: No such file or directory
avrdude: write to file 'M:\arduino-0016-win\sketch_091015a\applet\sketch_091015a.hex' failed

Прошу прощения, победил. Тут сам виноват. Скопировал в разные папки и подключал одну, а названия библиотек-то одинаковые. До меня дошло не сразу ))) как только убил одну из папок, судя по эффекту первую версию) все пошло. Но нет звука пока-что, хотя он и не нужен. Нужно чисто логическое управления модулятором. В общем разбираюсь дальше...
Разобрался максимально, пролазил все файлы библиотек, хм... Не работает(как надо) смешанная версия в плане вывода на динамик и светодиод. Хотя про писываю все как положено. На ноге, что указывается для вывода динамика работает как цифровой (точки-тире), звука там нет. Хотя указать в иницализации просит все 4-ре параметра.
Короче покопался еще раз во второй версии библиотеки. Или мне показалось, или там в коментах написано "мол я отказался чтоб 13 нога дергалась в такт телеграфу". Значит это умышленно отключено?

12

Re: Вывод частоты на "ногу"

rusmax пишет:

А вот что каждый раз получаю я... Строку в библиотеке удалил. Не работает что с первой что со второй версией, как ни крути.

...skipped...

Прошу прощения, победил.

...skipped...

Не работает(как надо) смешанная версия в плане вывода на динамик и светодиод.

...skipped...

Короче покопался еще раз во второй версии библиотеки. Или мне показалось, или там в коментах написано "мол я отказался чтоб 13 нога дергалась в такт телеграфу". Значит это умышленно отключено?

Так и не понял - решились проблемы, или нет.
Вы правы - v0.2 не умеет выводить на светодиод.
А с версией 0.1 все нормально. Нужно только из файла Morse.h удалить строчку (как я выше писал).
Вот собственно пример, на котором я проверял: http://freeduino.ru/images_forum/MorseTest.zip Для него библиотека не нужна - все нужные файлы сложены в одну папку с самой программой - это вполне "законный" способ, только .h файлы тогда нужно подключать через #include не в треугольных скобках, а в двойных кавычках.

13 (2009-10-22 13:22:03 отредактировано rusmax)

Re: Вывод частоты на "ногу"

Admin пишет:

Так и не понял - решились проблемы, или нет.

С передачей (да и вообще всей работой) с кодом Морзе - ДА. За что Вам огромное спасибо. Но не думайте что я от Вас отстану ))) Просто не буду плодить другую ветку, продолжу эту. А потом, уже обобщенное и воплощенное, перенесу в другой раздел.

Admin пишет:

Вы правы - v0.2 не умеет выводить на светодиод.
А с версией 0.1 все нормально.

Да, так и есть. Я это проверил. Просто немного непонятно, почему во второй версии автор не указал отсутствие "светового" сопровождения. Но там есть еще пара-тройка отличий от первой. С паузами, знаками "тишины". Вторая лучше. Для моих задач.

Admin пишет:

Вот собственно пример, на котором я проверял: http://freeduino.ru/images_forum/MorseTest.zip Для него библиотека не нужна - все нужные файлы сложены в одну папку с самой программой - это вполне "законный" способ, только .h файлы тогда нужно подключать через #include не в треугольных скобках, а в двойных кавычках.

Такими темпами я выучу "си" ))) Хотя ближе Паскаль и П-образные. Их преподавали. Но как говорил Ленин...

Теперь снова вопросы. По приоритету.
Как можно заставить группу из 4-х входов работать как двоичные? (акромя операторов If и Case ) Суть: есть дешифратор DTMF когда, выход его - двоичный код. Чтоб не лепить еще одну микросхему дешифратора (тогда придется занять все 16 ЦФ входов, что неприемлимо). Возможно? Реализация в программе.

Возможно ли подключить (и как програмировать FD) индикатор HDSP-2503. Имею их приличное количество.
Такой же вопрос по AT24C01A-10SI. Тоже самое.

14

Re: Вывод частоты на "ногу"

Опять все в партизаны пошли? С "железными вопросами" ладно, а вот как быть с этим -
заставить группу из 4-х входов работать как двоичные? (акромя операторов If и Case ) Суть: есть дешифратор DTMF когда, выход его - двоичный код. Чтоб не лепить еще одну микросхему дешифратора (тогда придется занять все 16 ЦФ входов, что неприемлимо). Возможно? Реализация в программе.

15

Re: Вывод частоты на "ногу"

rusmax пишет:

Как можно заставить группу из 4-х входов работать как двоичные? (акромя операторов If и Case )

Если я правильно понял, нужно за один раз считать 4 бита данных, и сложить их в некую переменную, например.
Есть такая возможность, рекомендую почитать тут: http://www.arduino.cc/en/Reference/PortManipulation
Если кратко, то все выводы ATmega168 представлены тремя портами, имеющими имена B, C, D
Цифровые выводы 0-7 принадлежат порту D.
Соответственно можно за один раз прочесть все 8 цифровых выводов 0-7.
Сначала определяем, что выводы будут использоваться на вход:
DDRD = B00000000
Потом можно читать значения
char MyInputs;
MyInputs = PIND;
Функции pinMode, digitalWrite, digitalRead - это просто хитрые обертки вокруг манипуляций с портами.
Может посмотреть в их исходники ...\arduino-0017\hardware\cores\arduino\wiring_digital.c

Возможно ли подключить (и как програмировать FD) индикатор HDSP-2503.

Судя по вытянутой из интернета документации (http://www.farnell.com/datasheets/461139.pdf) этот индикатор требует занять огромное количество выводов. Видимо поэтому готовой библиотеки для Arduino на него я не нашел. Поэтому за 5 минут такую задачу не решить - нужно читать .pdf, и реализовывать протокол обмена данными. Для экономии выводов можно подцеплять какие-то сдвиговые регистры.

Такой же вопрос по AT24C01A-10SI. Тоже самое.

Подключение i2c (как и SPI) EEPROM - достаточно типовая задача, и в интернете есть примеры. И библиотека есть. Для i2c (он же TWI) я вот сразу вот такой нашел: http://www.ghettohax.com/2009/02/i2c-ee … duino.html

...ответы поступают не сразу, поскольку людей на форуме пока мало, а админ не всегда успевает :(

16

Re: Вывод частоты на "ногу"

Admin пишет:

...ответы поступают не сразу, поскольку людей на форуме пока мало, а админ не всегда успевает :(

Ну теперь буду знать )))
А поповоду читать, хм, не в совершенстве владею ENG. Бывает и найду что-то, но понять досконально в чем суть и "как" не могу.