-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 36

Thema: 2.Programm :)

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von µautonom
    Registriert seit
    04.04.2007
    Ort
    Paderborn
    Beiträge
    222

    2.Programm :)

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo, ich hab nun ein neues Porgramm geschrieben.
    Und zwar soll der Taster 3mal betätigt werden, erst dann darf die LEd angehen. Leider macht er nicht das...., er macht die LEd immer an wenn ich taster betätigt hab.
    Benutze den PIC16F628A falls man das noch wissen muss^^
    Code:
    start
    		movlw 3
    		movwf 0x20       ;Speicherzelle wird die Zahl3 geladen
    		bcf PORTB, 0      ;LED ausmachen , fals sie gesetzt ist
    
    anf
    		btfsc PORTA, 0    ; Taster=0(betätigt), übergehe den  nachfolgenend Befehl
    		goto anf
    		decfsz 0x20, 1    ;Die Zahl3 um 1 verringern, wenn Speicherzelle = 0 nachfolgenen Befhel übergehen udn LEd anmachen
    		goto anf
    		bsf PORTB, 0      
    		clrw                   ;Arbeistregister löschen
    		goto start
    		
     end
    Was mach ich falsch?

    Mfg

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    16.03.2007
    Ort
    Mücke Sellnrod
    Alter
    30
    Beiträge
    58
    hallo µautonom
    ich vermute mal du benutzt einen normalen mechanischen Taster oder?
    die LED geht jedes mal an, da der Taster prellt. Da der µC in µSekunden das kleine Programm durchläuft zählt er die 3 bei einem Tastendruck herunter.
    Du musst denn Taster entprellen und im Programm darfs erst weitergehn wenn der Taster wieder losgelassen wurde.

    Gruß Carsten

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von µautonom
    Registriert seit
    04.04.2007
    Ort
    Paderborn
    Beiträge
    222
    Hi, PICVB ja ich benutze diese "Mikrotaster" das ist doch ein mechansicher Taster oder^^

    die LED geht jedes mal an, da der Taster prellt. Da der µC in µSekunden das kleine Programm durchläuft zählt er die 3 bei einem Tastendruck herunter.
    Du musst denn Taster entprellen und im Programm darfs erst weitergehn wenn der Taster wieder losgelassen wurde.
    ....oh man daran hab ich gar nicht gedacht, das ist gut möglich, danke dir.

    Mal sehn ob ich es hinbekomme, wenn nicht, meld ich mich nochmal.

    Mfg

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von µautonom
    Registriert seit
    04.04.2007
    Ort
    Paderborn
    Beiträge
    222
    Irgendwie krieg ich es nicht raus
    Code:
    start
    		movlw 3
    		movwf 0x20		; Speicherzelle wird die Zahl3 geladen 
    		bcf PORTB, 0		; LED ausmachen , fals sie gesetzt ist 
    
    anf		
    		btfsc PORTA, 0		; Taster=0(betätigt), übergehe den  nachfolgenend Befehl 
    							;wenn PORTA den Wert 0 hat, dann übergehen den nachfolgenden Befehl.
    		btfss PORTA, 0		;wenn PORTA den Wert 1 hat, dann übergehen den nachfolgenden Befehl.
    		decfsz 0x20, 1		; Die Zahl 3 um 1 verringern, wenn Speicherzelle = 0 nachfolgenden Befehl übergehen und Led anmachen 
    		goto anf
    
    		bsf PORTB, 0
    		clrw			; Arbeistregister löschen 
    		goto start
    		
     end
    Ich hab nochmal ne Bedingung gestellt, das wenn der Schalter unebtätigt ist, wieder den taster abfragen soll. Dann sollte er solange in der Schleife bleiben bis der Taster betätigt wird und zum Counter springen. Wenn das Ergebnis 0 ist Led anmachen, aber er macht trotzdem die LED an. Irgendwie werd ich nicht schlau draus ....

    Mfg

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    07.07.2007
    Beiträge
    48
    Hallo. Probier es mal so. Ich hab es selbst aber nicht getestet!!

    Code:
     start
                        movlw 3
                        movwf 0x20 
                        bcf PORTB, 0  
    
    anf      
                        btfsc PORTA, 0     
                        goto punkt2
    
    punkt1
    
                        btfss	PORTA, 0
                        goto	punkt1
                        decfsz     0x20, 1      
    
    punkt2    	
    
                        goto anf
                        bsf PORTB, 0
                        clrw
                        goto start
          
    	 end
    MfG

    frank

  6. #6
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Hallo!

    Wenn es die einzige Aufgabe des PICs ist, kann mann sich zum entprellen eines Tasters endlose Warteschleifen mit Bedingung leisten. Das Prinzip:

    Der PIC prüft eine Taste endlos. Wenn sie gedrückt wird, geht er in die zweite endlose Schleife und wartet, bis sie los gelassen wird. Erst dann macht er was, z.B. erhöht ein Zähler usw. Danach springt er an Anfang (in die erste Schleife). Zur Verdeutlichung ein PDA im Code. Die Änderung des Zählers geschieht also erst beim Loslassen der Taste, das Programm ist aber sehr einfach.

    MfG
    Code:
    
      .---+---------->V
      |   |   Taste gedrückt ? J >.
      |   |           N           |
      |   |           V           |
      |   `-----------´           |
      |                           |
      |              .----------->V
      |              |   Taste losgelassen ? J >.
      |              |            N             |
      |              |            V             |
      |              `------------´             |
      |                                         |
      |                                         V
      |                                   Zähler erhöhen
      |                                        usw.
      |                                         V
      `-----------------------------------------´
    
       J = ja
       N = nein

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    17.03.2006
    Beiträge
    22
    Hallo,

    ich bin zum einen Überrascht, dass die LED überhaupt leuchtet.

    Wenn Du Dir die letzen Programmzeilen noch mal anschaust:

    1. Die LED wird eingeschaltet
    2. Rücksprung zu Start
    3. Dort wird die LED wieder ausgeschaltet

    Nach dem Einschalten der LED werden also nur 6 Befehle abgearbeitet, bevor die LED wieder ausgeht.
    Bei einem 4 MHz Quartz sind das ca. 6µs.
    Dieser Ablauf geschieht so schnell, dass das kurze Leuchten der LED gar nicht gesehen werden kann.

    Frage: Welchen Taktgeber benutzt Du?
    Kleiner Tip zum Üben: Wenn Du den PIC mit einem RC-Glied taktest (wenige Hz), dann kannst Du bei kleinen Programmen die einzelnen Schritte gut mitverfolgen.
    Außerdem fällt das Prellen des Schalters nicht ins Gewicht, weil der PIC zu langsam ist.

    Zum Schalterprellen:

    Es gibt Schalter, die prellen richtig lang und es gibt welche, die prellen (fast) gar nicht.

    Ich habe mal mit einem OSZI nachgemessen und bei einem (hochwertigen) Schalter einige ms Prellzeit gemessen - siehe Anhang.
    Entprellen mit dem PIC ist möglich, wenn man nach der High-Erkennung eine Zeitschleife startet (am besten ca. 10 ms)
    und erst danach mit dem Programm weitermacht. (also keinen Timer benutzen, sondern eine verschachtelte Zeitschleife).

    Dann kannst Du dich entscheiden, ob das Programm erst beim Loslassen weitergeht oder sofort. Auch beim Loslassen kann der Taster prellen !!
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken schalterprellen_kurzhub.jpg   schalterprellen_knitter.jpg  

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von µautonom
    Registriert seit
    04.04.2007
    Ort
    Paderborn
    Beiträge
    222
    Hallo Leute danke erstmal das ihr mir helft,

    @frank85 den COde werd ichgleich mal testen.

    @PICture, ja ich erstelle mir auch bevor ich loslege zu programmieren ein Programmablaufplan(PAP) oder Struktogramm, sah so ähnlich wie deins aus.
    Sehr hilfreich

    @robotcheck hab dazu noch ein interessanten Artikel gefunden

    http://www.mikrocontroller.net/articles/Entprellung
    Wenn ich richtig verstanden udn das aus deiner 2.Grafik richtig deute kann es passieren das bei einigen Tastern die "prellen" den Zustand während man ihn gedrückt hält ändern "prelllen" ? in der 2. Grafik sieht man ja das sich der Zustand an einigen Stellen einfach ändert.

    Frage: Welchen Taktgeber benutzt Du?
    Ich benutze einen 8Mhz Resonater, vielleicht sollte ich es mal mit einem Takt im Hz bereich probieren.

    Mfg

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    17.03.2006
    Beiträge
    22
    Hallo,
    fast richtig... Das Prellen entsteht genau in dem Moment, wenn die mechanischen Kontakte durch den Druck des Fingers aufeinandertreffen.
    Der Widerstand des Schalters muss sich in diesem Augenblick von unendlich Ohm auf null Ohm reduzieren. Das geschieht innerhalb von Nano- bis Millisekunden.

    Das Prellen kann sich noch verstärken, wenn man dafür anfällige Schalter ganz langsam drückt und am Schaltpunkt hält.

    Ist der Kontakt danach richtig hergestellt, gibt es kein Prellen mehr, bis sich der Kontakt wieder öffnet. Beim Öffnen kann dann genau das gleiche passieren.

    Mit dem PIC löst man das Entprellen mit einer Zeitschleife. 10 ms Entprellzeit sind für einen Tastendruck nicht viel. Daher stört es in der Regel nicht, wenn das Programm an dieser Stelle eben 10 ms auf der Stelle tritt.

    Bei 8 MHz sind das 20000 Zählschritte.

    Die Zeitschleife sollte als Unterprogramm abgelegt werden. Dadurch kann sie bei jedem Öffnen und Schließen des Tasters mit nur einem Befehl aufgerufen werden.

    Solltest Du weiterhin Probleme damit haben, dann Poste bitte das ganze Programm. Vielleicht ist ja noch was in der Konfigurierung falsch.

  10. #10
    Erfahrener Benutzer Begeisterter Techniker Avatar von µautonom
    Registriert seit
    04.04.2007
    Ort
    Paderborn
    Beiträge
    222
    Hi,

    Mit dem PIC löst man das Entprellen mit einer Zeitschleife. 10 ms Entprellzeit sind für einen Tastendruck nicht viel. Daher stört es in der Regel nicht, wenn das Programm an dieser Stelle eben 10 ms auf der Stelle tritt.
    Nun ja wo kann ich nachgucken wieviel Zyklen ein Befehl hat und wieviel µSek. ein Zyklus ist. Beim 80C535 kann ich mich noch errinern, das ich eine Befehlsliste hatte in der eine Extra Spalte für "Zyklen" gedruckt wurde und ein Zyklus wurde genau in 0,75µs abgearbeitet.
    Wie sieht es bei den PICs aus? Nur so kann ich ja eine genau 10ms lange Warteschleife programmieren oder geht das auch anders?


    Die Zeitschleife sollte als Unterprogramm abgelegt werden. Dadurch kann sie bei jedem Öffnen und Schließen des Tasters mit nur einem Befehl aufgerufen werden.
    Reicht da ein "call" um das Unterprogramm aufzurufen oder kann ich das mit "goto" lösen?

    Digger hat in meinem Thread "1.Programm" Delay Zeiten die an 8MHz angepasst sind eingebaut, hab ich aber auch nicht so wriklich verstanden wie man das macht und ob ich das verwenden kann?

    ->
    Code:
    ;**********SUB _Routinen*************************
    DEL1MS      movlw   D'198'      ;t=(n-1)*5+2(call)+6(ret)+7(Kopf)
          movwf   count
          nop
          goto $+1
          goto $+1
    DLY1MS      goto $+1
          decfsz   count,f
          goto DLY1MS
          return
    DEL200MS   movlw   D'199'
          movwf   tempa
    DLY200      call   DEL1MS
          decfsz   tempa,f
          goto   DLY200
          movlw   D'132'
          movwf   count
    TWEEK200   decfsz   count,f
          goto   TWEEK200
          nop
          return
    DELAY500   movlw   D'250'
          movwf   tempa
    DLY500      call   DEL1MS
          decfsz   tempa,f
          goto   DLY500
          movlw   D'64'
          movwf   tweek
    TWEEK500   decfsz   tweek,f
          goto   TWEEK500
          movlw   D'250'
          movwf   tempa
    DLY501      call   DEL1MS
          decfsz   tempa,f
          goto   DLY501
          movlw   D'64'
          movwf   tweek
    TWEEK501   decfsz   tweek,f
          goto   TWEEK501
          return
    end
    ich werd das erstmal alleien versuchen, wenn ich es nicht hinbekomme werd ich den ganzen Code posten. Vielen Dank ^^

    EDIT::// @frank85 Hab gerade deinen Code getestet , es tut sich leider nix,

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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