Sida 1 av 1

PIC16F688 OC-utgång ?

Postat: 16 september 2010, 19:04:57
av persika
Jag tänkte mig använda en vanlig io-pinne som opencollector-utgång.
Så när det ska vara hög ut ska den vara en ingång, göres hög av ett yttre motstånd.
När den ska vara låg göres pinnen till en utgång med bitdata=0.

Jag har försökt, jag får inte det att funka, får bara hög ut hela tiden, ser inte vad jag gör för fel.

Kod: Markera allt

list      p=16f688          
#include "M:\MPASM Suite\P16F688.INC"      
	
	__CONFIG    _CP_OFF & _CPD_OFF & _BOD_OFF & _PWRTE_ON & _WDT_OFF & _EC_OSC & _MCLRE_OFF & _FCMEN_OFF & _IESO_OFF


;-------------------------------------------------------------
MotorKlarUtOC_L	macro

		banksel TRISA
		bcf	TRISA, 0	; ställ in utgång, bitdata=0 inställ i init
		banksel 0

endm
;-------------------------------------------------------------
MotorKlarUtOC_H	macro

		banksel TRISA
		bsf	TRISA, 0	; ställ in ingång
		banksel 0

endm
;-------------------------------------------------------------


init
			banksel CMCON0
			movlw	b'00000111'	; Comparator Off (Lowest power)
			movwf	CMCON0		

			banksel	ANSEL	
			movlw	b'00000010' ; analog in, tempsensor MCP9701
			movwf	ANSEL		



			banksel PORTA
			clrf	PORTA

			banksel TRISA
			movlw	b'00001011'  
			movwf	TRISA



			banksel PORTC
			clrf	PORTC

			banksel TRISC
			movlw	b'00010000'  
			movwf	TRISC


			banksel 0

; i huvudprogrammet

slinga
		movlw	d'5'
		call Tid01

		MotorKlarUtOC_L

		movlw	d'5'
		call Tid01

		MotorKlarUtOC_H
goto slinga



Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 01:02:19
av sodjan
Har du stegat det i MPSIM och kollat att du får det du
förväntar dig i TRIS och PORT register ?

Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 10:19:40
av persika
Jo, nu har jag stegat det en gång till i MPSIM, och får rätt svar, dvs TRISA bit 0 blir =0 (=utgång) mellan macroanropen MotorKlarUtOC_L och MotorKlarUtOC_H i huvudprogrammet.

Men i kopplingen ligger pinnen hög hela tiden när jag mäter med voltmeter.

Provade att belasta pinnen med 270ohm till GND, då får jag ut den förväntade pulseringen, men omvänt, dvs aktiv hög, men jag vill ju ha aktiv låg.

Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 10:24:51
av AndersG
Du har inte aktiverat "Weak Pullups"? (om nu 688 har det). De skall vara av om du vill simulera OC.

Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 11:18:25
av Marta
Du har ju mera program som inte visas i listningen. Kan det vara så att Du ändrar enstaka bitar i samma port för annat ändamål? Gör Du detta medan OC-pinnen är "1" så kommer portens dataregister också att bli "1", eftersom denna operation är en read-modify-write.

Lösningen är att istället läsa porten, ändra den bit som skall ändras med and/or, nolla den bit som alltid skall vara noll och sedan skriva tillbaka resultatet.

I fallet att en bit skall nollas kan det göras direket med and, då skall givetvis även OC-biten nollas.

Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 12:25:54
av persika
AndersG: "Weak Pullups"?
Jag har ett yttre motstånd (10k) som gör att pinnen går hög när den är som ingång, den verkar på samma sätt som WPU.

Marta: Tack för synpukter. Jo, det stämmer, andra delar av programmet använder PORTA, och det är där "olyckan" sker, att den aktuella bitens dataregister blir uppdaterad med OC-pinnens verkliga spänningsnivå.
Jag har gjort så att jag ställer in OC-pinnens dataregister till =0 precis innan jag ställer om den till utgång. Så nu funkar det.
Den enda fara jag ser med det, är om ett interrupt skulle göra nåt med PORTA mellan instruktionerna på rad 1 och 3, se nedan.

Kod: Markera allt

MotorKlarUtOC_L	macro

1:		bcf	PORTA, 0	; ställ in bitdata=0
2:		banksel TRISA
3:		bcf	TRISA, 0	; ställ in utgång, 
4:		banksel 0

endm

Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 12:26:25
av sodjan
> Så när det ska vara hög ut ska den vara en ingång, göres hög av ett yttre motstånd.

Det är det som är så hemligt med värdet på det motståndet så att
du inte kan ange det ?

Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 12:27:40
av sodjan
> ...är om ett interrupt skulle göra nåt med PORTA mellan instruktionerna på rad 1 och 3, se nedan.

Disabla interrupt under den tiden då, om det är känsligt.
Standardåtgärd i ett sådant fall.

Eller använd ett "shadow" register för PORTA där du gör alla bit-operationer
och sedan kopierar hela PORTA på en gång. Kan enkelt och snyggt hanteras
via ett par macron så att det bara blir ett "kommando" i koden.

Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 12:30:04
av persika
Sodjan,
10k, som jag skrev i inlägget som råkade komma precis för ditt senaste.
Inget konstigt värde.

Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 12:43:09
av sodjan
> Inget konstigt värde.

Nej, men hur ska vi kunna veta det ? Om du inte talar om det ?
(Frånsett att du postade det direkt för min fråga, så klart...)

Skit samma, det var ju ett RMW problem tydligen, eller hur ?

Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 13:02:31
av persika
>Nej, men hur ska vi kunna veta det ?

Så klart att ni inte kan veta det.
Jag visste inte att det skulle frågas om det, eftersom jag själv ansåg att motståndsvärdet var ok.
Men man vet ju aldrig vem som skapat tråden och den kanske hade kanske satt dit ett 10ohms motstånd istället för 10k.
Men det kvittar ju nu.

RMW-problem, ja det var det som spökade här.
Jag förstår inte nyttan av att RMW-metoden läser från pinnarna.
Borde ju gå lika bra att läsa från data-registret och sen skriva tillbaka.
Då skulle io-pinnarna ställa in sig efter registret, även om dom har kapacitiv last.

Re: PIC16F688 OC-utgång ?

Postat: 17 september 2010, 13:11:51
av sodjan
Det har ingenting med "nytta" att göra, det är bara så det fungerar.

> Borde ju gå lika bra att läsa från data-registret och sen skriva tillbaka.

Vad är "data-registret" ???
Finns inget som heter så, så vitt jag vet.

Du kan även ta och läsa på om LATx registren i PIC18 (eller i de nyare
PIC16F1xxx modellerna) så får du ett alternativt sätt att hantera det.