PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : einen PIN abfragen (Ganz übles Anfängerproblem)



Rev0luTio
20.03.2007, 22:31
Hi zusammen,

ich habe mir vor einiger Zeit beim großen C ein PIC Experimentierboard, welches den 16F627 beinhaltet, zugelegt.
Seit Wochen bin ich jetzt schon am probieren und verzweifle bald.
Ich bekomme es nicht gebacken einen einzelnen Pin (RA0) abzufragen welcher dann eine einzelne LED (RB0) anschalten soll.
Ich habe bestimmt tausend Tutorials gelesen, unter anderem auch die Sprut Page, aber es gibt nirgends ein einfaches simples Beispiel.
WeKaHe - Wer kann helfen?

T.J.
21.03.2007, 06:48
wir alle, wenn du uns dein Problem mal genau beschreibst! zeig mal deine Software und evtl. n Plan und sag was er macht/was nicht

Mobius
21.03.2007, 09:52
Wie T.J. sagt, ohne genauere Angaben können wir nur Raten und die Glaskugel befragen.

Aber um mal einige Fehlerquellen zu nennen, wieso ein Port-Eingang nicht funktionieren kann:
-) AD-Wadler: wenn der Chip so etwas hat, sicher, dass du ihn von Port A abgeschalten hast?
-) Comparator: betrifft, wenn ich mich so aus dem Stegreif erinnere nur den Port B, aber den schau an, weil normalerweise ist der beim Reset eingeschalten

Schau mal im Datenblatt auf der Übersicht, welcher Pin mit welchen Funktionen gemultiplext ist und dann beim betreffenden Kapitle, ob dieser auf abgeschalten UND von den Pins getrett ist (zB Comparator oder AD-Wandler sind ausgeschaltet, aber an die Pins "angeschlossen").
MfG
Mobius

Dan89
21.03.2007, 12:02
Hallo,

also, wenn meine Vermutung richtig ist, hast du das Velleman Board K8048? Wenn ja, dann ist da ja schon Software dabei, hast du die Beispielprogramme mal angeschaut?
Kann sein das, das jetzt nicht das ist was du wissen willst, aber wenn du einen einzelnen Taster abfragen willst, musst du das mit dem Befehl:

btfsc oder btfss,

hier testest du ein bit in einem bestimmten Register und die nächste Programmzeile wird übersprungen, wenn das bit gesetzt/gelöscht ist:

btfsc: bit test f skip if clear

btfss: bit test f skip if set

bsp.: btfsc porta,00
goto Taster1_gedrückt
.....

im Beipielprogramm des Boards, findest du diese Abfrage inder delay_routine, die aus 2 Schleifen besteht, um eine Pause zu erzeugen.
Allerdings ist hier die Portnummer durch sw1,sw2,... festgelegt.
Weiterhin ist dann noch wichtig, dass du die betroffenen I/O Ports, im trisregister vorherdefinierst, als ein-oder ausgang. Am besten du übernimmst den gesamten Kopf des beispielprogramms und beginnst nach dem reset-Teil dein eigenes. Dann hast du schon die ganze config usw....

Hoffe ich habe dir geholfen, ich hab auch mal mit diesem Board angefangen.....

T.J.
21.03.2007, 12:15
vllt. hat er auch vergessen den MCLR auf VDD zu ziehen.

Rev0luTio
21.03.2007, 17:54
Jep, ich hab das Velleman Board K8048.
Drauf der mitgelieferte 16F627
Hier mal mein Code den ich versucht habe aus der mitgelieferten Demo2.asm abzuleiten.



;list p=16f627 ;der Prozessortyp wird festgelegt
include "P16F627.INC" ;die include-Datei mit vielen Festlegungen wird geladen
;z.B. sind hier Standardnamen für wichtige
;Register und Bits festgelegt
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC





;hier steht das eigentliche Hauptprogramm

Init

bsf STATUS, RP0
movlw B'00000000'
movwf TRISB
movlw B'11111111';
movwf TRISA
movlw B'00000000';
movwf OPTION_REG
bcf STATUS, RP0
clrf PORTA
clrf PORTB



Main
btfsc PORTA,0
bsf PORTB,0
goto Main2

Main2
goto Main


end ;das Ende des Programms

kalledom
21.03.2007, 22:55
Bei der Initialisierung setzt Du bei PortB alle Ausgänge auf 0.
In Main setzt Du bei PortA.0 = 1 den PortB.0 auf 1; wo setzt Du diesen Ausgang wieder auf 0, wenn PortA.0 = 0 wird ?

T.J.
22.03.2007, 07:30
ich glaub das proggi ist noch verbesserungswürdig *g*

sitzt aber grad inner anderen Vorlesung :D

Rev0luTio
22.03.2007, 14:38
is schon klar das der port net wieder ausgeht wenn ich die Taste wieder loslass. Der Punkt is, der Port geht erst gar nicht an, aber das sollte er doch wohl, oder nicht?

kalledom
22.03.2007, 17:24
Da hast Du natürlich Recht, die LED sollte erst mal angehen.
Wenn der PIC Analog-Wandler hat, dann sind die I/Os von Port A nach dem Einschalten und nach jedem Reset Analog-Eingänge !
Du mußt im Register ADCON1 die gewünschten Pins von Port A als Digital-I/Os initialisieren. Das ist eine böse Stolperfalle.
Und an den Tastern die PullUp-Widerstände nicht vergessen.

orph
24.03.2007, 17:45
schreib mal folgendes in die Initialisierung:


movlw B'00000000' ;PORTA: I/O-Pins
movwf ANSEL

Damit ist mal sicher PortA auf die I/O-Funktion eingestellt.

Zudem sollteste mal versuchen, den Taster von Hand zu "simulieren" indem du einfach einen Drat von PORTA,0 an 5V hälts oder nicht. Damit kannst du mal testen, ob das Problem ev. am Taster-Aufbau liegt oder nicht.

greez

Rev0luTio
25.03.2007, 18:31
Ein Register ADCON1 oder ANSEL gibt es nicht.
Die Taster funktionieren sicher.
Wenn ich eines der mitgelieferten Demo programme draufbrenne geht alles was gehen soll.

Mobius
25.03.2007, 21:01
Jau, aber ein schneller Blick in den Datenblatt verrät:

Es hat etwas, das sich einem "Comparator Module" nennt und den PortA "besetzt". Schreib mal in deine Initialisierung diesen Code hinein (entnommen aus dem Datenblatt (http://ww1.microchip.com/downloads/en/DeviceDoc/40300C.pdf) von der Seite 29 ;):

banksel CMCON
movlw 0x07
movwf CMCON
banksel TRISA

Damit "kappst" du die analogen Eingänge der beiden Comparatoren von den Eingängen.
MfG
Mobius

kalledom
25.03.2007, 21:42
Stimmt, der PIC16F627 hat zwar Analog-Eingänge, jedoch für einen Compare, und nicht für AD-Wandlung. Nach dem Begriff 'Analog' fiel mir sofort die Stolperfalle mit dem ADCON1 ein und ich hatte nicht weiter gelesen.
Irren ist menschlich, sagte sich der Igel und kletterte von der Bürste.

orph
26.03.2007, 20:52
Irren ist menschlich, sagte sich der Igel und kletterte von der Bürste.

sehr bitter, aber der Igel ist halt kein Mensch, und darum kann er auch nicht menschlich Irren. ^^

Rev0luTio
28.03.2007, 20:23
Da ich jetzt nach Tagen endlich mal wieder dazugekommen bin weiter zu experimentieren stelle ich fest: Es waren tatsächlich eingeschaltete Comparatoren auf den Eingängen. Danke für die unkomplizierte Hilfe

T.J.
15.04.2007, 23:31
hallo, eigentlich geht es um die Statusabfrage für ein Display. Aber da ich generell probleme mit der Abfrage von signalen habe hier mein Problem:

ein ganz einfaches programm, PIC18F4685 :

Init:
bsf RCON, IPEN
bsf INTCON, GIEH
bsf INTCON, GIEL
movlw 0x70 ; maximale interne Frequenz 8MHz setzen
movwf OSCCON
movlw 0xFF
movwf TRISD ; PortD als Eingang definieren
clrf TRISC ; PortC als Ausgang definieren
return

Main:
; *** main code goes here ***
ORG 0x0100

rcall Init ;Initialisieren

Main_:
movf PORTD,w ; get status, statt dem w geht auch 0
nop
nop
nop
nop
movwf LATC

goto Main_

return


aber an den entsprechenden Pins des PORTC liegen nicht die Signale an, die ich an PortD anlege. Was mache ich falsch?