PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastenabfrage 16f84a hardware oder software??



hixc
27.12.2007, 19:02
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.




;$$$$$$$$$$$$$$ -- 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




http://mitglied.lycos.de/schtiewen/switchbox.bmp

seven
27.12.2007, 19:32
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)

HF SHOOTER
27.12.2007, 19:43
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

hixc
27.12.2007, 20:38
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 O:)

HF SHOOTER
27.12.2007, 21:02
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.


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:


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:

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

hixc
31.12.2007, 15:24
=D> =D> =D>
Besten Dank! Hab nun einen Pull Up Widerstand eingelötet und siehe da, das Programm funzt!
ein Hoch auf das Forum :D