Pic 16F88 vill inte blinka...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Pic 16F88 vill inte blinka...

Inlägg av PHermansson »

Har kopplat upp en 16F88 med ett par lysdioder, kör med den interna oscillatorn. Fixade ett litet testprogram för att blinka med lysdioderna i C, det fungerade fint. Sedan ville jag göra samma sak i Asm men då funkar det inte...

Kod: Markera allt

	list      p=16f88           ; list directive to define processor
	#include <p16F88.inc>        ; processor specific variable definitions

	errorlevel  -302              ; suppress message 302 from list file

	__CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO
	__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.




;***** VARIABLE DEFINITIONS
w_temp        EQU     0x71        ; variable used for context saving 
status_temp   EQU     0x72        ; variable used for context saving
pclath_temp   EQU     0x73	  ; variable used for context saving

;Wait subroutine
count1  equ     0x0C      ; wait counter ls digit file register C
count2  equ		0x0D	; wait counter ms digit file register D
same	equ	1



;**********************************************************************
	ORG     0x000             ; processor reset vector
	goto    main              ; go to beginning of program
	

	ORG     0x004             ; interrupt vector location
	movwf   w_temp            ; save off current W register contents
	movf	STATUS,w          ; move STATUS register into W register
	movwf	status_temp       ; save off contents of STATUS register
	movf	PCLATH,W	  ; move PCLATH register into W register
	movwf	pclath_temp       ; save off contents of PCLATH register

; isr code can go here or be located as a call subroutine elsewhere


	movf    pclath_temp,w     ; retrieve copy of PCLATH register
	movwf	PCLATH            ; restore pre-isr PCLATH register contents
	movf    status_temp,w     ; retrieve copy of STATUS register
	movwf	STATUS            ; restore pre-isr STATUS register contents
	swapf   w_temp,f
	swapf   w_temp,w          ; restore pre-isr W register contents
	retfie                    ; return from interrupt


main
	BSF STATUS, RP0 ; Select Bank1
	MOVLW B'11111000'
	MOVWF TRISA
	MOVLW B'00000000' ; Value used to initialize data direction
	MOVWF TRISB ; 
	MOVLW B'00000000'
	MOVWF	ANSEL
	MOVLW	B'01100000' 	;osc=4MHz
	MOVWF	OSCCON
	BCF	STATUS, RP0	;Select Bank 0

	;Led off
	MOVLW	0xFF
	MOVWF	PORTA
Loop
	BCF		PORTA, 1
	call wait
	BCF		PORTA, 0
	call wait
	goto Loop

wait    
	movlw   0xA	        ; load count1 with decimal 200
	movwf   count1
d1	movlw   0xA		; load count2 with decimal 200
	movwf   count2	; shorten these for the simulator
	BCF PORTA,2
d2	decfsz  count2,same	; decrement and skip next line if zero
	goto 	d2		; if not zero		
	BSF PORTA,2
	decfsz  count1,same		; decrement count1 if count2 is zero
	goto 	d1		; do inside loop again if count2 nz

	return
Lysdioden på PORTA,2 används som felsökare, och det ser ut som koden stannar i wait-rutinen:

Kod: Markera allt

	BCF PORTA,2
d2	decfsz  count2,same	; decrement and skip next line if zero
	goto 	d2		; if not zero		
	BSF PORTA,2
BCF tänder dioden, sedan borde BSF släcka den men det händer inte. Har försökt använda olika värden på count1 och count2 men ingen skillnad. Vad kan vara fel?
Användarvisningsbild
Schnegelwerfer
Inlägg: 1863
Blev medlem: 8 november 2004, 13:46:56

Inlägg av Schnegelwerfer »

EDIT: tankefel från min sida...

EDIT2: Min hjärna är inte i form för att felsöka loopar idag... dags för lunch tror jag... :oops:

Edit3: Nu ger jag upp. Glöm det här inlägget!
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

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

Re: Pic 16F88 vill inte blinka...

Inlägg av sodjan »

Först, jag utgår från att du kör "normala" utvecklingsvektyg, alltså MPLAB/MPASM (MPLINK)

> d2 decfsz count2,same ; decrement and skip next line if zero


Här bör det stå "w" eller "f" istället för "same".
Jag ser att du har definierat en symbol "same" men det är dels onödigt, dels förvirrande för de som försöker hjälpa dig. Använd de symboler som är definierade i utvecklingsmiljön så blir det enklare för alla (inkl dig själv).

> count1 equ 0x0C ; wait counter ls digit file register C
> count2 equ 0x0D ; wait counter ms digit file register D

0x0C = PIR1
0x0D = PIR2

Eftersom flera bitar i dessa register är "read-only", kommer de aldrig att bli "noll". Antagligen vill du inte används dessa register på detta sätt i alla fall...

För att undvika denna typ av "fel", så är det bättre att helt skippa
"absolute mode" och enbart köra "relocatable mode".

EQU (eller CBLOCK) skall inte användas för att ange minnes adresser, används RES istället. RES kommer *aldrig* att göra samma misstag som du har gjort (med PIR1/PIR2).

Så vitt jag ser använder du inte interrupt. Innan du postar kod, städa bort *allt* som inte används ! Sannolikheten är stor att du samtidigt ser dina egna buggar och inte behöver posta koden alls... :-)
Användarvisningsbild
Abra Hana
Inlägg: 94
Blev medlem: 12 maj 2005, 13:20:58

Inlägg av Abra Hana »

Som sodjan skrev . Du bör rensa all kod som behandlar interrupt Om du inte använder den .
Om du har tillåtit interrupt , så tycker jag att du vald fel procedure för hur man sparar SATATUS register i status_temp .

movf STATUS,w ; move STATUS register into W register

movf ändrar bit Z i status innan den spara sparar STATUS till W .Så den är olämpligt för att spara status register.

Jag tycket att du bör använda swapf istället .

swapf STATUS , w ;
movwf status_temp ;

återställning av status register .

swapf status_temp , w ;
movwf STATUS ;
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

En annan sak...

> BSF STATUS, RP0 ; Select Bank1

Gäller *bara* om du tidigare *inte* var i Bank2 (eller 3) !

> BCF STATUS, RP0 ;Select Bank 0

Gäller *bara* om du tidigare *inte* var i Bank3 (eller 2) !

För att vara säker (speciellt under felsökning) bör du alltid se
till att sätta båda RP0 och RP1 (i en PIC med 4 banker...).

Jag tror inte att det hjälper i just detta fall, en i alla fall...
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Inlägg av PHermansson »

Tack Sodjan, återigen har du löst mina Pic-bryderier! :) Sist var det väl en elak config-bit, nu var det mina variabler. Tack för alla svar, nu har jag lärt mig mer om 88'an, bland annat att det inte fungerar att kopiera gammal 84'a kod rakt av :)
Kanske ska va lite tydlig fast jag e trött... Jag ändrade

Kod: Markera allt

count1 equ 0x0C 
count2 equ 0x0D
till

Kod: Markera allt

count1  RES    1
count2  RES    1
så fungerade det, nu blinkar led'en fint! Får nog ta och läsa på lite tror ja :)

Edit: verkar som BSF STATUS, RP0 ; Select Bank1 måste vara med? Det fungerar inte annars...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Hm, det är möjligt att det räcker med att *enbart* ändra EQU -> RES, men normalt är det lite mer som man skall "fixa" när man går från "absolute code" till "relocatable code". Jag har inte kollat upp RES i MPASM manualen i detalj...

> "verkar som BSF STATUS, RP0 ; Select Bank1 måste vara med? Det fungerar inte annars..."

Tja, :-)

Jag har inte kollat din kod, men det BÖR vara uppenbart om du behöver byta bank eller inte. Här kan inte finnas någon tvekan, kolla vilka register du använder och vilka banker de ligger, så skall det vara kristallklart...
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Dessa satans bankerna... Man borde nog lära sig 18f ist...men som vanligt - ont om tid... Fast kör man 10f2xx behöver man inte heller bry sig ;)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Angående bankerna...

Bäst är ju att låta utvecklingsmiljön själv avgöra om bank-switching behövs eller inte. Antingen med de directiv som är inbyggda i MPASM, eller med de verktyg som Olin Lathrop har i sin miljö (se anna tråd...)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> "Man borde nog lära sig 18f ist"

Inte mycket att "lära sig" om man redan har jobbat med PIC16 ett tag, allt är bara mycket enklare och kraftfullare... :-)
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Sant, men har inte ens köpt någon att börjat testa med - känns som om de är bra uP, men tjuvkikar på AVR... Nej, tror inte heller att det är några som helst problem att gå över till 18f, men tiden... Skall köpa mig ett gäng och bekanta mig med dem. Har lagt det senaste krutet på 10F2xx serien då jag har behövt småttingar och 10f finns i mindre kapslar än 12f..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> "Man borde nog lära sig 18f ist"

Här är en app-note från Microchip som beskriver skillnaderna PIC16 <-> PIC18 :

http://ww1.microchip.com/downloads/en/A ... 00716a.pdf

I och för sig är det fokuserat mot två specifica (lite äldre) PIC16 och PIC18 modeller, men t.ex listan med instruktions skillnader stämmer nog bra i alla fall. När det gäller t.ex oscillatorkonfiguration är det nog nästan större skillnader mellan den beskrivna PIC18 och de nyaste PIC18 modellerna...
Skriv svar