Problem med att sätta hög nivå på utgångar (PIC12F683)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Zmod
Inlägg: 37
Blev medlem: 25 juni 2007, 16:32:16
Ort: Kungsbacka

Problem med att sätta hög nivå på utgångar (PIC12F683)

Inlägg av Zmod »

Hej!
Jag har börjat med PICar och håller på att testa lite försöker med att sätta pinnarna till hög nivå på GPIO porten som har 6pinnar GPIO<5:0> förutom nummer tre då den bara kan vara Ingång. Jag har lyckats att få GPIO<4,2:0> (GPIO bit 0-2,4) bitarna höga men den femte biten vill inte ställa om sig. Jag tror det har med att jag måste stänga av någon funktion i registret men jag fattar bara inte vilken det är.

Direktlänk till datablad för 12f683: http://ww1.microchip.com/downloads/en/D ... 1211D_.pdf

Kod: Markera allt

;Processor specific info
		processor 	12f683
		include		<p12f683.inc>
		__config	_HS_OSC & _WDT_OFF & _PWRTE_ON


                banksel GPIO	               ;
		clrf 	GPIO 			 ;Init GPIO
		movlw 	b'00111111'	   ;Set GP<5:0> to 
		movwf 	CMCON0 		    ;digital I/O
		banksel ANSEL 			;
		clrf 	ANSEL 			;digital I/O
		movlw 	b'00001000' 	  ;Set GP3 as inputs
		movwf 	TRISIO 		    ;and set GP<5:4,2:0>
							;as outputs


		banksel	GPIO	
		movlw	b'00110111'  ;Sätt hög nivå
		movwf	GPIO		;på GPIO 0-2, 4-5
Loop1
		goto	Loop1

                end

Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg av Andax »

Din config _HS_OSC, sätter inte den GPIO 5 till klockingång? Gissar att man måste köra med RC-osc för att alla 6 IO ska vara tillgängliga.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7466
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Du måste använda INTOSC om det skall fungera. Att det alls blir liv i den beror antagligen på någon oscillator failsafe funktion som finns i dessa nyare PIC's. Har inte studerat databladet jättenoga, så kan ha fel.

Titta på "Table 4-1", där listas pinne för pinne vilka olika register som har betydelse för dess funktion.
Zmod
Inlägg: 37
Blev medlem: 25 juni 2007, 16:32:16
Ort: Kungsbacka

Inlägg av Zmod »

Andax och Marta!

Ni har så rätt! Jag fick det att funka nu när jag använde INTOSC. Tusen tack för svaren :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jag har börjat med PICar...

Find, då passar det att ta ett par grundläggande saker... :-) :-)

1.
Du har bara satt *3* st CONFIG bitar. Det finns totalt 9 olika CONFIG
funktioner att bestämma. Ta det som en generell regel att alltid gå
igenom *alla* CONFIG bitarna och ta ett aktivt beslut hur varje
ska sättas. Då framgår det även i koden att du *har* tänkt och inte
bara missat något...

Om du hade gjort det här, så hade du sett den första biten FCMEN,
"Fail-Safe Clock Monitor Enabled bit". Nu så råkar default värdet
vara "on" så när din 683'a saknade kristall, så gick den över på INTOSC
automatiskt. Dock så är fortfarande OSC1/OSC2 pinnarna otillgängliga
för vanlig digital I/O.

2.
CMCON0 och GPIO råkar ligga i samma bank, och alltså så fungerar det
att utesluta BANKSEL för CMCON0. Jag vet inte om det var avsiktligt, och
i så fall måste du ha kollat upp det i minnes mappen. Finessen med
BANKSEL är just att *inte* behöva kolla upp vilken bank alla register
ligger i. I detta fall är det i uppstartskoden som normalt bara körs en
gång efter reset, så det är bättre att vara "safe then sorry".

Samma sak med ANSEL och TRISIO, det är säkrare med en extra
BANKSEL för TRISIO, även om den i detta fall är onödig.

Ett annan orsak till att använda BANLSEL mer är om du plötsligt vill sätta ett
register i en *annan* bank mellan dessa två register. Det är då väldigt
lätt att glömma att lägga dit den där extra BANKSEL om man hade "trimmat"
bort tidigare, men ganska svårhittade buggar som följd...

De övriga ca 10 raderna är väl ganska OK... :-)
Zmod
Inlägg: 37
Blev medlem: 25 juni 2007, 16:32:16
Ort: Kungsbacka

Inlägg av Zmod »

Tack Sodjan för svaret! Har plöjt igenom config registret nu och tror jag har lite mer koll på det iaf :). Det andra du påpekade om banksel är faktist Copy/Paste direkt från manualen för Processorn. Men jag förstår vad du menar :).

När vi ändå är igång med en nybörjar tråd. Så gjorde jag ett litet program som tänder och släcker en lysdiod. Men när jag för över det till programmeraren så får jag följande fel. Jag förstår dock inte vad det beror på.

Om jag ska gå igenom programmet hur jag har tänkt mig i svenska ord så är det att sätta hög nivå på GPIO 0 porten, vänta en halv sekund, sätta låg nivå på GPIO 0 porten, vänta en halv sekund, sedan hoppa tillbaks till början av programmet.

Jag har kontrollerat programmeraren (Wisp 648) så den funkar genom att bränna in Firmwaren för Wisp 648 på ett nytt 16F648A chip och det gick utan problem så jag antar det är något skumt med min kod. Vad det är förstår jag dock inte!

Någon som kan dra en kvalificerad gissning? =)


Kod: Markera allt

E:\Projekt\PIC\blinkaled>xwisp2w go blinkaled.hex
 xwisp2 version 1.9.3 for Windows (Dec 08 2007, Open Watcom C/C++ 1.70)
File blinkaled.hex loaded and is Intel Hex format conforming
Detected programmer: Wisp628, firmware version 1.23
Target: 12F683 revision 01 (ID=0461)
Target erased
Transferring program to 12F683 via Wisp628
Transferring program memory...OK!
Verifying program memory......failed at 000008, expected: '1683', found: '3FFF'
Write-Verify operation failed after 0.19 seconds, rc 21!
xwisp2 failed after 0.90 seconds, rc 21!
>>> Press 'Enter' to continue:

Kod: Markera allt

;---------------------------------------
;-----------Processor specs-------------

		processor	12f683
		include		<p12f683.inc>
		__config	_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _CP_OFF & _MCLRE_OFF & _CPD_ON & _BOD_OFF & _IESO_OFF & _FCMEN_OFF


;---------------------------------------
;-------------Variabler-----------------

		cblock	H'20'
			d1	
			d2
			d3
		endc

;---------------------------------------
;----------Initiering av I/O------------

		BANKSEL GPIO	 		;
		CLRF 	GPIO 			;Init GPIO
		MOVLW 	b'00111111'		;Set GP<5:0> to 
		MOVWF 	CMCON0 			;digital I/O
		BANKSEL ANSEL 			;
		CLRF 	ANSEL 			;digital I/O
		MOVLW 	b'00001000' 	;Set GP3 as inputs
		MOVWF 	TRISIO 			;and set GP<5:4,2:0> as outputs
		BANKSEL	WPU				;Stäng av pullup
		CLRF	WPU							
	

;---------------------------------------
;----------Det kända hoppet-------------

		goto start


;---------------------------------------
;-------------Subrutiner----------------



;xxxx-------------------------------xxxx
;xxxxxx-------Tänd/släck----------xxxxxx
Tand
		bsf		GPIO,0		
		return
Slack
		bcf		GPIO,0
		return	



;xxxx-------------------------------xxxx
;xxxxxx----------Delay------------xxxxxx

;En subrutin på en halvsekund
Delay
			;999990 cycles
		movlw	0x07
		movwf	d1
		movlw	0x2F
		movwf	d2
		movlw	0x03
		movwf	d3
Delay_0
		decfsz	d1, f
		goto	$+2
		decfsz	d2, f
		goto	$+2
		decfsz	d3, f
		goto	Delay_0

			;6 cycles
		goto	$+1
		goto	$+1
		goto	$+1

			;4 cycles (including call)
		return

;---------------------------------------
;-------------Huvudprogram--------------

Start
		banksel GPIO 	;Ställ oss i rätt bank
		call Tand		
		call Delay
		call Slack
		call Delay
		goto Start
								
						
;---------------------------------------
;-----------------Slut------------------
	
		end
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

Du har slagit av MCLR pinnen
kolla vad _MCLRE_OFF betyder så ser du.
Du behöver Vpp före Vcc.
JustNeed
Inlägg: 799
Blev medlem: 7 november 2007, 22:07:01
Ort: 08

Inlägg av JustNeed »

Det ser ut som om det är programmeringen som går snett vilket antagligen inte har med koden att göra.
Kolla om du har missat något i kretsen (ex. pull-up till MCLR).

edit: nvm, micke hittade felet.
Zmod
Inlägg: 37
Blev medlem: 25 juni 2007, 16:32:16
Ort: Kungsbacka

Inlägg av Zmod »

Micke: Jag testade att slå på MCLR pinnen i config registret. Men jag får samma fel fortfarande :S.

Vad kan det vara då som är fel?

Jag har dubbelkollat kopplingen till kretsen och den är korrekt!
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Det är i mjukvaran till programmeringsenheten du behöver göra ändringar. Dvs "Vpp före Vcc" som Micke skrev. Om programmeringsenheten inte klarar det behöver du modifiera den eller använda en annan.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

Sidan 3, 4 i användamanualen för Wisp:en
http://www.voti.nl/wisp648/wisp648.pdf
Zmod
Inlägg: 37
Blev medlem: 25 juni 2007, 16:32:16
Ort: Kungsbacka

Inlägg av Zmod »

Ja men nu förstår jag! Det var den där lille jumpern jag skulle montera på! =) Men jag läste att man ska använda något som ser till att strömmen inte blir för hög genom PICen när den kortsluter. Jag har kopplat allt i wispen direkt till pinnarna så var ska jag lägga in resistorn då? På MCLR pinnen?


Jag märkte en helt konstig grej.
Jag behöver bara ansluta "Röda kabeln" till en spänningskälla för att Wispen ska få spänning att dra igång? Ska det verkligen vara så?

Tack för svaren! :)
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Nej det är strömmen genom nätaggregat som behöver begränsas. Många nätaggregat har en sådan inställning. Strömmen genom VDD på picen blir ju 0 eftersom man kortsluter spänningskällan.
Zmod
Inlägg: 37
Blev medlem: 25 juni 2007, 16:32:16
Ort: Kungsbacka

Inlägg av Zmod »

Är det lugnt då om jag har ett dator spänningsaggregat? Löser den det själv? Måste väl göra det antar ja!

Jag testade och detta är med _MCLRE_ON i configen det enda som skiljer koden från ovan. Nu är jumpern på Wispen ditsatt så nu gör den VPP before VDD.
Men jag får samma fel. Så jag tänkte kolla igenom kontakterna och så i Wispen för det är väl troligast nått fel runt TIP122 då.

Edit: Hittar inget uppenbart fel. Så jag undrar vad det då kan vara? Om vi antar att jag har rätt i koden och kopplat rätt mot Kretsen. Vad återstår då som felkälla? Wispen själv? :P
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Datornätagg har ganska stora kondingar på utgången. Wispen kanske inte hinner ladda ur dom.

Testa att koppla ett motstånd på runt 10 ohm i serie med nätagget som strömbegränsning.

Så man måste man inte göra något i mjukvaran för att det ska funka?
Skriv svar