Sida 1 av 1

PIC16F876

Postat: 18 december 2015, 23:47:35
av nim
Hej
Jag har använt 16F84 och 12F509 i olika applikationer och det har hitintills fungerat bra. Nu behöver jag fler I/O och har köpt på mig ett antal 16F876. Efter 3 dagar med trail and error har jag inte åstadkommit mer än krökta pinnar när jag flyttar kretsen mellan programmeraren och lab-uppkopplingen. När jag inte använder någon "wait-cycle" så kan jag tända/släcka alla led utom RB6 RB3 och RC1 som lever sitt eget liv. Finns det någon vänlig själ som har lust att kolla vad jag gjort fel. Jag antar att det är en kollision någonstans eftersom samma program beter sig lika fel i flera olika 16F876.

Kod: Markera allt

	list      p=16f876            
	#include <p16f876.inc>       
	
	__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF 
	
	errorlevel	-302
	
	org	0x0000
	
	bsf		STATUS, RP0  		; select Bank1. (RP0 and RP1 are "0" by default)
	movlw		0x31			; W.REG = 00101111B  47
	movwf		ADCON1		; set up all pins of PORTA as digital pins 
	movlw		0x00			; 
	movwf		TRISA		; RA05-RA0 OUTPUT
	movlw		0x00			; 
	movwf		TRISB		; RB07-RA0 OUTPUT 
	movlw		0x00			; 
	movwf		TRISC		; RC07-RC0 OUTPUT
	bcf		STATUS, RP0  		; select Bank0

START	BSF	05,0		;RA0 tänds
		call	wait		;PRG kommer inte längre än hit
		BSF	05,1
		call	wait
		BSF	05,2
		BSF	05,3
		BCF	05,4
		BSF	05,5
		BSF	06,3
		BSF	06,6
		BSF	07,1
		BSF	07,7
		GOTO	START
    
var5		EQU		0x20
var6		EQU		0x21
wait	 movlw	0xff				
		movwf	var6	
loop6 	movlw	0xff	
		movwf	var5	
loop5	decfsz	var5,1	
		goto	loop5	
		decfsz	var6,1	
		goto	loop6	
		return	
		
		end

Error[115]   C:\16F876_TEST.ASM 80 : Duplicate label ("VAR5" or redefining symbol that cannot be redefined)
Error[115]   C:\16F876_TEST.ASM 81 : Duplicate label ("VAR6" or redefining symbol that cannot be redefined)
Error[113]   C:\16F876_TEST.ASM 89 : Symbol not previously defined (var6)
Error[113]   C:\16F876_TEST.ASM 91 : Symbol not previously defined (var5)
Error[113]   C:\16F876_TEST.ASM 92 : Symbol not previously defined (var5)
Error[113]   C:\16F876_TEST.ASM 94 : Symbol not previously defined (var6)

Edit: code-taggar tillagda - hcb

Re: PIC16F876

Postat: 19 december 2015, 00:33:45
av sodjan
Använd gärna (eller, inte bara gärna, gör det bara) code-taggarna för källkod!

> ...när jag flyttar kretsen mellan programmeraren och lab-uppkopplingen.

Varför gör du det? Ingen gör det idag... Programmera direkt i kopplingen (ICSP).

> bcf STATUS, RP0

Använd BANKSEL...

> BSF 05,5
> BSF 06,6
> BSF 07,1

Använd symbolerna som INC filen tillhandahåller...

Se till att få bort dina "Error" innan du försöka köra det.

> Finns det någon vänlig själ som har lust att kolla vad jag gjort fel.

Städa upp och rätta till koden först. Sen kan du felsöka.

Re: PIC16F876

Postat: 19 december 2015, 12:32:10
av Icecap
nim:
Som sodjan skriver: Code-tagger i, då ser man vad du försöker.

Men omedelbart ser jag ett par direkta fel:
var5 EQU 0x20
var6 EQU 0x21

Med denna deklaration är var5 och var6 labels, alltså inte ett värde. För att de ska uppfattas som ett värde sa det minst ett mellanslag eller Tab INNAN "varx".

Sedan är det ett rimligt dåligt sätt att deklarera variabler på (ja, jag har själv gjort det i sin tid), det är bättre att deklarera dom som:
"<tab>Var5<tab>res 1" (utan " och där <tab> betyder antingen ett eller fler mellanslag eller Tab).

Re: PIC16F876

Postat: 19 december 2015, 15:25:44
av lillahuset
En annan sak som jag noterade när jag höll på med PIC var att ibland var konfigureringen av oscillatorn kinkig.

Re: PIC16F876

Postat: 19 december 2015, 17:38:11
av nim
Jag brukar använda överdrivet mycket taggar för annars vet jag inte efter tag hur jag tänkte.
Här suddade jag bort allt som jag tyckte var överflödigt - mindre text, större chans att ngn orkar igenom den.
F.ö. finns ju taggarna kvar i INIT-delen där problemet troligen ligger eftersom RB3, RB6 och RC1 beter sig galet.

Förlåt, men den som inte vet att BSF 05,1 betyder sätt RA1 = H kan nog heller inte ge ngn hjälp.

Koden ser städad ut i MP-LAB men när jag gjorde copy/paste till forumet rasade alla kolumner ihop och tab och mellanslag fungerade plötsligt inte. Jag förstår att MP-ASM måste vara ren och jag har haft många rena varianter men alla har det gemensamt att de inte fungerar.
Att jag inte använder ICSP beror på att den programmerare jag byggde till SAT-TV för många år sedan har gjort god tjänst med alla 16F84 projekt fram till nu. För ett par veckor sedan inhandlade jag en PICKIT 3 till mina 12F509 så snart kan även jag programmera "in Circuit". Eftersom det funkade så bra att få igång 12F509 så var jag nog lite för optimistisk när det gäller 16F876. Det bär emot att hänga på en 4514 efter 16F84 bara för att få fler utgångar. Jag har sökt applikationsexempel för 16F876 på nätet som jag skulle kunna planka men inte hittat något vettigt. Mitt önskemål är
INPUT RA0 RA1 RA2 RA3
OUTPUT RA4 RA5 RB0 - RB7 RC0 - RC7
mvh
nim

Re: PIC16F876

Postat: 19 december 2015, 17:52:35
av Icecap
nim: OK, vi försöker igen...
När jag skriver detta finns det olika taggar ovanför fältet där jag skriver texten. En är B för BOLD, en är i för Italic osv.

Det finns även en Code-tag som - om den inramar kod - inte rensar bort Tabbat osv. Och det är DEN du ska använda.

Re: PIC16F876

Postat: 19 december 2015, 17:59:44
av TomasL
nim skrev:Förlåt, men den som inte vet att BSF 05,1 betyder sätt RA1 = H kan nog heller inte ge ngn hjälp.
Det där var nog att gå lite långt, lite ödmjukhet är ett krav här, om man skall få hjälp.
Du kan inte begära att vi skall leta reda på databladet för att lista ut att BSF 05,1 betyder RA1, använd det rekommenderade sättet i programmen.
Nu vet jag inte hur det fungerar i PICASM, men i C32 hade jag skrivit "PORTSetBits(IOPORT_A, BIT_1)" motsvarande finns i ASM också, så använd det.

Re: PIC16F876

Postat: 19 december 2015, 20:24:40
av sodjan
> Förlåt, men den som inte vet att BSF 05,1 betyder sätt RA1 = H kan nog heller inte ge ngn hjälp.

Jo, så skulle det ju kanske kunna vara... :-) :-)

Man "vet" det om man slår upp i databladet vilket register som ligger på adress 05.
Fullständigt onödigt så klart! Skriv "BCF PORTA, 1" istället och inget annat...
Du ska *aldrig* ange register med deras numeriska adress. Du ska alltid
ange deras symboliska namn från INC filen.

> Jag brukar använda överdrivet mycket taggar...

Oklart vad det är för "taggar" du talar om. Men jag ser nu att du har fått hjälp
att fixa till koden som det som borde ha varit från början. Bra så långt... :-)

Nu behöver du bara fixa till resten av punkterna som redan har nämnts.

Sen så... PIC16F876 är en idag *rejält* gammal processor.
Man får ha en riktigt bra anledning till att använda den idag.

> INPUT RA0 RA1 RA2 RA3
> OUTPUT RA4 RA5 RB0 - RB7 RC0 - RC7

Bara att stänga av alla analoga funktioner (om du inte behöver dom) samt
ställa TRISx rätt. Notera också att RA4 är OC, men det vet du kanske...

> Det bär emot att hänga på en 4514 efter 16F84 bara för att få fler utgångar.

Självklart ska du inte göra det. 16F84 hör hemma i soptunnan. :-)

Re: PIC16F876

Postat: 21 december 2015, 18:11:41
av nim
>Sen så... PIC16F876 är en idag *rejält* gammal processor.
>Man får ha en riktigt bra anledning till att använda den idag.

Köpt ett antal på Tradera för nästan inga pengar. Bra anledning för en smålänning :)

> Det bär emot att hänga på en 4514 efter 16F84 bara för att få fler utgångar.
>Självklart ska du inte göra det. 16F84 hör hemma i soptunnan. :-)

Köpte ett större parti på Tradera av en TV-pirat som fick avveckla när D2-mac slocknade.
Nu har jag bara 33 kvar så om något år så kanske jag också blir tvungen att lära mig något "modernt".
mvh
nim

Re: PIC16F876

Postat: 21 december 2015, 18:25:12
av sodjan
Ja, det är ju ganska stora förbättringar i de nyare modellerna. :-)

Men oavsett det, så ska så klart även en 16F876 *fungera*.

En annan sak. _LVP_ON. Om du inte använder LVP så bör du sätta den _LVP_OFF.
Om du dessutom inte har någon pull-down på LVP/PGM pinnen (RB3), så skulle
enbart det kunna förklara de fenomen som du beskriver.