PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sinusfunktion richtig programmieren?



Salvador
28.04.2008, 12:42
Hi Leute,

wollte mal die funktion Sin in Bascom ausprobieren. Geht nicht:

E ist Integer
F ist Integer
G ist Long

(hab auch schon alle Variationen durch mit Integer, Long und Single)

E = E + F
G = sin (e)

Hier kommt der Fehler: Integer or Long expected for ABS()

das ganze mit g=e*sin geht auch nicht, es kommt jedes mal der Fehler:

source variable does not match the target variable

Wenn ich G=sin(1) programmiere geht es, aber Variablen mag Bascom in der Klammer wohl nicht sehn?!

Wer sich das ganze antun will kann mal reinschauen, aber vorsicht, die Kommentare stimmen nicht und ich bin Bascom newbie und kann die wenigsten Befehle richtig programmieren, also nicht wundern wie das programmiert wurde ^^ :



'--------------------------------------------------------------------------'
' Ingo Lippenberger '
' 2007-Keine Gewähr auf Funktion '
' Freeware '
'--------------------------------------------------------------------------'

$regfile = "m8def.dat" 'definieren des verwendeten Chips
$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)
$baud = 9600 'definieren der Baudrate
$framesize = 32 'notwendig für größere Programme
$swstack = 32
$hwstack = 32


Dim A As Integer 'dimensionieren der verwendeten Variable
Dim B As Integer
Dim C As Integer
Dim D As Integer
Dim E As Integer
Dim F As Integer
Dim G As Long
Dim Abs As Long

Dim W As Long 'dimensionieren der verwendeten Variable
Dim X As Long
Dim Y As Long

Config Int1 = Rising 'configuriere Int0 Auf Low Level
Enable Interrupts 'einschalten der Interrupts
Enable Int1 'einschalten Von Interrupt Int0
On Int1 Einstellen 'springe Zu einstellen_von _int0


Config Portd.5 = Output
Config Portd.6 = Output 'Ein Pin wird als Ausgang konfiguriert
Config Portd.7 = Output 'Ein Pin wird als Eingang konfiguriert
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Led1 Alias Portd.5
Led2 Alias Portd.6 'Portd.5 wird umbenannt zu Led1
Summer Alias Portd.7
Taster1 Alias Pind.2
Taster2 Alias Pind.3
Taster3 Alias Pind.4
Ausgang1 Alias Portc.1
Ausgang2 Alias Portc.2
Ausgang3 Alias Portc.3


A = 500




Einstellen:

Led1 = 1
Led2 = 1

Do

If Taster1 = 1 Or Taster2 = 1 Or Taster3 = 1 Then
Waitms 1000
End If

If Taster1 = 1 And Taster2 = 1 And Taster3 = 1 Then
Led1 = 0
Led2 = 0
Return
End If

If Taster1 = 1 And Taster2 = 1 And Taster3 = 0 Then
A = A * 2
End If

If Taster1 = 0 And Taster2 = 1 And Taster3 = 1 Then
A = A / 2
End If

If Taster1 = 1 And Taster2 = 0 And Taster3 = 0 Then
Gosub Sinus
End If

If Taster1 = 0 And Taster2 = 0 And Taster3 = 1 Then
Gosub Dreieck
End If

If Taster1 = 0 And Taster2 = 1 And Taster3 = 0 Then
Gosub Rechteck
End If

Print A

Loop

Sinus:

B = A + A
E = 0
F = 0

Do

D = A / 10
E = E + F
G = Sin * E
Y = G * 5
Gosub Angleichvorgang
F = F + 36

If F > 300 Then
F = 0
End If

Loop

Dreieck:

B = A + A
E = 1
F = 1

Do

D = A / 10
Y = 0.5 * E
Gosub Angleichvorgang
E = E * F

If E = 10 Or E = 1 Then
F = F * -1
End If

Print "stufe" ; E
Print "zählrichtung" ; F
Print W ; "sollwert"
Print "Frequenz" B "in ms"

Loop


Rechteck:
B = A + A
Print "Frequenz" B "ms"

Do

Led1 = 1
Ausgang1 = 1
Ausgang2 = 1
Ausgang3 = 1
Waitms A
Led1 = 0
Ausgang1 = 0
Ausgang2 = 0
Ausgang3 = 0
Waitms A

Loop



Angleichvorgang:


Do

W = Getadc(0)
X = W / 204.8

If X < Y Then
Led1 = 1
Led2 = 0
Ausgang1 = 1
Ausgang2 = 1
Ausgang3 = 1
End If

If X > Y Then
Led1 = 0
Led2 = 1
Ausgang1 = 0
Ausgang2 = 0
Ausgang3 = 0
End If

Waitms 1

Incr C

If C = D Then
Return
End If

Loop


End



PS: Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Das hab ich einfach mal von dem Sinus- Beispiel von der Bascom Hilfe reinkopiert, bringt aber auch keine Besserung (ich weis nichtmal was man damit festlegt).

kalletronic
28.04.2008, 13:30
Hi, schau dir den Quellcode mal an vllt hilfts dir ja weiter, funktionieren tuts, aber ich hab die Variablen als Single definiert

https://www.roboternetz.de/phpBB2/viewtopic.php?t=39619

mfg Kalle

MeckPommER
28.04.2008, 15:53
Tipp:

Wenn eine Funktion nicht zu funktionieren scheint, einfach ein neues, kleines Programm schreiben nur um diese eine Funktion auszutesten. Das geht schneller :-)

Ach ja: die Winkelfunktionen mögen keine Integervariablen. Wie beim Beispiel in der Bascom Hilfe single verwenden!

Generell würde ich dir den Tipp geben, beim Programmieren ganz klein anzufangen. Es bringt wirklich nichts, lange Listings anzufertigen deren Befehle und Funktionsweise du nicht verstehst. So erfährst du nie, warum es nicht klappt und auch nicht, warum es klappt.
Lieber den langsameren Weg gehen, sein Wissen Stück für Stück aufbauen und kleine Programme basteln, die man dann auch versteht.

Ferner gibt es stets verschiedene Wege, eine Sache zu programmieren. Auch wenn dein Listing irgendwann seinen Zweck erfüllt, so ists arg unleserlich und vielleicht siehst du nach 2 Jahren, wenn du mal wieder hinguckst, auch nicht mehr, was es machen sollte ;-)

In der Bascom -Hilfe steht:

var = SIN( source )

source muss eine single- oder double-Variable sein. das ergebnis der Funktion ist ebenfalls single oder double.

Gruß MeckPommER

Salvador
28.04.2008, 17:27
Dank euch beiden, die "kleinere" Version funktioniert.

Ich muss dir recht geben Meckpommer - aber da programmiert man etwas rum und irgendwann hat man wieder so nen Monsterprogramm.. Die schlechte Doku tut sein übriges.

Immerwieder versucht man mehrere Fliegen mit einer Klappe zu schlagen. Kommt halt durch eine unstrukturierte Arbeitsaufteilung.


Noch ne Frage, bisschen OT:

Wie kann man ein Unterprogramm (sub) eine bestimmte Zeit lang laufen lassen? Bis jetzt weis ich nur wie man mit waitms ne bestimmte Zeit "absitzt", aber leider ist der komplette MC solange busy.
Also halt irgend ne Möglichkeit ne Zeit "nebenher" abzustoppen und damit irgendwas auszulösen. Ich weis da was von den internen Timern - aber wie benutzt man die?

Pyro-Mike
28.04.2008, 17:53
https://www.roboternetz.de/wissen/index.php/Bascom_und_Timer

Salvador
28.04.2008, 17:57
Ah, der Wissensbereich geht wieder. Top \:D/