Strona 2 z 2

: środa 12 mar 2014, 20:13
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:

: środa 12 mar 2014, 21:12
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 */
}

: środa 12 mar 2014, 21:25
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;;

: środa 12 mar 2014, 21:56
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 :)

: środa 12 mar 2014, 22:25
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

: środa 12 mar 2014, 23:46
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

: środa 12 mar 2014, 23:54
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

: czwartek 13 mar 2014, 00:32
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 ?

: czwartek 13 mar 2014, 06:14
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

: czwartek 13 mar 2014, 09:49
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

: czwartek 13 mar 2014, 15:32
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

Generator alfabetu Morse&

: środa 23 maja 2018, 13:29
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

Re: Generator alfabetu Morse&

: środa 23 maja 2018, 17:22
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

Generator alfabetu Morse

: środa 23 maja 2018, 19:07
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

: środa 23 maja 2018, 20:45
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