- 3D-Druck Einstieg und Tipps         
Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 42

Thema: Zielscheibensystem mit Zufall

  1. #21
    DjEKI
    Gast

    2.es Programm mit Simulationstest erfolgreich

    Anzeige

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

  2. #22
    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 16:59 Uhr)

  3. #23
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    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 17:11 Uhr)

  4. #24
    DjEKI
    Gast
    danke, da kann ich auch mal vorbei schauen.

    Der mega88 wird wohl zu klein sein vom Speicher her. Daher schau ich grad bei den mega325 und die haben derbe viele Interrupts, aber da sind soooo viele Pins, da will ich doch lieber die längliche Form haben Es kann aber auch ein Mega16 sein. Nur die Interrupts müssen mindestens 6 mal vorhanden sein. Der Code wird natürlich dementsprechend angepasst. Aber wenigstens konnte ich mal sehen, dass der Zufall und ein programmierter MC von mir funktioniert ^^

    mhm, der hier wirds wohl sein: ATmega328P
    Was meint Ihr? Ich habe irgendwo gelesen, dass PonyProg mit der P Serie nicht klar kommt. Stimmt das?

    mfg EKI
    Geändert von DjEKI (13.02.2013 um 17:22 Uhr)

  5. #25
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Warum sollte der damit nicht klar kommen? - davon hab ich jetzt noch nichts gehört.
    Allerdings kenn ich mich auch nicht mit PonyProg aus.

    Schau mal hier, vielleicht fällt dir was auf:
    EDIT: LINK ENTFERNT - DEFEKT

    Viele Grüße

    EDIT: Versuch den: http://www.reichelt.de/0/ADW/0/index...bc7ca1d4be5885
    Suche dann nach "328P"
    Geändert von HeXPloreR (13.02.2013 um 18:27 Uhr)

  6. #26
    DjEKI
    Gast
    ja, dass die Suche null treffer ergab

    Dein Link scheint nicht zu funktionieren.

  7. #27
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Der mega88 wird wohl zu klein sein vom Speicher her.
    Also, wenn die ganze Aufgabe darin besteht, per "Zufall" eine von 6 Scheiben auszuwählen und für eine bestimmte Zeit zu aktivieren, 12 Taster zu überwachen und ab und an mal 5 bzw. 10 Punkte aufzuaddieren, brauchst Du (wenn´s einigermaßen programmiert ist) garantiert nur einen Bruchteil von den 8 kB, die z.B. der Mega88 hat.

    aber da sind soooo viele Pins, da will ich doch lieber die längliche Form haben
    Das ist für den Anfang auch leichter, aber Du wirst schon eine ganze Menge I/O-Ports brauchen: Alleine schon für eine 4-stellige LED-Anzeige wären es mindestens 11 (wenn Du nicht weitere Hardware wie z.B. Display-Treiber verbauen willst). Plus 6 Stück, um die LEDs der sechs Scheiben anzusteuern. Und für die Taster-Abfrage gäbe es zwar die Port-sparende Alternative, nur mit 2 Interrupt-Eingängen zu arbeiten, und die Taster jeder Scheibe über einen eigenen I/O-Port auf High bzw. Low legen, um sie zu aktivieren bzw. zu deaktivieren. Macht also auch nochmal 8 Ports, womit Du schon mal bei 25 Anschlüssen bist...

  8. #28
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Ich hab nochmal darüber nachgedacht, wie man etwas sparsamer mit den I/O-Ports umgehen könnte. Herausgekommen ist eine Lösung, die mit zwei Interrupt-Eingängen auskommt, und weitere 6 Ports die Aktivierung der einzelnen Scheiben übernehmen, und zwar sowohl der Taster als auch der LEDs, die bei der aktiven Scheibe ja leuchten sollen.

    Zur Funktion: Die beiden Interrupt-Eingänge sind über die internen PullUp-Widerstände auf 1 gelegt und müssen folglich als "falling" konfiguriert werden. Die Taster jeder einzelnen Scheibe gehen dann auf einen I/O-Port. Liegt an diesem Port ein High, sind die Taster wirkungslos, weil sie den Interrupt-Eingang somit nicht auf Low ziehen können. Einer der 6 I/O-Ports ist also immer auf Low, und nur die daran angeschlossenen Taster können den Interrupt auslösen.

    Als "Abfallprodukt" kann man mit diesem Low-Pegel dann über einen PNP-Transistor auch gleich die LEDs einschalten. Für 6 LEDs (so sah ja Deine Zeichnung aus) brauchst Du sowieso pro Scheibe einen Transistor, denn soviel Strom kann ein normaler Port nicht liefern.

    Das hieße also, dass Du für die komplette Steuerung und Abfrage der Scheiben lediglich die beiden Interrupts + 6 I/O-Ports bräuchtest. Und somit käme der Mega8 wieder in Frage

    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_0085.jpg
Hits:	9
Größe:	38,5 KB
ID:	24506

  9. #29
    DjEKI
    Gast
    mhmmm, sehr schön. Habe ich sogar verstanden
    Transistoren habe ich reichlich hier. Denn ich wusste schon, dass die LEDs einen Transistor benötigen. Und da man Transistor sowieso benötigt, haut alles hin

    Also, dass werde ich noch ausprobieren. Dann werden später 3 weitere Zielscheiben ergänzt.

    Und da ich 2 weitere Spielmodies auf den MC programmieren wollte, fand ich den atmega8 etwas zu klein. Aber das is ja sowieso wurscht, ich habe hier nen atmega32 und der kann ruig dafür genutzt werden.

    Dann habe ich noch eine Frage. Der MC kann bis zu 16Mhz. Heißt das, intern sind 16Mhz Quarz verbaut? Wenn ich auf mein Board die Frequenz erhöhe, dann dauert das Programm doppelt so lang. Und was bringt mir, mehr Mhz einzustellen ?

    mfg EKI

  10. #30
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Das heißt Du kannst z.B. einen Quarz bis 16Mhz EXTERN anschliessen und der µC kann diesen Takt garantiert benutzen. Dazu müssen die Fuses eingestellt werden UND im Programm muss der verwendete Takt bei Crystal angegeben sein, damit die Zeiten im Programm richtig berechnet werden von Bascom.

    Was es bringt, neben mehr Stromverbrauch....naja, Dein Programm läuft mit 16MHz dann eben 16 mal schneller durch, als mit 1Mhz .... Pausen sollten klar sein: Wenn man 2000ms warten möchte, dass das Quarz unabhängig passieren soll.
    Daher auch die Angabe im Code...danach muss neu Compiliert und geflasht werden - sollte auch klar sein

    Viele Grüße

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Ä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, 13:43
  2. Wie denn "Zufall" programmieren
    Von Cybrix im Forum C - Programmierung (GCC u.a.)
    Antworten: 16
    Letzter Beitrag: 11.06.2007, 09:10
  3. Zufall wirklich Zufall ???
    Von Speed im Forum Software, Algorithmen und KI
    Antworten: 3
    Letzter Beitrag: 03.08.2006, 12:03
  4. LED´s per Zufall leuchten lassen
    Von Hoomer im Forum Elektronik
    Antworten: 11
    Letzter Beitrag: 05.02.2006, 14:45

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress