-         

Ergebnis 1 bis 6 von 6

Thema: Tastenabfrage 16f84a hardware oder software??

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.09.2007
    Beiträge
    11

    Tastenabfrage 16f84a hardware oder software??

    Anzeige

    Hallo zusammen,
    Ich habe ein Programm geschrieben, welches im Prinzip aus einem Taster einen Umschalter machen soll.
    Das heißt, wenn der Taster gedrückt wird, sollen zwei LEDs angeschaltet werden und das Programm in einer Abfrageschleife bleiben.
    Bei erneutem drücken sollen die LEDs wieder aus gehen und das Programm in einer anderen Schleife den Taster abfragen.

    Leider scheint es irgendwie Probleme bei der Abfrage zu geben und mal wird der Befehl übersprungen und mal nicht (obwohl der Taster nicht betätigt wird)

    Ich habe schon an einigen Stellen des Programms andere LEDs bzw. ausgänge auf 1 gesetzt und dadurch gesehen, dass das Programm wild durchsprungen wird, ohne den Taster korrekt abzufragen.

    Jetzt vermute ich, das irgendetwas mit der Initialisierung des Tasters nicht stimmt. Oder liegt es vielleicht doch an der Hardware?

    Vielen Dank fürs durchschauen.

    Code:
    ;$$$$$$$$$$$$$$ -- CONFIG -- $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    	list p=16f84a
    	include "p16f84a.inc"
    
    	 __config   _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF ;CONFIG
    
    
    	cblock  0x22 					; Variablen kenzeichnen
    		ZAEHLER1 
    		ZAEHLER2
    
    	endc  
    
    ;$$$$$$$$$$$$$$$$ -- INIT -- $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    	org		0x00
    
    
    	bsf		STATUS, RP0				;Wechsel in Bank 1
    	movlw	0x00					;PORTB OUTPUT
    	movwf	TRISB					;
    	movlw	0x01					;PORTA INPUT
    	movwf	TRISA					;
    	bcf		STATUS, RP0				;Wechsel in Bank 0
    	clrf	PORTB
    
    
    	movlw	0x00					;PORTB, setze alle Bits 0
    	movwf 	PORTB
    
    	goto	main	
    	
    ;$$$$$$$$$$$$$$ -- MAIN -- $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    
    
    
    main
    	movlw	0x00					;PORTB, setze alle Bits 0
    	movwf 	PORTB
    	call	wait
    
    
    loop								;Abfrage von Taster
    	BTFSS	PORTA,0					
    	CALL	switch	
    	goto	main
    
    
    ;$$$$$$$$$-SUBRUTINES-$$$$$$$$
    
    		
    
    switch
    								
    	movlw	0x03					;PORTB, setze Bits 1 und 2
    	movwf 	PORTB
    	call	wait
    
    loop3
    	
    	BTFSS	PORTA,0	
    	call	main
    	call	wait
    	goto 	loop3	
    			
    	return	
    
    
    
    
    wait								;Warteschleife
    loop1	decfsz	ZAEHLER1,1
    		goto	loop1
    		decfsz	ZAEHLER2,1
    		goto	loop1
    loop2	decfsz	ZAEHLER1,1
    		goto	loop2
    		decfsz	ZAEHLER2,1
    		goto	loop2
    
    		return
    
    	end

    [img] http://mitglied.lycos.de/schtiewen/switchbox.bmp [/img]

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    31.03.2004
    Ort
    Konstanz
    Alter
    36
    Beiträge
    18
    hab Dein Programm nicht ganz angeschaut. Aber vielleicht solltest Du die Taster "anders" anschließen. Jeweils noch mit einem Pullup- bzw. Pulldown-Widerstand. Weiss es nicht mehr genau, aber wenn Du einen Input-Pin unbeschaltet lässt (und das ist RA0 wenn der Taster nicht gedrückt ist) ist der Eingang undefiniert. Außerdem können "große" Ströme auftreten. Schau Dir am Besten mal auf www.sprut.de ein Beispiel mit Tastern an. (Beim Reset verursachst Du übrigens immer einen Kurzschluss)

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    29
    Beiträge
    116
    Hi,

    Nicht böse gemeint: Aber hast Du überhaupt Kenntnisse über Elektrotechnik, weil mir fallen da schon ein paar heftige Fehler auf wenn ich in den Schaltplan schaue - oder war da snur eine kleine Unachtsamkeit?

    Du fabriziertst hier nämlich einen satten Kurzschluss wenn Du S2 drückst.
    Außerdem sind die LEDs falsch herum angeschlossen, der Strich (Kathode) muss an GND, nicht wie hier an Vdd.
    Den Eingang RA0 solltest Du noch einen Widerstand spendieren (~ 1000 Ohm) damit wenn Du den PIC falsch konfigurierst (damit meine ich RA0 als Ausgang festlegst und diesen auf High setzt) kein Kurzschluss passieren kann, der den PIC ins Nirwana befördert wenn der Ausgang der High sein will extern auf GND gezogen wird.

    bei PICs gilt: MCLR muss High sein damit der PIC läuft. MCLR über einen 10k - 100k Widerstand mit Vdd verbinden - nicht direkt!

    EDIT: Du hast Vss (-) und Vdd (+) vertauscht. Das ist mir einmal passiert, da wurder der PIC zerstört und hat gut gequalmt. Also wenn Du das wirklich so angeschlossen hast ist er wohl schon kaputt.

    Kannst Du ihn mit einem Brenner testen?

    PS: Das Programm hab ich mir jetzt nicht mehr durchgeschaut, da ich denke erstmal das andere in Ordnung zu bringen ist sinnvoller.

    EDIT2: Die beiden Kondensatoren (als Belastung für den Quarz) gehören nicht an Vdd, sondern an Vss (GND)

    mfg
    Benny

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    26.09.2007
    Beiträge
    11
    Danke erstmal für die schnellen Antworten

    Klar, bei Schaltplan sind GND und 5V vertauscht b
    VSS an +5V
    VDD an GND

    MLCR hat nen 22k Widerstand...

    Die Eingänge also RA0 soll beim Drücken auf Masse gezogen werden.
    Soll ich da noch einen widerstand gegen Masse machen oder soll ich die Eingänge mit einem Hohen widerstand auf + legen??

    Der Brenner und die Schaltung funktionieren bei anderen Programmen (LED soll blinken, Binärzähler)
    Auch ein Anderes Programm, bei dem der Befehl BTFSC benutzt wird, funktioniert...

    btw. verzeiht die fehler auf dem plan

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    29
    Beiträge
    116
    Hi,

    gut das es nur im Schaltplan ist, es sei dir verziehen

    Also als Schutz für den PIC solltest Du die Eingänge entkoppeln, d.h. einen Schutzwiderstand verbauen damit falls ein Eingang versehentlich als Ausgang definiert wird kein hoher Strom fließen kann, der den PIC zerstört.

    Code:
    Ich versuch mich mal künstlerisch.
    RA0 ----- 1k ----- Taster ----- GND.
    Zwischen 1k und Taster noch eine Pullup (z.B. 4,7k) an Vdd (+).
    Nun zum Code:
    Code:
       movlw   0x00               ;PORTB, setze alle Bits 0
       movwf    PORTB
    machst Du schon indem Du clrf PORTB in der Zeile drüber ausführts. Nur mal so nebenbei.

    Funktioniert das:
    Code:
    loop3
       
       BTFSS   PORTA,0   
       call   main
       call   wait
       goto    loop3   
             
       return
    Ich habs jetzt nicht simuliert aba könnte es sein das Du einen Stack Überlauf produzierst, da Du hier main mit call aufrufst, d.h. er springt zu main (Rücksprungeadresse wird gespeichert), im main springt er zu wait (+ 1 weitere Adresse) irgendwann kommt er bei loop 3 das glecihe wiederholt sich bis der Stack überläuft (max. 8 Adresse), dann macht der PIC schmarrn.

    Am besten mal im MPLAB testen!

    mfg
    Benny
    cooming soon...

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    26.09.2007
    Beiträge
    11
    =D> =D> =D>
    Besten Dank! Hab nun einen Pull Up Widerstand eingelötet und siehe da, das Programm funzt!
    ein Hoch auf das Forum

Berechtigungen

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