Generator alfabetu Morse’a

....nie pasujące gdzie indziej...
Awatar użytkownika
fredek
Posty: 372
Rejestracja: poniedziałek 03 maja 2010, 13:58
Lokalizacja: Łódź

Post autor: fredek »

Pyra pisze:...Wystarczy obliczyć wartości dla kolejnych kątów o skoku 180°/16 i pomnożyć przez 126.
Ja zrobię resztę.
Napiszmy sobie programik w javie :)

Kod: Zaznacz cały

import static java.lang.Math.sin;
import static java.lang.Math.PI;

public class Sinus {
	private static double wartosc, kat;
	private static int dane;
	private static String wyswietl="const uint8_t PROGMEM sinus[] = {0";

	public static void main(String[] args) {

		for &#40;int x=1; x<=15; x++&#41; &#123;
			kat=180/15*x;
			wartosc = sin&#40;kat*PI/180&#41;;
			dane=&#40;int&#41;&#40;wartosc*126&#41;;
			wyswietl+=", "+dane;
			System.out.println&#40;"x="+x+" kat="+kat+" wartosc="+wartosc+" dane="+dane&#41;;
		&#125;
		
		wyswietl+="&#125;;";
		System.out.println&#40;"Kod w C dla Pyra&#58;"&#41;;
		System.out.println&#40;wyswietl&#41;;
	&#125;
&#125;
Efekt działania programu:

Kod: Zaznacz cały

x=1 kat=12.0 wartosc=0.20791169081775931 dane=26
x=2 kat=24.0 wartosc=0.40673664307580015 dane=51
x=3 kat=36.0 wartosc=0.5877852522924731 dane=74
x=4 kat=48.0 wartosc=0.7431448254773942 dane=93
x=5 kat=60.0 wartosc=0.8660254037844386 dane=109
x=6 kat=72.0 wartosc=0.9510565162951535 dane=119
x=7 kat=84.0 wartosc=0.9945218953682733 dane=125
x=8 kat=96.0 wartosc=0.9945218953682734 dane=125
x=9 kat=108.0 wartosc=0.9510565162951536 dane=119
x=10 kat=120.0 wartosc=0.8660254037844387 dane=109
x=11 kat=132.0 wartosc=0.7431448254773942 dane=93
x=12 kat=144.0 wartosc=0.5877852522924732 dane=74
x=13 kat=156.0 wartosc=0.40673664307580043 dane=51
x=14 kat=168.0 wartosc=0.20791169081775931 dane=26
x=15 kat=180.0 wartosc=1.2246467991473532E-16 dane=0
Kod w C dla Pyra&#58;
const uint8_t PROGMEM sinus&#91;&#93; = &#123;0, 26, 51, 74, 93, 109, 119, 125, 125, 119, 109, 93, 74, 51, 26, 0&#125;;
Ostatnia linijka Pyra to chyba to czego szukasz :wink:
Awatar użytkownika
barney
Posty: 268
Rejestracja: niedziela 18 lip 2010, 11:47
Lokalizacja: Łask

Post autor: barney »

C++ ma wbudowany Sparta-style :mrgreen:

Kod: Zaznacz cały

#include <iostream>
#include <math.h>
using namespace std;

int main&#40;&#41;
&#123;
	cout << "const uint8_t PROGMEM sinus&#91;&#93; = &#123;" << endl;
	for &#40;double x=0; x<=180; x+=180.0/15&#41; cout << int&#40;sin &#40;x*M_PI/180&#41;*126&#41; << ", /* " << x << " */" << endl;
	cout << "&#125;";
	cin.get&#40;&#41;;
&#125;
const uint8_t PROGMEM sinus[] = {
0, /* 0 */
26, /* 12 */
51, /* 24 */
74, /* 36 */
93, /* 48 */
109, /* 60 */
119, /* 72 */
125, /* 84 */
125, /* 96 */
119, /* 108 */
109, /* 120 */
93, /* 132 */
74, /* 144 */
51, /* 156 */
26, /* 168 */
0, /* 180 */
}
Awatar użytkownika
fredek
Posty: 372
Rejestracja: poniedziałek 03 maja 2010, 13:58
Lokalizacja: Łódź

Post autor: fredek »

barney, Sparta style w java :mrgreen:

Kod: Zaznacz cały

public class Sinus &#123;
	private static String wyswietl = "const uint8_t PROGMEM sinus&#91;&#93; = &#123;0";

	public static void main&#40;String&#91;&#93; args&#41; &#123;
		for &#40;int x = 1; x <= 15; x++&#41; 
			wyswietl += ", " + &#40;int&#41; &#40;java.lang.Math.sin&#40;180 / 15 * x * java.lang.Math.PI / 180&#41; * 126&#41;;
		wyswietl += "&#125;;";
		System.out.println&#40;wyswietl&#41;;
	&#125;
&#125;
Efekt:

Kod: Zaznacz cały

const uint8_t PROGMEM sinus&#91;&#93; = &#123;0, 26, 51, 74, 93, 109, 119, 125, 125, 119, 109, 93, 74, 51, 26, 0&#125;;
ptja
Posty: 2414
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post autor: ptja »

Ada20 pisze:Mam dwa klucze wojskowe do telegrafii ,dostałam je ponad 10lat temu, po likwidowanym L.O.K.
co prawda I kategorii nie miałem, ale... 88 de SP7SZM :)
--
pozdrawiam,
Jarek Andrzejewski
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

Witam
Mam 2 rodzaje kluczy,takie jak na załączonym poniżej linku,moje są w o wiele lepszym stanie.
Pozdrawiam
Adela
http://allegro.pl/klucze-telegraficzne- ... 41630.html
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Oj natitało się swego czasu :roll:
Napisałem krótki programik, niestety musiałem rozbić tabelę z próbkami, bo się cuda działy, jak się komórki ramu zaczęły nadpisywać.

Kod: Zaznacz cały

# define F_CPU 9600000UL
#include <avr/io.h>
#include <util/delay.h>
#define prz 34

int main&#40;&#41;
&#123;
  unsigned int short a;
  unsigned int short tab&#91;9&#93; = &#123;0,24,48,70,89,105,116,124,126&#125;;
   TCCR0B|=&#40;1<<CS00&#41;;				//ustaw Timer0 prescaler = 1
   TCCR0A|=&#40;1<<WGM00&#41;|&#40;1<<WGM01&#41;|&#40;1<<COM0A1&#41;;	//fast PWM
   DDRB|= &#40;1<<PB0&#41;|&#40;1<<PB1&#41;;					//ustaw PB0 jako wyjście

    while &#40;1&#41;
   &#123;
//  PORTB|=&#40;1<<PB1&#41;;		//dla pomiaru częstotliwości
     for &#40;a=0; a<7; a++&#41;
     &#123;
	    OCR0A = 126 + tab&#91;a&#93;;
        
       _delay_us&#40;prz&#41;;
	 &#125;;

     for &#40;a=8; a>1; a--&#41;
     &#123;
	    OCR0A = 126 + tab&#91;a&#93;;
         
       _delay_us&#40;prz&#41;;
	 &#125;; 
//  PORTB&=~&#40;1<<PB1&#41;;		//dla pomiaru częstotliwości

     for &#40;a=0; a<7; a++&#41;
     &#123;
	    OCR0A = 126 - tab&#91;a&#93;;
        
       _delay_us&#40;prz&#41;;
	 &#125;;

     for &#40;a=8; a>1; a--&#41;
     &#123;
	    OCR0A = 126 - tab&#91;a&#93;;
         
       _delay_us&#40;prz&#41;;
	 &#125;; 
   &#125;;

&#125;; 
Użyłem więc 8 próbek (co 11,25°) wyliczonych w excelu, które są powtarzane 4 razy w rożnych konfiguracjach.
Wyliczone teoretycznie opóźnienie wymagało małej korekcji i ostatecznie ma wartość 34&#181;s.
Trzeba niestety zmienić fusebit "Divide by 8" na OFF, aby mieć pełne 9,6MHz taktowania. Timer taktowany bez prescalera, więc w trybie fastPWM uzyskujemy ponad 30kHz częstotliwości nośnej.
W pętlach co 34&#181;s, wpisywane są do rejestru porównawczego OCR0A wartości z tablicy, dodawane lub odejmowane od 126, co powoduje, że mamy polówkę dodatnią i ujemną przesunięte ponad oś zerową, czyli całość jest dodatnia.
Uzyskany wynik prezentuję na poniższej fotce:
Obrazek
Aktualnie jako filtr pracuje 1k i 100nF, przy zmianie kondensatora na 1 - 10&#181;F można podłączyć głośniczek i mamy sinusa :mrgreen:
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

Witam
Dziękuje wszystkim za pomoc,a szczególnie Tobie Pyra.
Pozdrawiam
Adela

[ Dodano: 13 Marzec 2014, 00:12 ]
Witam
Mam pytanie,czy da się tak zrobić aby na wyjści Attiny 13 A był sinus i zmieniała się polaryzacja co 60 sekund,tak jak to było w moim ostatnim poście gdzie zmieniała sie polaryzacja ale na fali prostokątnej.
Pozdrawiam
Awatar użytkownika
fredek
Posty: 372
Rejestracja: poniedziałek 03 maja 2010, 13:58
Lokalizacja: Łódź

Post autor: fredek »

Pyra, trochę mnie zastanawia:

tab[9] = {0,24,48,70,89,105,116,124,126}; iterowana w zakresie 0..8 ale w kodzie:

for (a=0; a<7; a++) czyli 0..6 brak 7 i dalej przeskok na:
for (a=8; a>1; a--) czyli 8..2 brak 1
for (a=0; a<7; a++) czyli 0..6 brak 7
for (a=8; a>1; a--) czyli 8..2 brak 1

Nie pogarszasz czasem dokładności generowania sinusa ?
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
fredek masz rację, ale zobacz na przebieg, jest całkiem "przyjemny", a biorąc pod uwagę, że ma być tylko użyty jako źródło sygnału titi tata do morsea, nic więcej nie potrzeba.
Wywaliłem te próbki podczas doświadczalnego ustalania częstotliwości przebiegu, jak widać na oscyloskopie, chyba się udało ;)
Ada20 pisze:Mam pytanie,czy da się tak zrobić aby na wyjści Attiny 13 A był sinus i zmieniała się polaryzacja co 60 sekund,tak jak to było w moim ostatnim poście gdzie zmieniała sie polaryzacja ale na fali prostokątnej.
Można by, trzeba by zastosować podobną sztuczkę jak w tamtych programach, ale to już umiesz zrobić.
Swoją drogą, dlaczego co 60s?
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

Witam

Jak najbardziej idealny przebieg sinus, był by dla mnie jak najbardziej pożądany,taki przebieg idealny potrzebny jest do innych zastosowań.
Czas 60 sekund podałam jako przykład.

Pozdrawiam
Adela
Ostatnio zmieniony czwartek 13 mar 2014, 15:56 przez Ada20, łącznie zmieniany 1 raz.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
A co to mogą być za zmiany, skoro to będzie prąd przemienny? Innego sensu sinusa nie widzę.
Jeśli chcesz dokładny sinus, to tylko generator z mostkiem Wienna.
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Generator alfabetu Morse&

Post autor: Ada20 »

Witam
Symulator w 1 programie na 1 stronie pokazuje,że w 6 linijce programu(TCCR0A|=(1<<WGM01); //uaktywnij CTC) jest błąd .
Nie można go wgrać do Atmega 8,program nie skompilował.
Jak zrobić aby symulator nie pokazywał błędu?
Pozdrawiam
Adela
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Re: Generator alfabetu Morse&

Post autor: Pyra »

Witam
Ada20 pisze:Symulator w 1 programie na 1 stronie pokazuje,że w 6 linijce programu(TCCR0A|=(1<<WGM01); //uaktywnij CTC) jest błąd .
Nie można go wgrać do Atmega 8,program nie skompilował.
Jak zrobić aby symulator nie pokazywał błędu?
Przepraszam, ale ten program jest napisany na AtTiny13, gdyż takie było Twoje życzenie.
Atmega 8, nie ma rejestru TCCR0A, za to Atmega 48/88/168/328, już takim rejestrem dysponuje.
Atmega 8/8L, ma trochę inaczej zdefiniowane rejestry, i odpowiednikiem wspomnianego, jest TCCR1A, czyli odnosi się do Timer1, jednak bity mają też trochę inne znaczenie.


Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Generator alfabetu Morse

Post autor: Ada20 »

Witam
Proszę napisać program aby działał na Atmega 8A,próbowałam go przerobić,ale dalej wywala błąd w 6 linijce.
Czy można w tym programie zmieniać częstotliwość jak ? w której linijce?

Pozdrawiam
Adela
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Przepraszam, ale nie mam czasu pomóc, (szukanie po karcie katalogowej) bo siedzę nad pewnym projektem na PIC, nad którym utknąłem, i poświęcam mu każdą wolną chwilę...

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Zablokowany