Ahh! Får det inte att funka. Assembler + PIC1684A

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
jonte_s
Inlägg: 88
Blev medlem: 11 februari 2006, 17:13:48
Ort: Stockholm

Ahh! Får det inte att funka. Assembler + PIC1684A

Inlägg av jonte_s »

Tjena.
Om någon ser vad som är fel i koden är det bara att hojta till.

Får det som sagt inte att funka. Skall med koden bara tända en LED som sitter på RA0, så det är inga konstigheter egentligen.

Jag har testat koden och kopplingen som finns på denna sida (PIC1684A): http://www.voti.nl/blink/index.html och det funkar utmärkt.
Jag har kvar samma koppling som dem har på sidan, alltså jag har inte rört kopplingen, som fungerar med koden på sidan.

Kod: Markera allt

;############################################################################
;############################################################################
;####################### Description Of Project #############################
;
;	Name Of Project:	Turn LED on.		
;	Description: 		LED is connected to RA0.
;				 
;				 
;
;
;
;
;						Date:   
;						Author:
;
;############################################################################
;############################################################################
;############################ Directives ####################################

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

		__CONFIG	_CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC

;############################################################################
;############################################################################
;######################## Constant Declarations #############################
			udata

LEDmaskOn	equ			b'00000000'	; LEDmaskOn=b'00000000'.
LEDmaskOff	equ			b'00000001'	; LEDmaskOff=b'00000001'.

;############################################################################
;############################################################################
;######################## Variable Declarations #############################

;############################################################################
;############################################################################
;######################### On Reset (StartUp) ###############################
startup		code

			goto		MAIN			; go to beginning of program.

;############################################################################
;############################################################################
;############################# On Interupt ##################################


;############################################################################
;############################################################################
;############################### Subroutines ################################

;++++++++++++++++++++++++++++++++ LEDon ++++++++++++++++++++++++++++++++++++++
; This routine turns LED on, then returns.	
		
LEDOn
;----------------to turn LED on we set RA0 to 0, i.e. OV.--------------------	
			movlw		LEDmaskOn	; moves literal LEDmaskOn=b'00000000' to w.
			movwf		PORTA		; moves content of w to file-register PORTA,
									; i.e. turns LED on.
;-----------------------------------------------------------------------------
			return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;############################################################################
;############################################################################
;################################# MAIN #####################################
			code
MAIN
;---------------------------------------------------------------------------	
; Sets all PORTA to outputs (here we are only concerned with bit0 of PORTA, 
; i.e. RA0) and init RA0 to 1, i.e. RA0 is 5V --> LED is off.
		
			banksel		TRISA		; Swith to bank1.
			movlw		b'00000000'	; move literal b'00000000' to w.
			movwf		TRISA		; move contents of w to file-register TRISA.
									; (set RA0 to output)
			
			banksel		PORTA		; Switch back to bank0.
			movlw		b'00000001'	; move literal b'00000001' to w.		
			movwf		PORTA		; move contents of w to file-register PORTA.
									; (Set bit RA0 to 1 --> LED off)
;--------------------------------------------------------------------------
		
			call		LEDOn			

loop		goto		loop	

			end

;############################################################################
;############################################################################
;############################################################################



/ Jonas
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Kod: Markera allt

         startup      code 

         goto      MAIN         ; go to beginning of program. 

Borde vara

Kod: Markera allt

         startup      code 0x00

         goto      MAIN         ; go to beginning of program.


Var väl det första som jag kom att tänka på.

[Edit]

Eller

Kod: Markera allt

         startup      code
         pagesel     MAIN
         goto          MAIN         ; go to beginning of program.

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

Inlägg av sodjan »

Det var *väldigt* mycket "#" i koden. Lite grötigt och svårläst...

> Skall med koden bara tända en LED

Och vad händer då ?

> _WDT_ON

Varför ?

> _RC_OSC

Hur är *det* kopplat ?
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

# gjorde att jag bara läste några rader, lite snyggare kommentarer så man inte kommer vilse :oops:
jonte_s
Inlägg: 88
Blev medlem: 11 februari 2006, 17:13:48
Ort: Stockholm

Inlägg av jonte_s »

Löste problemet mha svaren från er. Tack!
code:
--------------------------------------------------------------------------------

startup code 0x00

goto MAIN ; go to beginning of program.



--------------------------------------------------------------------------------
Detta funka, men det jag skrivit:

Kod: Markera allt

startup      code 

         goto      MAIN         ; go to beginning of program. 
tog jag från "Elmer 160". Mitten på sida 6 i denna: http://www.amqrp.org/elmer160/lessons/E160L16.pdf. Varför funkade det inte i min kod?

> Skall med koden bara tända en LED

Och vad händer då ?
Ja, alltså... inget mer skall hända än att LED:en tänds.

> _WDT_ON

Varför ?

> _RC_OSC

Hur är *det* kopplat ?
He he. Tänkte inte alls på vad dessa gjorde. Tog de direkt från den template som fanns i Mplab för 84A.

Någor bra ställe där man kan läsa om _CONFIG direktiv?

Angående alla # så såg det kanske lite grötigt ut. Mitt första program, så jag ville dela upp programmet i "huvudstycken".

/Jonas
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Databladet är ett bra ställe att läsa om __CONFIG faktisk!

Att dela upp i tydliga funktioner är bra och enklare att söka i men du går ju till överdrift så det heter duga.

Om det är en komplicerat funktion är det bra att kommentera ordentligt men när det räcker till att slå på en LED är det (i mina ögon) ganska fel att kommentarer + linjer o skit fyller mycket mer än själva koden.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Databladet är ett bra ställe att läsa om __CONFIG faktisk!

Gärna kompletterat med sista delen av P16F84A.INC.
Där ser man namn på de symboler som kan användas i __CONFIG
direktivet. Databladet ger dock mer förklaringar till CONFIG
inställningarna...

Sen så håller jag med om att enbart "startup code" *borde* fungera.
Linker Scriptet för 16F84A innehåller bl.a detta :

Kod: Markera allt

...
...
CODEPAGE   NAME=vectors  START=0x0      END=0x4      PROTECTED
...
...
SECTION    NAME=STARTUP  ROM=vectors    // Reset and interrupt vectors
...
Så din kod borde kopplas till den "section" som heter STARTUP
vilken pekar på en "codepage" som ligger på rätt ställe.

Har du kopplat rätt Linker Script till projektet ? D.v.s 16F84A.LKR ?
jonte_s
Inlägg: 88
Blev medlem: 11 februari 2006, 17:13:48
Ort: Stockholm

Inlägg av jonte_s »

Kollade in databladet och där stod det ju lite :-)

Nytt problem:
Ok. Har nu skrivit en subrutin som skall fördröja 1ms. Jag använder TMR0 som Timer, men får ett konstigt fel!?

Denna del av subrutinen:

Kod: Markera allt

movlw     d'6'          ; Timer will count 256-6=250 count and each count... 
movwf     TMR0         ; ...will take 0.4microsekunds ==>> 250*0.4=1ms.      
borde väl skriva värdet 6 till TMR0-registret, men när jag kör simulatorn så skriver den till OPTION_REG istället, så att prescalern blir fel. Fattar inte.

Hela subrutinen:

Kod: Markera allt

;---------------------------------- Delay1ms ------------------------------------------
; For a 10MHz clock! Using TMR0.
; This routine delays 1ms (=0.001s) and is BLOCKING!	

Delay1ms
		; Initialize the Timer.
		banksel	INTCON
		bcf	    INTCON, T0IE	; Turns off interupt on overflow.
		
		banksel	OPTION_REG
		bcf	    OPTION_REG, T0CS ; Enebles Timer-mode.
		bsf	    OPTION_REG, PSA	 ; Sets prescaler to Timer,
		bcf	    OPTION_REG, PS2
		bcf	    OPTION_REG, PS1
		bcf	    OPTION_REG, PS0

		movlw	  d'6' 			; Timer will count 256-6=250 count and each count...
		movwf	  TMR0			; ...will take 0.4microsekunds ==>> 250*0.4=1ms.		
		
		; check if Timer if overflowed, i.e. if TOIF is set.
TOIFnotSet
		btfss	  INTCON, T0IF	; "skip if bit is set", i.e. if T0IF=1 goto TOIFisSet...
		goto	   TOIFnotSet		; ... otherwise hang around until it is. 
		goto	   TOIFisSet						 

TOIFisSet
		bcf	    INTCON, T0IF	; reset overflow flag.
		movlw	  d'6' 			; reset Timer.
		movwf	  TMR0
		return				
	

;-----------------------------------------------------------------------------------
OBS! Jag vet att prescalervärdet är fel för att det ska ta 1ms... Själva problemet är som sagt att jag vill skriva till TMR0, men det går inte.

/Jonas
Senast redigerad av jonte_s 17 mars 2007, 19:14:45, redigerad totalt 1 gång.
jonte_s
Inlägg: 88
Blev medlem: 11 februari 2006, 17:13:48
Ort: Stockholm

Inlägg av jonte_s »

> Databladet är ett bra ställe att läsa om __CONFIG faktisk!

Gärna kompletterat med sista delen av P16F84A.INC.
skall kolla upp P16F84A.INC filen.

Angående "startup code", så har jag kopplat till rätt Linker vad jag kan se iaf, men jag kör på det BoF nämde. Det funkar bra.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> så har jag kopplat till rätt Linker vad jag kan se iaf,

Alltså att 16F84A.LNK finns med under "Linker Script" i projekt fönstret ?
Hur som helst, det är absolut inget problem att manuellt lägga startup
segmentet på h'0000'...

> TMR0 / OPTION_REG

Ett skit fel...
Kolla "register file map" i databladet så ser du vad du har gjort för "tavla"... :-)
Det är ju dessutom väldigt tydligt om man tittar på hela din subrutin...
jonte_s
Inlägg: 88
Blev medlem: 11 februari 2006, 17:13:48
Ort: Stockholm

Inlägg av jonte_s »

> så har jag kopplat till rätt Linker vad jag kan se iaf,

Alltså att 16F84A.LNK finns med under "Linker Script" i projekt fönstret ?
Hur som helst, det är absolut inget problem att manuellt lägga startup
segmentet på h'0000'...
Jag har en fil som heter 16F84A.LKR hos mig, inte LNK, kanske det du menade?
> TMR0 / OPTION_REG

Ett skit fel...
Kolla "register file map" i databladet så ser du vad du har gjort för "tavla"...
Det är ju dessutom väldigt tydligt om man tittar på hela din subrutin...
Ha ha. Shit vilket irriterande fel, måste ju göra en "banksel TMR0" innan.
Tack!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

(Går med tunga steg fram till svarta tavlan...)

Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.
Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR. Det heter LKR.

Så, nu kanske det sitter... :-)

> banksel TMR0

Exakt så.
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Kikade lite på varför, om man tar din original kod så hamnar reset koden på adress 0x00000f

” startup code 0x00000f program 0x000008”


Ändrar man till ”STARTUP” så hamnar den rätt
”STARTUP code 0x000000 program 0x000008”


Du har inte ”disable case sensitivity” så startup label hamna på första bästa lediga minnes area.

Därför funkade ”startup code 0x00”
Då hamnar labeln i rätt minnes position
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Hm, tänkte på "case", men hade för mig att det redan var fixat.
Men det var nog i en annan tråd... :-)
Skriv svar