lediga "register" i PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

lediga "register" i PIC

Inlägg av squiz3r »

Hej, jag håller på att göra ett program till min PIC, där jag skullle vilja ha en loop som loopar ett vist antal gånger. då måste jag ju ha en variabel som ligger på en ledig plats i registret. när jag kollar i databladet ligger där ett antal ställen i bank 0 som är grå utan text bla. 07h, 08h, 09h, 0Dh, 13h, 14h jag antar att alla demme är som man kan lägga variabler i?

men mitt problem är att jag använder ett färdigt program, som jag moddifierar lite... där står följande kod till pausen:

Kod: Markera allt

delay	movlw	D'5'
	movwf	cntr3
delay1	movlw	0x82
	movwf	cntr2
delay2	movlw	0xff
	movwf	cntr1
delay3	decfsz	cntr1, f 
	goto	delay3
	decfsz	cntr2, f
        goto	delay2
	decfsz	cntr3, f
        goto	delay1
	return
        END
det borde ju ta upp 4st register plattser, men vilka? det står 0x82 & 0xff, är det såna platser? varför står det då 0x?

Tack på förhand!, hoppas att jag var tydlig nog!

Edit: det står också:

Kod: Markera allt

	; free 16F628 RAM starts at 0x20(depends on type microcontroller)
	CBLOCK 0x20
		cntr1
		cntr2
		cntr3
    ENDC
0x20 står det att free ram börjar på, det är väll inte ett hex tal?


//Daniel A
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Dom här 07h, 08h, 09h, 0Dh, 13h, 14h ska du inte använda, antagligen reserverade eftersom de används i andra processorer.

Fr.o.m. 0x20 (som är hex, alltså samma som 20h) har du rätt mycket minne att använda. Det framgår nog av minneskartan i databladet. Använd det utrymmet för variabler.

Instruktionen "movlw 0x82" betyder att talet 0x82 (=82h) flyttas in i W-registret. (Move literal to W)
Värdet i W flyttas sedan till aktuell plats i minnet med "movwf <variabelnamn>". (Move W to F)
Läs instruktionsbeskrivningarna i databladet för mer info.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Ok, tack så mycket! då förstr jag sålångt men den här biten:

Kod: Markera allt

CBLOCK 0x20 
      cntr1 
      cntr2 
      cntr3 
    ENDC 
den förstår jag inte, borde den inte va ty något i stil med:

Kod: Markera allt


cntr1 equ 20h
cntr2 equ 21h
cntr3 equ 22h

eller har jag fattat något fel?

om jag vill ha en variabel som heter "count" då ska jag väll skriva "count equ 23h"?
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

För *helt* slippa tänka på adresser, så kan man även göra så här :

Kod: Markera allt

VARS            UDATA
cntr1           RES     1
cntr2           RES     1
cntr3           RES     1
Detta allokerar cntr1-3 i första bästa *lediga* minne.
Använd sedan BANKSEL i koden så att bank-bitarna sätts korrekt.
Notera att det dock inte spelar någon roll i *vilken* bank variablerna hamnar,
BANKSEL kommer automatiskt att ta hand om det och det är alltså helt
ointressant (eller i alla fall oviktigt) vilka adresser de olika variablerna
hamnar på. Om du ända vill veta (kan finnas många orsaker till det)
så finns det redovisat i MAP filen.

Eller :

Kod: Markera allt

VARS            UDATA_SHR
cntr1           RES     1
cntr2           RES     1
cntr3           RES     1
Detta allokerar cntr1-3 i "non-banked memory", D.v.s på 16F628A i h'70' - h'7F'.
Fördelen med detta är att de alltid fungerar oavsett hur bank-bitarna är satta.

Notera också att användnigen av UDATA/UDATA_SHR alltså betyder att
man skriver kod i "relocatable mode" och det förutsätter att man har
lagt till ett "linker script" (LNK fil) till projektet.

Ovanstående kod anpassar sig automatiskt när man byter processor modell.
Alltså mycket mer "porterbar" kod.

EQU är det absolut sämsta sättet att ange adresser till variabler !!

Notera att det enbart sätter ett värde på en symbol, det (vilket många tror)
allokerar INTE minnesadresser ! MPASM har inte en aning om att
ctrl1-3 representerar adresser till RAM minnet !

CBLOCK är i princip lika dåligt, det sätter också bara ett värde på en symbol,
det allokerar inte minne !

Problemer med båda dessa är att du inte kommer att få någon varning/fel
om du t.ex skriver :

Kod: Markera allt

cntr1 equ 20h
cntr2 equ 21h
cntr3 equ 20h
(notera två variabler på samma värde !) eller

Kod: Markera allt

CBLOCK 0x20
      cntr1
      cntr2
      cntr3
    ENDC

CBLOCK 0x23
      var1
      var2
      var3
    ENDC
och sedan kommer man på att man även behöver en ctrl4 och det blir

Kod: Markera allt

CBLOCK 0x20
      cntr1
      cntr2
      cntr3
      cntr4
    ENDC

CBLOCK 0x23
      var1
      var2
      var3
Notera att ctrl4 och var1 nu har sammavärde !
(Jag vill inte säga "samma adress" eftersom MPASM inte vet att det är just adresser...)
Fel som det här kan vara ett litet helvete att hitta.

Med relocatable code och UDATAxxx så är detta helt omöjligt. MPASM/MPLINK
allokerar aldrig samma minnes adress till olika symboler (om man inte använder
UDATA_OVR, vilket är specifikt till för just det).

Använd gärna EQU och CBLOCK för att ge alla andra symboler värden,
men inte för de symboler som ska representera minnesadresser.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

ok, så om jag ska fylla på med fler variabler på din kod gör man bara:

Kod: Markera allt

VARS            UDATA 
cntr1           RES     1 
cntr2           RES     1 
cntr3           RES     1 
count1        RES     1
OSV, så det är alltid "RES 1"?

nu ser koden ut såhär för att sätta på o stänga av en LED, hur blir det med "BANKSEL" :?

Kod: Markera allt

                bsf	PORTA,1	                ; PORTA,1 On
	call	delay		; Wait 0,5 seconds
	bcf	PORTA,1		; PORTA,1 Off
Tack"!!

//Daniel A
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

vad ska man ändra för att köra relocateble code? är det bara att lägga till ett .LNK (det ligger väll i mappen med MPLAB)? ska man ställa in någon instälning sen för att köra relocateble code?

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

Inlägg av sodjan »

> är det bara att lägga till ett .LNK

Japp ! 16F628A.LNK i ditt fall.

I och med att det finns ett "linker script" i projektet så ställer MPLAB
om sig till relocatable mode och kommer att köra MPASM/MPLINK
(istället för enbart MPASM). Det är MPLINK som gör grovjobbet
när man kör relocatable code/mode.

Sedan måste själva koden och vara i relocatable mode, men det är bara
ett par mindre saker att justera. Posta gärna lite större kodstycken så
får vi se.

"RES 1" betyder "reserv one byte". "RES 2" går lika bra om man vill
allokera/reservera 2 bytes.

Eller "RES 10" om man t.ex vill allokera en liten buffert på 10 bytes.
Notera att man dock bara har en symbol till första adressen, de andra
får man räkna fram (antingen i ASM eller i själva koden via indexerad adressering).

BANKSEL använder du före varje variabel som var allokerad via RES.

I de tre rader kod som du visade finns dessa variabler inte med, så
där behöva inte BANKSEL. Däremot i själva delay rutinen.

Dock, jag skulle använda UDATA_SHR för sntr1-3 för att slippa BANKSEL
i delay rutinen. Variablerna kommer ju då att allokeras i "non-banked
memory" (kallas ibland även "shared memory") som spänner över
alla bankerna (se minnesmappen i databladet). D.v.s h'70' - h'7F'.

En annan sak är att jag skulle lägga RES av cntr1-3 tillsammans med
koden för delayrutinen. Det blir då lite enklare att kommentera bort
*både* variabler och kod, om man inte vill ha delay rutinen med.

Slutligen, jag förutsätter att du också har kollat beskrivningen av (t.ex) RES
i MPASM/MPLINK manualen innan du frågar. Lite dumt att sitta och
svara på något som du skulle ha kunnat kollat själv, eller hur ? :-)
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Ja bara till att lägga till *.lkr till ditt projekt (linker script har ändelsen lkr).
Om du har installerat i det föreslagna (MPLAB) biblioteket och har svensk XP så bör lkr ha hamnat i denna sökväg " C:\Program\Microchip\MPASM Suite\LKR"

Några andra inställningar skall inte vara nödvändiga.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> (linker script har ändelsen lkr)

Korrekt !
Sorry för den missen...

> Några andra inställningar skall inte vara nödvändiga.

Förrutom eventuellt i *koden* då... :-)
Men skriver man helt nytt i relocatable mode från början så OK... :-)
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Hejm nu har jag gjort lite ändringar Bla ändrat variablerna cntr1-3 till delay_var1-3. dem har jag ändrat i delay loopen, och där uppe där man skriver vilket register dem ska ligga i. men den klagar ändå på dem!!! har jag glömt att ändra dem någonstans?

edit: jag hittade var jag hadee glömt att ändra, så det funkar nu, men nu kommer följande fel upp:

Kod: Markera allt

MPLINK 4.05, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - section '.org_0' can not fit the absolute section. Section '.org_0' start=0x00000000, length=0x00000058
Errors    : 1




här är hela min kod:

Kod: Markera allt

; Assign your microcontroller
        LIST P=16F628A

	; This include file makes programming more understandeble
        include <P16F628A.INC>
        
        
    __CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF

	; save on free ram in shared memory
VARS            UDATA_SHR 
delay_var1      RES     1 
delay_var2      RES     1 
delay_var3      RES     1 

;startadres of the controller
	org 0x0000

; For using A0-A3 as digital I/O 
    	movlw	D'7' 		    ; 
        movwf	CMCON		; Comparators off, all pins digital I/O 

; Reset Port values
        clrf	PORTA	
        clrf	PORTB
        
; define your pin direction (input/output)
; Hier heb ik van PORTA outputs gemaakt ipv inputs in het voorbeeld
    bsf	STATUS, RP0	          ; Switch to bank 1
		movlw	b'01000000'	  ;
		movwf	TRISA		  ; PORTA = 1,2,3,4,5 & 7 out, 6 in

        movlw	b'00000000'	  ; 
        movwf	TRISB	      ; PORTB = all outputs
	bcf	STATUS, RP0	          ; Switch to bank 0


; main loop
main	
   
    BTFSS             PORTA,6
    Goto main


	bcf	    PORTA,4		; PORTA,4 Off
	bsf   	PORTA,0		; PORTA,0 On
    bsf 	PORTA,7		; summer On
	call	delay		; Wait 0,5 seconds
    bcf 	PORTA,7		; summer Off
	bcf 	PORTA,0		; PORTA,0 Off
	bsf 	PORTA,1		; PORTA,1 On
	call	delay		; Wait 0,5 seconds
	bcf	    PORTA,1		; PORTA,1 Off
    call    delay          ;Wait 0,5 seconds
	bsf	    PORTA,2		; PORTA,2 On
	call	delay		; Wait 0,5 seconds
	bcf	    PORTA,2		; PORTA,2 Off
	bsf	    PORTA,3		; PORTA,3 On
	call	delay		; Wait 0,5 seconds
	bcf	    PORTA,3		; PORTA,3 Off
	bsf  	PORTA,4		; PORTA,4 On
	call	delay		; Wait 0,5 seconds
	goto	main		; Repeat until end of days

; Delay routine 
; This code uses about 5 x 99975 instructions. At 4Mhz this is approx 500 milliseconds.

delay	movlw	D'5'
	    movwf	delay_var3
delay1	movlw	0x82
	    movwf	delay_var2
delay2	movlw	0xff
	    movwf	cntr1
delay3	decfsz	cntr1, f 
	    goto	delay_var3
	    decfsz	cntr2, f
        goto	delay_var2
     	decfsz	cntr3, f
        goto	delay_var1
    	return
       

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

Inlägg av BoF »

Kod: Markera allt

;startadres of the controller 
   org 0x0000 
   
   code ; saknas här.  

; For using A0-A3 as digital I/O 
       movlw   D'7'           ; 
        movwf   CMCON      ; Comparators off, all pins digital I/O 
Lägg in CODE som ovanför.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Tack så mycket!! nu funkar det. vad gör CODE?
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Nu vägrar PIC en göra något... :( det går bra att bränna ner HEX filen till den men den blinkar inte med några LED o lysnar inte på knappen?
bearing
Inlägg: 11675
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

CODE betyder att här börjar kod-segmentet i ASM-filen.

I delayrutinen har du inte ändrat från cntr1 till delay_var för skip-instruktionerna.

Innan du bränner hex-filen är det en bra ide' att simulera koden i MPLAB för att enkelt hitta buggar.
Kolla först att du har rätt device under Configure->Select Device. Tryck sedan Debugger->Select Tool->MPLAB SIM.
Använd den lilla kontrollpanelen som kommer fram för att styra simulatorn. Du kan stega dig genom koden, eller köra den fram till en brytpunkt. Skapa en brytpunkt genom att dubbelklicka på den rad i kodfönstret.

Du kan börja med att stega dig igenom. Tryck på "Step-into"-knappen. Du ser då en pil i kodfönstret som visar vilken rad som ska exekveras nästa gång du trycker på knappen.

Dubbelklicka på sista raden " goto main ; Repeat until end of days " och tryck på "Run"-knappen. Om koden inte verkar komma fram till brytpunkten efter några sekunder får du pause och kolla om den har fastnat i någon loop. Fixa då den buggen.

Sen kan du göra en massa annat också. Använd t.ex. View->Watch och lägg in dina variabler för att se deras värden. Det står hur du använder alla funktioner i hjälpen för MPLAB.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

variablerna är redan fixade, men när jag trycker på start simulate (eller vad den nu heter) spå kommer det ett medelande "The project is out of date, do you want to build it?" (ungefär så) trycker jag på "Nej" händer inget mer så ska jag trycka på "Ja"? när jag trycker på att den ska simulera så kommer ingen pil vid kanten som det ska göra...
Skriv svar