- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 6 von 6

Thema: Sinusfunktion richtig programmieren?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.11.2007
    Alter
    35
    Beiträge
    66

    Sinusfunktion richtig programmieren?

    Anzeige

    Praxistest und DIY Projekte
    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 ^^ :

    Code:
    '--------------------------------------------------------------------------'
    '                        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).

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.02.2005
    Ort
    Südtirol
    Beiträge
    283
    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

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    59
    Beiträge
    1.080
    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
    Mein Hexapod im Detail auf www.vreal.de

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    29.11.2007
    Alter
    35
    Beiträge
    66
    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?

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.02.2007
    Ort
    BA-Wü
    Alter
    32
    Beiträge
    165
    Viele Grüße,
    Michael

    Sn60Pb40 Rulez
    www.silvestercountdown.de.vu- Dein Countdown bis Neujahr!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    29.11.2007
    Alter
    35
    Beiträge
    66
    Ah, der Wissensbereich geht wieder. Top \/

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests