- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 42

Thema: Zielscheibensystem mit Zufall

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.01.2007
    Ort
    westliches Pannonien
    Beiträge
    123
    Hallo!

    Eine Interruptroutine muß mit "RETURN" abgeschlossen werden!

    Set Scheibe = X ist Unsinnig.
    Entweder Set Scheibe (Scheibe = 1) oder Reset Scheibe (Scheibe = 0)
    Die ganzen GOTO's sind zu vermeiden.
    Stackwerte einfügen.

    Bascom Hilfe lesen, lesen, lesen.

    MfG

  2. #2
    DjEKI
    Gast
    die seite ist gut. von dem hab ich fast mein ganzes wissen. aber den set befehl habe ich dort nicht erklärt bekommen. ich dachte, man könnte den wert ersetzen. dann mach ich eben incr und um auf 1 wieder zu kommen reset und dann wieder incr.
    was meinst du mit stackwerte einfügen ?
    return nach interrupt ist klar, das wusste ich, steht auch als begründung dar und ich wollte dafür ein ersatz haben, wie ich das ändern könnte. das war nur als hilfe, dass ich dlnach dem interrupt zu einer bestimmten lane möchte. da goto aber den interrupt nicht verlässt ist halt doof...

    mfg eki

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.01.2007
    Ort
    westliches Pannonien
    Beiträge
    123
    Ich meine die interne Bascom_Hilfe. Die Verlinkung erzeugt die Forensoftware.
    Oder hier.

    MfG

  4. #4
    DjEKI
    Gast
    Axo die, die nutze ich auch sehr häufig. Leider konnte ich zu Variabeln nichts finden, zb das mit den SET. Aber das Problem wäre ja nun gelöst mit incr.

    Aber hättest du ne Lösung für mich, wie ich das mit dem Goto lösen kann? Kann man überhaupt mit ein Interrupt zu einer bestimmten Lane springen? Oder geht ein Interrupt immer nur dort weiter, wo es unterbrochen wurde.

    -EDIT-
    Das mit dem SET ersatz habe ich behoben. Einfach nur Scheibe = 1. Praktisch ohne Set. Funktioniert jedenfals in der Simulation.

    mfg EKI
    Geändert von DjEKI (12.02.2013 um 19:17 Uhr)

  5. #5
    DjEKI
    Gast

    2.es Programm mit Simulationstest erfolgreich

    Ui, mein erster Code hatte doch viele Fehler. Jetzt habe ich sogar das mit dem Interrupt verbessert und im Simulator funktioniert bisher alles tadellos.

    Code:
    $regfile = "m32def.dat"
    $crystal = 1000000
    
    
    '***********************************************************************'
    
    
    Dim Scheibe As Integer
    Dim Punkte As Integer
    Dim Scheibe_akt As Bit
    Dim A As Byte
    Dim B As Byte
    
    A = 0
    B = 0
    Scheibe = 2
    Punkte = 0
    
    
    Config Portd.0 = Output
    Config Portd.5 = Output
    Config Portd.6 = Output
    Config Int0 = Rising
    Config Int1 = Rising
    Enable Interrupts
    Enable Int0
    Enable Int1
    On Int0 Int0_5punkte
    On Int1 Int1_10punkte
    
    
    
    Do
    '---------------------'
    If Scheibe = 1 Then
    Portd.0 = 1
    Scheibe = 0
    Do
    Incr Scheibe
    Waitms 250
    If Scheibe_akt = 1 Then
       Goto Anfang
    End If
    Incr B
    If Scheibe = 3 Then
       Scheibe = 0
    End If
    Loop Until B = 8
    Scheibe = 2
    Goto Anfang
    Else
       Portd.0 = 0
    End If
    '---------------------'
    If Scheibe = 2 Then
    Portd.5 = 0
    Scheibe = 0
    Do
    Incr Scheibe
    Waitms 250
    If Scheibe_akt = 1 Then
       Goto Anfang
    End If
    Incr B
    If Scheibe = 3 Then
       Scheibe = 0
    End If
    Loop Until B = 8
    Scheibe = 3
    Goto Anfang
    Else
       Portd.5 = 0
    End If
    '---------------------'
    If Scheibe = 3 Then
    Portd.6 = 1
    Scheibe = 0
    Do
    Incr Scheibe
    Waitms 250
    If Scheibe_akt = 1 Then
       Goto Anfang
    End If
    Incr B
    If Scheibe = 3 Then
       Scheibe = 0
    End If
    Loop Until B = 8
    Scheibe = 1
    Goto Anfang
    Else
       Portd.6 = 0
    End If
    
    Anfang:
    Scheibe_akt = 0
    B = 0
    Waitms 1000
    
    Incr A
    Loop Until A = 20
    End                                                         'hier erscheint ein Ton und zeigt das Ende mit Ergebnis.
    
    '*************************************************************************'
    
    Int0_5punkte:
    Punkte = Punkte + 5
    Portd.0 = 0
    Portd.5 = 0
    Portd.6 = 0
    Scheibe_akt = 1
    Return
    
    Int1_10punkte:
    Punkte = Punkte + 10
    Portd.0 = 0
    Portd.5 = 0
    Portd.6 = 0
    Scheibe_akt = 1
    Return

  6. #6
    DjEKI
    Gast

    3. Programm mit Hardware getestet und Fehler behoben

    Moin,

    Nun funktioniert alles super. Der Zufall ist sogar viel besser mit 50ms.
    Ich wollte dies jetzt nur für mich vollenden, damit ich auch mal eins hin bekomme Und nun muss ich mich mal mit den ATmega88 beschäftigen, was der so alles braucht.

    Wenn ich das ATmega88 habe, kann ich die einzelnen Trigger deaktiveren, um ein 2. Treffer zu verhinden?

    -EDIT-
    Ich habe eben bemergt, das ich schon bei 3kb bin und ich werde bestimmt über 8kb kommen, und von daher lohnt sich der atmega88 leider nicht. Kennt jemand noch einen der mindestens 6 Triggers umschalten kann?

    mfg EKI

    Hier der Code, und sogar noch optimiert:
    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 1000000
    
    
    '***********************************************************************'
    
    
    Dim Scheibe As Integer
    Dim Punkte As Integer
    Dim Scheibe_akt As Bit
    Dim A As Byte
    Dim B As Byte
    
    A = 0
    B = 0
    Scheibe = 1
    Punkte = 0
    
    
    Config Portd.0 = Output
    Config Portd.5 = Output
    Config Portd.6 = Output
    Config Int0 = Rising
    Config Int1 = Rising
    Enable Interrupts
    Enable Int0
    Enable Int1
    On Int0 Int0_5punkte
    On Int1 Int1_10punkte
    
    
    
    Do
    '---------------------'
    If Scheibe = 1 Then
    Portd.0 = 1
    Scheibe = 0
    Do
    Incr Scheibe
    Waitms 50
    If Scheibe_akt = 1 Then
       Goto Anfang
    End If
    Incr B
    If Scheibe = 3 Then
       Scheibe = 0
    End If
    Loop Until B = 15
    Scheibe = 2
    Portd.0 = 0
    Goto Anfang
    Else
       Portd.0 = 0
    End If
    '---------------------'
    If Scheibe = 2 Then
    Portd.5 = 1
    Scheibe = 0
    Do
    Incr Scheibe
    Waitms 50
    If Scheibe_akt = 1 Then
       Goto Anfang
    End If
    Incr B
    If Scheibe = 3 Then
       Scheibe = 0
    End If
    Loop Until B = 15
    Scheibe = 3
    Portd.5 = 0
    Goto Anfang
    Else
       Portd.5 = 0
    End If
    '---------------------'
    If Scheibe = 3 Then
    Portd.6 = 1
    Scheibe = 0
    Do
    Incr Scheibe
    Waitms 50
    If Scheibe_akt = 1 Then
       Goto Anfang
    End If
    Incr B
    If Scheibe = 3 Then
       Scheibe = 0
    End If
    Loop Until B = 15
    Scheibe = 1
    Portd.6 = 0
    Goto Anfang
    Else
       Portd.6 = 0
    End If
    
    Anfang:
    Scheibe_akt = 0
    B = 0
    Waitms 2000
    
    Incr A
    Loop Until A = 20
    Portd.0 = 1
    Portd.5 = 1
    Portd.6 = 1
    End                                                         'hier erscheint ein Ton und zeigt das Ende mit Ergebnis.
    
    '*************************************************************************'
    
    Int0_5punkte:
    Punkte = Punkte + 5
    Portd.0 = 0
    Portd.5 = 0
    Portd.6 = 0
    Scheibe_akt = 1
    Return
    
    Int1_10punkte:
    Punkte = Punkte + 10
    Portd.0 = 0
    Portd.5 = 0
    Portd.6 = 0
    Scheibe_akt = 1
    Return
    Geändert von DjEKI (13.02.2013 um 17:59 Uhr)

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Soltau - Niedersachsen
    Alter
    46
    Beiträge
    1.369
    Aha...das läuft also.
    Für mich sieht es immer noch ziemlich wirr aus - das ist dann wohl der sogenannte "Spagetti Code".
    Wo genau ist die Optimierung?
    Die Integers würde ich durch Words ersetzen, nicht das jemand denkt Du rechnest damit auch ins minus.

    Soll es nun ein Mega8 ; 32 oder 88 werden? Dann sollte man das vielleicht in den Code mit rein schreiben....

    Kennst Du das hier schon:
    http://halvar.at/elektronik/kleiner_bascom_avr_kurs/

    Ich hoffe das Dir bald klar wird, das dieser momentan Code sehr, wirklich,sehr sehr schwer auf 6 Scheiben erweitert werden kann.

    Viele Grüße
    Geändert von HeXPloreR (13.02.2013 um 18:11 Uhr)

Ähnliche Themen

  1. 4 Led´s unabhängig per Zufall blinken lassen?
    Von DanielSan im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 22
    Letzter Beitrag: 20.07.2011, 14:43
  2. Wie denn "Zufall" programmieren
    Von Cybrix im Forum C - Programmierung (GCC u.a.)
    Antworten: 16
    Letzter Beitrag: 11.06.2007, 10:10
  3. Zufall wirklich Zufall ???
    Von Speed im Forum Software, Algorithmen und KI
    Antworten: 3
    Letzter Beitrag: 03.08.2006, 13:03
  4. LED´s per Zufall leuchten lassen
    Von Hoomer im Forum Elektronik
    Antworten: 11
    Letzter Beitrag: 05.02.2006, 15:45

Berechtigungen

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

LiFePO4 Speicher Test