Assembler - PIC-Portabfrage

Hallo,

nochmal mein Assembler-Programm für meinen PIC16F627…

Die LED blinkt ja nun, ich hab auch schon (in einem anderen Programm allerdings) Pulsweitenmodulation hingekriegt und die Helligkeit geändert. Aber an den Tastern an Port A (genauer gesagt, der Abfrage, ob die Pins high oder low sind) scheitere ich :frowning:

An Port B hängen LEDs, an Port A0-3 über Widerstände Erde. Wird ein Taster gedrückt, wird zu +5V durchgeschaltet. Der Pin sollte somit high werden und die Blinkfrequenz müsste sich halbieren. Tut sie aber nicht; es passiert gar nichts, die LEDs blinken fleißig weiter. Und wie zuvor finde ich mal wieder keinen Fehler…muss man beim Abfragen irgendwas Wichtiges beachten, was in meinem Programm fehlt? In einigen Beispielprogrammen (bei denen die Taster funktionieren) sehe ich keinen Unterschied (was allerdings auch an dem Wirrwar aus Konstanten im liegen könnte), das finde ich sehr mysteriös…

Gleich folgt nochmal das Programm, leider wieder sehr hässlich.

mfg
MB

;*****Set up the Constants****

STATUS equ 03h ;Address of the STATUS register
TRISB equ 86h ;Address of the tristate register for port A
PORTB equ 06h ;Address of Port A
TRISA equ 85h ;Address of the tristate register for port A
PORTA equ 05h ;Address of Port A
COUNT1 equ 08h ;First counter for our delay loops
COUNT2 equ 09h ;Second counter for our delay loops

;****Set up the port****

bsf STATUS,5 ;Switch to Bank 1
movlw b’00000000’ ;Set the Port B pins to output
movwf TRISB
movlw b’11111111’ ;Set the Port A pins to input
movwf TRISA
bcf STATUS,5 ;Switch back to Bank 0

;****Turn the LED on****

Start movlw b’00100000’ ;Turn the LED on by first putting
movwf PORTB ;it into the w register and then
;on the port

;****Start of the delay loop 1****

call Delay

btfsc PORTA,0
call Delay

;****Delay finished, now turn the LED off****

movlw b’00000001’ ;Turn the LED off by first putting
movwf PORTB ;it into the w register and then on
;the port

;****Add another delay****

call Delay

btfsc PORTA,0
call Delay

;****Now go back to the start of the program

goto Start ;go back to Start and turn LED
;on again
;****Here is our Subroutine

Delay

Loop1 decfsz COUNT1,1 ;This second loop keeps the LED
goto Loop1 ;turned off long enough for us to
decfsz COUNT2,1 ;see it turned off
goto Loop1
return

;****End of the program****

end ;Needed by some compilers,
;and also just in case we miss
;the goto instruction.

Hallo,

COUNT1 equ 08h ;First counter for our delay loops
COUNT2 equ 09h ;Second counter for our delay loops

sind da jetzt zwei Ramzellen nachgewachsen oder ist der abgedruckte Programmtext nicht der verwendete?
Gruß
loderunner

Hallo,

COUNT1 equ 08h ;First counter for our delay loops
COUNT2 equ 09h ;Second counter for our delay loops

sind da jetzt zwei Ramzellen nachgewachsen oder ist der
abgedruckte Programmtext nicht der verwendete?

ups, da hab ich wohl aus Versehen die ältere Version kopiert. Die Adressen sollen 20h und 21h sein, die gibt es nämlich. Ich mache ja nicht den gleiche Fehler zwei Mal :smiley:

mfg
MB

Hallo,

Ich mache ja nicht den gleiche Fehler zwei Mal :smiley:

Ich schon. Ab und an. :wink:

Wie sieht es denn mit der Hardware aus? Hast Du mal direkt am Prozessorpin nachgemessen, ob der Taster funktioniert? Bitte die genaue Spannung am Pin messen.

Gruß
loderunner

Hallo,

Ich mache ja nicht den gleiche Fehler zwei Mal :smiley:

Ich schon. Ab und an. :wink:

naja, aber nicht so kurz nacheinander :smile:

Wie sieht es denn mit der Hardware aus? Hast Du mal direkt am
Prozessorpin nachgemessen, ob der Taster funktioniert? Bitte
die genaue Spannung am Pin messen.

Der Taster geht, ich messe 5,06 V. Das „Testprogramm“ des Brenners funktioniert auch mit Tastern. Problem: Ich sehe keinen Unterschied im Code. Muss man da vielleicht noch irgendwelche Einstellungen im PIC festlegen, damit man Input benutzen kann oder irgendwas in der Art?

mfg
MB

Hallo,

Der Taster geht, ich messe 5,06 V.

Und der andere Pegel? 0,0V?
Ist jetzt nicht mehr so wichtig, wenn Du unten weiterliest, aber für die Funktion einer Schaltung solltest Du nie nur einen Zustand messen - es könnte ja sein, dass es zufällig nur diesen einen Zustand gibt und der andere nicht funktioniert, ohne das man das merkt.

Das „Testprogramm“ des
Brenners funktioniert auch mit Tastern. Problem: Ich sehe
keinen Unterschied im Code.

Ich auch nicht. Ich sehe nichtmal den Code selber. :wink:

Muss man da vielleicht noch
irgendwelche Einstellungen im PIC festlegen, damit man Input
benutzen kann oder irgendwas in der Art?

Sollte auch aus dem Code hervorgehen. Und aus dem Datenblatt auf Seite31. Da steht sogar eine genaue Init-Sequenz für PortA. Die solltest Du mal ausprobieren.
PortA hat nämlich Spezialfunktionen, die Du erstmal ausschalten musst, sonst kannst Du gar nicht direkt auf die Pins zugreifen. Auf der nächsten Seite findest Du ein Blockschaltbild der Ports und doret kann man erkennen, dass der Porteingang über einen Schmitttrigger geht, der im Analogmodus gesperrt ist.
Alles klar?
Gruß
loderunner

Hallo,

Der Taster geht, ich messe 5,06 V.

Und der andere Pegel? 0,0V?

genau.

PortA hat nämlich Spezialfunktionen, die Du erstmal
ausschalten musst, sonst kannst Du gar nicht direkt auf die
Pins zugreifen.

Mhm, das könnte natürlich die Lösung sein. Ich probiere das nachher mal aus, erst muss ich noch neue Teile kaufen gehen :smile:

mfg
MB