Rebell
06.06.2005, 21:10
Wir müssen in de Schule einen PCM machen.
Dieser soll über ein in C geschriebenes Programm den Com-Port ansprechen,an dem ein Tiefpass aus Kondensator (47µF-Elko) und Lautsprecher hängt.
Entsprechend der Frequenz soll ein Ton ausgegeben werden. Das Programm und die Schaltung haben wir schon,aber irgendwie funktioniert es nicht.
Vielleicht habt ihr eine Idee...
#include <math.h>
#include <windows.h>
#include <stdio.h>
int main ()
{
/* Definitionen*/
DWORD wb;
HANDLE hCom;
DCB dcb;
FILE *handle;
int Data[115200], n, p, nr, frequenz, perioden;
double sinwert;
/* Einstellung f. File & COM */
handle = fopen("sin.txt","w");
hCom = CreateFile("COM1",
GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
dcb.BaudRate = CBR_115200; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit
perioden = pow(10,6);
frequenz = 100000;
nr = 115200/frequenz;
/* Berechnung der Sinuswerte */
for (n=0; n < nr; n=n+1)
{
sinwert = sin (2*M_PI * n/(double)nr);
Data[n] = 128 + floor(100 * sinwert + 0.5);
fprintf(handle,"%d\t%g\t%d\n",n,sinwert,Data[n]);
}
/* Ausgabe in File & COM */
for(p=0; p<perioden; p+=1)
{
unsigned char wert;
for (n=0; n < nr; n=n+1)
{
wert = Data[n];
WriteFile(hCom, &wert , sizeof(wert), &wb, 0);
}
}
printf("Ende!");
getchar();
return 0;
}
Eigentlich müsste es gehen,denn unser Lehrer hat uns ein Buch gezeigt da steht ein Visual Basic Code drinnen der funzen müsste...
Private Sub Command1_Click()
Dim Dat(10000)
pi = 3.1415
freq = Val(Text1.Text)
Nr = Int(11520 / freq)
For n = 1 To 10 * Nr
Dat(n) = 128 + Int(100 * Sin(2 * pi * n / Nr))
Next n
out = 128
For n = 1 To 10 * Nr
out = out + 5
Data = Dat(n)
Bit = 1
send = 0
For i = 1 To 8
If Data < out Then
send = send + Bit
out = out - 5
Else
out = out + 5
End If
Bit = Bit * 2
Next i
out = out - 5
Dat(n) = send
Next n
REALTIME
For n = 1 To 100
For i = 1 To 10 * Nr
SENDBYTE 2, Dat(i)
Next i
Next n
NORMALTIME
End Sub
Private Sub Form_Load()
OPENCOM 2, 115200, 0, 8, 1, 100, 100
DTR 2, 1
RTS 2, 1
End Sub
Private Sub Form_Unload(Cancel As Integer)
CLOSECOM 2
End Sub
Also:
es funzt nicht:
Es kommt ein ziemlich konstanter "Ton" (eher ein Rauschen) aus dem Lautsprecher, egal ob der Wert frequenz verändert wird.
Der code ausm buch is net von mir,der andere schon. Zuerst hab ich mit den Leuten aus meiner Gruppe den Visual Basic Code in C versucht umzuschreiben... und jetzt haben wir das Proggi so verändert,wie es sich logisch anhört,aussieht,wie auch immer =)
Es soll einen Ton entsprechend der Frequenz ausgeben.
Unser Lehrer is ein bissi inkompetetnt und kann uns net helfen =/ (ich glaub er hats net mal ausprobiert)
Muss man da maybe irgenwie was mit bitweisem verschieben machen? wenn ja,wie geht das?
Dieser soll über ein in C geschriebenes Programm den Com-Port ansprechen,an dem ein Tiefpass aus Kondensator (47µF-Elko) und Lautsprecher hängt.
Entsprechend der Frequenz soll ein Ton ausgegeben werden. Das Programm und die Schaltung haben wir schon,aber irgendwie funktioniert es nicht.
Vielleicht habt ihr eine Idee...
#include <math.h>
#include <windows.h>
#include <stdio.h>
int main ()
{
/* Definitionen*/
DWORD wb;
HANDLE hCom;
DCB dcb;
FILE *handle;
int Data[115200], n, p, nr, frequenz, perioden;
double sinwert;
/* Einstellung f. File & COM */
handle = fopen("sin.txt","w");
hCom = CreateFile("COM1",
GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
dcb.BaudRate = CBR_115200; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit
perioden = pow(10,6);
frequenz = 100000;
nr = 115200/frequenz;
/* Berechnung der Sinuswerte */
for (n=0; n < nr; n=n+1)
{
sinwert = sin (2*M_PI * n/(double)nr);
Data[n] = 128 + floor(100 * sinwert + 0.5);
fprintf(handle,"%d\t%g\t%d\n",n,sinwert,Data[n]);
}
/* Ausgabe in File & COM */
for(p=0; p<perioden; p+=1)
{
unsigned char wert;
for (n=0; n < nr; n=n+1)
{
wert = Data[n];
WriteFile(hCom, &wert , sizeof(wert), &wb, 0);
}
}
printf("Ende!");
getchar();
return 0;
}
Eigentlich müsste es gehen,denn unser Lehrer hat uns ein Buch gezeigt da steht ein Visual Basic Code drinnen der funzen müsste...
Private Sub Command1_Click()
Dim Dat(10000)
pi = 3.1415
freq = Val(Text1.Text)
Nr = Int(11520 / freq)
For n = 1 To 10 * Nr
Dat(n) = 128 + Int(100 * Sin(2 * pi * n / Nr))
Next n
out = 128
For n = 1 To 10 * Nr
out = out + 5
Data = Dat(n)
Bit = 1
send = 0
For i = 1 To 8
If Data < out Then
send = send + Bit
out = out - 5
Else
out = out + 5
End If
Bit = Bit * 2
Next i
out = out - 5
Dat(n) = send
Next n
REALTIME
For n = 1 To 100
For i = 1 To 10 * Nr
SENDBYTE 2, Dat(i)
Next i
Next n
NORMALTIME
End Sub
Private Sub Form_Load()
OPENCOM 2, 115200, 0, 8, 1, 100, 100
DTR 2, 1
RTS 2, 1
End Sub
Private Sub Form_Unload(Cancel As Integer)
CLOSECOM 2
End Sub
Also:
es funzt nicht:
Es kommt ein ziemlich konstanter "Ton" (eher ein Rauschen) aus dem Lautsprecher, egal ob der Wert frequenz verändert wird.
Der code ausm buch is net von mir,der andere schon. Zuerst hab ich mit den Leuten aus meiner Gruppe den Visual Basic Code in C versucht umzuschreiben... und jetzt haben wir das Proggi so verändert,wie es sich logisch anhört,aussieht,wie auch immer =)
Es soll einen Ton entsprechend der Frequenz ausgeben.
Unser Lehrer is ein bissi inkompetetnt und kann uns net helfen =/ (ich glaub er hats net mal ausprobiert)
Muss man da maybe irgenwie was mit bitweisem verschieben machen? wenn ja,wie geht das?