Assembler problem med 16F690

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
MrGrey
Inlägg: 4
Blev medlem: 11 mars 2011, 21:13:25

Assembler problem med 16F690

Inlägg av MrGrey »

Hej!

Först och främst, underbart forum med mycket bra info och länkar!!

Jag har svårt och förstår beteendet i mitt program. Använder mig av MPLAB och skriver för en 16f690 PIC (PicKit2 från Kjell o Co.).
Programmet ska öppna upp några C-portar, där dioderna är kopplade på demokortet, sen flytta dioderna. Bör tillägga att det är min 2'a vecka i assembler, bare with me...

Kod: Markera allt


;Header och settings från MPLAB
#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

     org 0
Test	equ	023h ;För att hålla mappningarna för C-porten när dioderna roteras
Cntr1	equ	024h ;Dessa tre räknare används av Delay funktionen
Cntr2	equ	025h
Cntr3	equ	026h

Start:
	
 	clrf	PORTC ;bara för säkerhetsskull
	movlw	b'00000000'
	tris	PORTC ;sätt c-portarna till outputs
	movlw	b'00001111'
	movwf	Test ;Spara utgångsvärdet i Test
	movwf	PORTC  ;sätt RC0-RC3 High <= Här hänger inte RC0 med (r-m-w problem?)  :?: 
	call	Delay ;vänta 0.5sek
	call	RotateSet ;rotera, resultatet blir att enbart RC1 lyser... märkligt  :?: 
	call	Delay
	...osv några rader för att rotera Test ett helt varv

	goto 	$ ;loopa kvar på denna rad, end verkar inte fungera då programmet startar om....?

RotateSet
	rlf		Test ;Rotera Test vänster, funkar bra, första gången blir detta b'00011110'
	movlw	Test ;Flytta värdet till w-registret, första flytten ger W=b'00100011'  :?: 
	movwf	PORTC ;Sätt värdet på C-portarna, första flytten ger (i MPLAB debugg) PORTC=b'00100000'  :?: 
	return

Delay
här har jag en delay rutin som kommer från http://www.piclist.com/techref/piclist/codegen/delay.htm

	return

end
Vad gör jag för fel?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Assembler problem med 16f690

Inlägg av sodjan »

> Vad gör jag för fel?

Du har inte läst (eller läst men inte förstått :-) ) den lila gråa rutan
på sidan där PORTC beskrivs i databladet.
Läs den, om du inte har gjort det. Om du har läst den men det är oklart
vad det betyder, återkom och fråga om det som är oklart. Nu så tror jag
inte att det påverkar ditt problem, men ta det för en vana att göra rätt...

Sen så ser jag inte var du sätter TRISC. Läs på på sidan för PORTC
och notera vad som gäller för TRISC efter reset.

Notera att RLF inkluderar C, så sätt den innan RLF så som du vill ha den.
MrGrey
Inlägg: 4
Blev medlem: 11 mars 2011, 21:13:25

Re: Assembler problem med 16f690

Inlägg av MrGrey »

Tack för snabbt svar sodjan!

Jag lade till detta i början på programmet, direkt efter Start och det löste del av mitt problem. Jag hade inte hängt med på vad ANSEL(H) gjorde för något.

Kod: Markera allt

	bsf		STATUS,RP1
	clrf	ANSEL
	clrf	ANSELH ;kanske inte behöver denna rad också, borde räcka med ANSEL för mitt syfte...?
	bcf		STATUS,RP1
Nu förstår jag lite bättre vad ANSEL är och hur portar kan vara både analoga och digitala :tumupp:

Vad gäller RLF, kan du utveckla det lite? Vad menar du med att den inkluderar C? Nu ser det bra ut fram till

Kod: Markera allt

	rlf		Test
	movlw	Test ;Detta sparas inte till W-registret som jag vill. Fast, jag ser att resultatet i W blir samma oavsett vad jag försöker flytta från Test till W, hmm....
MrGrey
Inlägg: 4
Blev medlem: 11 mars 2011, 21:13:25

Re: Assembler problem med 16f690

Inlägg av MrGrey »

got it!
Ändrade RotateSet funktionen till

Kod: Markera allt

RotateSet
	rlf		Test,0
	movwf	Test
	movwf	PORTC
	return
Jag förstår dock inte varför RLF också ändrade PORTC...?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Assembler problem med 16f690

Inlägg av sodjan »

> Vad gäller RLF, kan du utveckla det lite? Vad menar du med att den inkluderar C?

Databladet sidan 224, beskrivningen av RLF. Notera att C är med i "roterandet".
Om du inte vill att en okänd bit ska roteras in på lägsta biten, så får du göra en
"BCF/BSF STATUS, C" *innan* RLF instruktionen.

> Jag förstår dock inte varför RLF också ändrade PORTC...?

Hur menar du ? RLF *i sig* ändrar bara Test. PORTC ändras inte förren
du gör MOVWF PORTC. Sen så kanske jag skulle skriva det som :

Kod: Markera allt

RotateSet
   rlf      Test, f
   movf   Test, w
   movwf   PORTC
   return
Det blir lite mer naturlig ordning på det hela.

> movlw Test

Jag tror inte att det där gör vad du tror, eller hur !

Värdet på symbolen "Test" laddas till W, och det har du ju satt till 023h i en EQU i början.
Alltså laddar du alltid 023h till W... Det du sannolikt vill göra är "MOVF Test, W", vilket
laddar registret med adressen "Test" till W...

Från ditt första inlägg:

Kod: Markera allt

   movlw   Test ;Flytta värdet till w-registret, första flytten ger W=b'00100011'  :?: 
Om du instället hade skrivit (vilket ju är exakt samma sak) :

Kod: Markera allt

   movlw   Test ;Flytta värdet till w-registret, första flytten ger W=023h  :?: 
så hade det kanske varit lite tydligare vad som faktiskt händer om du jämför med :

Kod: Markera allt

Test   equ   023h ;För att hålla mappningarna för C-porten när dioderna roteras
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Assembler problem med 16f690

Inlägg av bos »

Kod: Markera allt

   movlw   b'00000000'
   tris   PORTC ;sätt c-portarna till outputs
Jag skulle inte använda "tris" här. Det kan mycket väl fungera, men jag har bara sett det i lastgammal kod och aldrig i nyare varianter, så jag är osäker på om det fungerar eller inte. Jag skulle iallafall ha skrivit ovanstående som såhär:

Kod: Markera allt

  banksel  TRISC        ; Se till att vi är i rätt bank
  clrw                  ; Nollställ W (samma som movlw b'00000000')
  movwf    PORTC        ; Sätt alla C-pinnar till output
Sen en annan sak. Du frågar vad du gör för fel, men du skriver inte vad det är du förväntar dig och vad som faktiskt händer. Av din kod att döma kan vi gissa oss till vad du vill göra, men vi kan inte gissa oss till vad som faktiskt händer. Fyll gärna i denna lucka så blir det lite klarare.
MrGrey
Inlägg: 4
Blev medlem: 11 mars 2011, 21:13:25

Re: Assembler problem med 16f690

Inlägg av MrGrey »

Tack för alla svaren och kommentarerna hittills! Jag har inte hunnit sitta med mitt lilla PicKit2 än och kommer vara på resande fot i 3 veckor. Återkommer med resultat om ~1 månad :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Assembler problem med 16f690

Inlägg av sodjan »

Ja, ingen panik för våran skull... :-)
Dock är det alltid uppskattat med lite feedback
för att se om tipsen hjälpte.
Skriv svar