-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Programm möchte nicht.

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341

    Programm möchte nicht.

    Anzeige

    Hi, ich habe folgendes Programm geschriben.

    Code:
    $regfile = "m16def.dat"
    $crystal = 16000000
    
    Config Porta.0 = Output
    Config Portd.7 = Output
    Config Pina.2 = Input
    Dim Zeit As Byte
    Dim Main1 As Long
    Dim Main2 As Long
    Dim Main3 As Long
    
    Main1:
    Zeit = 0
    Portd.7 = 1
    Waitms 300
    Portd.7 = 0
    Waitms 300
    Portd.7 = 1
    Waitms 300
    Portd.7 = 0
    Goto Main2
    
    Main2:
    Porta.0 = 1
    If Pina.2 = 0 Then
    Porta.0 = 0
    Goto Main3
    End If
    
    Main3:
    Zeit = Zeit + 1
    
    
    If Zeit = 10 Then
    Porta.0 = 1
    Portd.7 = 1
    Waitms 3000
    Porta.0 = 0
    Portd.7 = 0
    End If
    
    If Zeit = 15 Then
    Porta.0 = 1
    Portd.7 = 1
    Waitms 3000
    Porta.0 = 0
    Portd.7 = 0
    End If
    
    
    End
    Wobei Pina.2 einem Taster (Öffner) entspricht.

    Wenn ich das Programm nun compilieren lasse, gibt es keine Fehlermeldungen von Basecom. Das Programm scheint aber nicht richtig zu laufen. An PORTD.7 hängt ein pieper. Der piept auch 2 mal wenn das Programm abläuft. Allerdings geht das programm danach nicht mehr weiter. Sprich wenn ich den Taster drücke passiert nichts mehr.

    Woran kann das liegen ?

    mfg Blamaster

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    du solltest vielleicht eine Do-Loop-Schleife einbauen, weil so geht das Programm einmal durch und ist dann (bis zum nächsten Reset) fertig.

    mit dem Do-Loop machst du ne endlosschleife.
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Also praktisch ein Do vor dem Main1: und ein Loop vor END ?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    Ja, so sollte es gehen.

    Das END kannst du dir übrigens dann auch sparen, da es ja nie ein ende gibt.
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Hat leider auch keinen positiven effekt und der pieper piepst jetzt die ganze Zeit.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Wenn der Piepser IN der Do-Loop-Schleife ständig geschaltet wird, ist das normal. Einfach mal den Teil, der piepen soll, nach aussen, vor DO verfrachten.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    Öhm, was soll denn das Ziel von dem Ganzen sein?

    auserdem sehe ich, dass du deine Zeit zwar in Main3 dauernd incrementierst, aber nie wieder auf 0 zurücksetzt. Was ist der Zweck davon?

    vlt hilft es, statt
    Code:
    Main2: 
    Porta.0 = 1 
    If Pina.2 = 0 Then 
    Porta.0 = 0 
    Goto Main3 
    End If
    das hier zu schreiben:
    Code:
    Main2: 
    Porta.0 = 1 
    If Pina.2 = 0 Then 
    Porta.0 = 0 
    Goto Main3 
    Else
    Goto Main1
    End If

    versuche doch mal, die Mains wegzulassen, also statt "Goto Main2" einfach die Main2-Funktionen hinschreiben.
    das wäre evtl etwas einfacher, und du brauchst nicht so viel speicherplatz.


    Du könntest übrigens auch statt der Do-Loop-Schleife einfach am ende deines Programmms "Goto Main1" schreiben. das hätte hier den selben effekt. (voher hattest du ja das problem, dass dein programm im Leeren endet, was damit genauso gelöst wäre)
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Das Programm hat Folgende Funktionen:

    1. Wenn das Programm gestartet wird, soll der Piepser 2 mal piepsen.

    Danach soll erstmal nichts weiter passieren als das der Kanal PORTA.0 = 1 geschaltet wird.

    Wenn dann der Taster PINA.2 = 0 gezogen wird, soll die "Timer" bzw. "Zeit" Variabele anfangen im Sekundentakt zu zählen, und halt beim erreichen von bestimmten Zeiten für ein paar sekunden den PORTA.0 schalten.

    Das problem ist halt nur das wenn ich den Taster momentan drücke rein garnichts passiert, sondern die Lampe die an PORTA.0 hängt durchgehend leuchtet.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    dann setz die Beep-Befehlsfolge vor die Do-Loop-Schleife, dann hat sich das schonmal.

    Goto Main2 und Main2 kannst du dir im übrigen sparen, das brauchst du nicht. (da springst du ja eh über nix drüber)

    Hast du nen externen Pullup-Widerstand am Taster? Und geht der Taster nach GND?

    vlt geht das:
    Code:
    $regfile = "m16def.dat" 
    $crystal = 16000000 
    
    Config Porta.0 = Output 
    Config Portd.7 = Output 
    Config Pina.2 = Input 
    Porta.2 = 1   ' (edit:) !!!Weil du da keine externen pullups hast!!!!!
    Dim Zeit As Byte 
    Dim Main1 As Long 
    
    Dim Main3 As Long 
    
    
    Portd.7 = 1 
    Waitms 300 
    Portd.7 = 0 
    Waitms 300 
    Portd.7 = 1 
    Waitms 300 
    Portd.7 = 0 
    
    
    Main1: 
    Zeit = 0 
    
    
    
    Porta.0 = 1 
    If Pina.2 = 0 Then 
    Porta.0 = 0 
    Goto Main3
    Else 
    Goto Main1 
    End If 
    
    Main3: 
    While Pina.2=0  'es muss ja solange sein, bis der Taster wieder geschlossen wird
    Zeit = Zeit + 1 
    
    
    If Zeit = 10 Then 
    Porta.0 = 1 
    Portd.7 = 1 
    End If
    
    If Zeit = 15 Then 
    Porta.0 = 1 
    Portd.7 = 1
    Zeit = 0          ' so würde die lampe nach 30 Sekunden und nach 45 sekunden für je 3 sec angehen, der Beeper auch
    End If 
    
    Waitms 3000  'weil sonst deine "Zeit" nicht wartet zwischen dem Zählen
    Porta.0 = 0  'wenn die eh aus sind, dann juckts keinen, wenn nicht, dann passts
    Portd.7 = 0  'weil dann eine der If-Schleifen dran war, und du das nicht in der If-Schleife brauchst.
    
    Wend
    
    Goto Main1
    EDIT: gnaah, ich überseh immer wieder kleine fehler im prog.
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Der Taster ist ein Öffner kein Schließer

    Deswegen müssen die Internen pull ups ja nicht an.

    Mit dem Code funkts auch nicht wieder viel gepiepe, aber den Taster interessiert es nicht ob man ihn drückt oder nicht.

    Und jo Taster geht auf GND

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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