PIC16F688 OC-utgång ?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

PIC16F688 OC-utgång ?

Inlägg 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


sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F688 OC-utgång ?

Inlägg 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 ?
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: PIC16F688 OC-utgång ?

Inlägg 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.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9126
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: PIC16F688 OC-utgång ?

Inlägg av AndersG »

Du har inte aktiverat "Weak Pullups"? (om nu 688 har det). De skall vara av om du vill simulera OC.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: PIC16F688 OC-utgång ?

Inlägg 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.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: PIC16F688 OC-utgång ?

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F688 OC-utgång ?

Inlägg 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 ?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F688 OC-utgång ?

Inlägg 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.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: PIC16F688 OC-utgång ?

Inlägg av persika »

Sodjan,
10k, som jag skrev i inlägget som råkade komma precis för ditt senaste.
Inget konstigt värde.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F688 OC-utgång ?

Inlägg 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 ?
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: PIC16F688 OC-utgång ?

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F688 OC-utgång ?

Inlägg 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.
Skriv svar