<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=30&amp;t=21705&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-12-14T12:54:50+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=21705&amp;mode</id>
<entry>
<author><name><![CDATA[czarekgr]]></name></author>
<updated>2018-12-14T12:54:50+01:00</updated>
<published>2018-12-14T12:54:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21705&amp;p=214662#p214662</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21705&amp;p=214662#p214662"/>
<title type="html"><![CDATA[Pomysł na menu, sterowanie generatora.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21705&amp;p=214662#p214662"><![CDATA[
Witam.<br />Dawno, dawno temu zrobiłem sobie kamerton do strojenia pianina na układach TTL. Był generator kwarcowy, programowany dzielnik, przełącznik obrotowy 12 pozycyjny z matrycą diodową. No, ale mamy nowe czasy i pomyślałem, że z sentymentu zrobił bym to metodami współczesnymi, wybór padł na Arduino nano ze względu na cenę klonów chińskich i gotową płytkę. Zasada działania ta sama, czyli podział częstotliwości za pomocą timera1. <br />Ale skoro robię kamerton, to pomyślałem, czemu nie dodać gniazda BNC i zrobić programowany generator. I tu zaczyna się kłopot. W przypadku kamertonu miało być 12 częstotliwości w zakresie oktawy, więc wystarczy enkoder albo 2 przyciski czy nawet jeden do przełączania, a generator może w przypadku zegara 16MHz dać zakres od ok 0,12 Hz do 8MHz czyli pewnie coś ok 15 oktaw. Wiadomo, wyświetlacz trzeba dodać, ale jeśli to ma być jako kamerton to chciałbym uniknąć klawiatury. <br />Macie jakąś koncepcję menu, może zakresy, jak fajnie to zrobić?<br />Na razie mam sterowanie przez USB, podaje się częstotliwość w Hz lub nazwę dźwięku i generator ustawia częstotliwość.<br />Jakby kogoś interesowało, to kod jest taki, aktualna wersja na githubie użytkownik czarekgr, gałąź develop<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#define wyjscie 9<br />// #define kwarc 16000000UL //znamionowa częstotliwość taktowania<br />#define kwarc 15992220UL //zmierzona częstotliwość kwarcu, k... prawie 8kHz odchyłki!!!<br /><br /><br />String odebraneDane = &quot;&quot;; //Pusty ciąg odebranych danych<br />float czestotliwosc;<br />unsigned long podzielnik;<br /><br /><br />void ustawCzestotliwosc(float czestotliwosc) {<br />  uint32_t ocr;<br />  uint16_t prescaler&#91;5&#93; = {1, 8, 64, 256, 1024};<br />  byte i;<br />  if (czestotliwosc &gt; kwarc / 2 + 1) {<br />    Serial.println(&quot;Za duza czestotliwosc&quot;);<br />    return;<br />  }<br />  if (czestotliwosc &lt; 0.1) {<br />    Serial.println(&quot;Za mala czestotliwosc&quot;);<br />    return;<br />  }<br /><br />  i = 0;<br />  while ( i &lt; 5 ) {<br />    ocr = kwarc / (2 * prescaler&#91;i&#93; * czestotliwosc) - 0.5;<br /><br />    if (ocr &lt;= 0xFFFFL) {<br />      break;<br />    }<br />    i++;<br />  }<br /><br />  if (i &lt; 5) {<br />    /*  Serial.print(&quot;ocr = &quot;);<br />        Serial.println(ocr);<br />        Serial.print(&quot;prescaler = &quot;);<br />        Serial.println(prescaler&#91;i&#93;); */<br />  } else {<br />    Serial.println(&quot;Za mala  czestotliwosc&quot;);<br />    return;<br />  }<br />  Serial.println(&quot;OK&quot;);<br />  Serial.print(&quot;Wprowadzono f = &quot;);<br />  Serial.print(czestotliwosc, 4);<br />  Serial.println(&quot; Hz&quot;);<br />  Serial.print(&quot;Na wyjsciu f = &quot;);<br />  czestotliwosc = kwarc / (prescaler&#91;i&#93; * (1 + ocr) * 2.0);<br />  Serial.print(czestotliwosc, 4);<br />  Serial.println(&quot; Hz&quot;);<br /><br />  noInterrupts();<br />  TCCR1A = ( (1 &lt;&lt; COM1A0));  // Toggle OC1A/OC1B on Compare Match.<br />  TCCR1B = 0; // Timer/Counter1 Control Register<br />  TCCR1B |= (1 &lt;&lt; WGM12);<br />  switch (i) {<br />    case 0:<br />      // prescaler 1<br />      TCCR1B |= (1 &lt;&lt; CS10) ;<br />      break;<br />    case 1:<br />      // prescaler 8<br />      TCCR1B |=  (1 &lt;&lt; CS11);<br />      break;<br />    case 2:<br />      //prescaler 64<br />      TCCR1B |=   (1 &lt;&lt; CS10) | (1 &lt;&lt; CS11);<br />      break;<br />    case 3:<br />      // prescaler 256<br />      TCCR1B |=  (1 &lt;&lt; CS12);<br />      break;<br />    case 4:<br />      // prescaler 1024<br />      TCCR1B |= (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);<br />      break;<br />  }<br /><br />  OCR1A = ocr;<br />  interrupts();<br />}<br /><br /><br />void setup() {<br />  Serial.begin(9600); //Uruchomienie komunikacji<br />  pinMode(wyjscie, OUTPUT); //Konfiguracja wyjść<br />  digitalWrite(wyjscie, LOW); //Wyłączamy diody<br />  ustawCzestotliwosc(10);<br />}<br /><br /><br />void loop() {<br />  if (Serial.available() &gt; 0) { //Czy Arduino odebrało dane<br />    //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane<br />    odebraneDane = Serial.readStringUntil('\n');<br /><br />    czestotliwosc = odebraneDane.toFloat();<br /><br />    if (odebraneDane.equalsIgnoreCase(&quot;A&quot;) ) {<br />      czestotliwosc =  440.0;<br />      Serial.println(&quot;A&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase(&quot;AIS&quot;) ) {<br />      czestotliwosc =  466.1637615180899;<br />      Serial.println(&quot;Ais&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase( &quot;H&quot;) ) {<br />      czestotliwosc =  493.8833012561241;<br />      Serial.println(&quot;H&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase( &quot;C&quot;) ) {<br />      czestotliwosc =  523.2511306011972;<br />      Serial.println(&quot;C&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase(&quot;CIS&quot;) ) {<br />      czestotliwosc =  554.3652619537442;<br />      Serial.println(&quot;C&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase(&quot;D&quot; )) {<br />      czestotliwosc =  587.3295358348151;<br />      Serial.println(&quot;C&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase(&quot;DIS&quot;) ) {<br />      czestotliwosc =  622.2539674441618;<br />      Serial.println(&quot;Dis&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase(&quot;E&quot; )) {<br />      czestotliwosc =  659.2551138257398;<br />      Serial.println(&quot;E&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase(&quot;F&quot; )) {<br />      czestotliwosc =  698.4564628660078;<br />      Serial.println(&quot;F&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase( &quot;FIS&quot;) ) {<br />      czestotliwosc =  739.9888454232688;<br />      Serial.println(&quot;Fis&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase(&quot;G&quot; )) {<br />      czestotliwosc =  783.9908719634985;<br />      Serial.println(&quot;G&quot;);<br />    }<br />    if (odebraneDane.equalsIgnoreCase(&quot;Gis&quot;) ) {<br />      czestotliwosc =  830.6093951598903;<br />      Serial.println(&quot;Gis&quot;);<br />    }<br /><br />    if (odebraneDane.length() )<br />      ustawCzestotliwosc(czestotliwosc);<br />    odebraneDane = &quot;&quot;;<br />  }<br />}[/syntax]<br /><br />Jest to zlepek jak na razie, na pewno ten kod jeszcze będę szlifował, w przypadku sterowania z komputera mogło by zostać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14311">czarekgr</a> — 14 gru 2018, o 12:54</p><hr />
]]></content>
</entry>
</feed>