Nybörjarfrågor PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Den raden brukar inte resultera i error för min del, utan hex-filen kommer snyggt och prydligt.
Månne du har:

Kod: Markera allt

errorlevel  -302              ; suppress message 302 from list file
Edit:
En allmän reflektion bara. Databladen och manualerna är inget vidare som nybörjarlitteratur. De utgår alla ifrån att man redan kan assembler. Bättre då starta med tex:

http://www.covingtoninnovations.com/nop ... em2004.pdf
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> innebär alltså kommandot banksel trisA tex att vid programmet vid
> kompilering automatiskt byter till den bank där trisA finns?

Nja, BANKSEL är inte ett "kommando", utan ett "direktiv". MPASM gör en
skillnad på det för att hålla isär de kommandon som motsvarar instruktioner
som en PIC processor förstår (MOVLW, GOTO, CALL, o.s.v). D.v.s de
instruktioner som även finns i varje datablad.

Direktiv, däremot, är mer något man ber själva MPASM att göra.

När man t.ex gör "BANKSEL TRISA", så säger man igentligen att "V.v. och
slå upp i vilken bank TRISA ligger och lägg in rätt BCF/BSF instruktioner
åt mig, jag orkar inte göra det själv". Och alltså tar MPASM snällt och
gör just det ! Resultetet (som själva processorn ser) blir alltså exakt
det samma som om du själv hade tagit databladet, kollat vilken bank
regstret ligger och skrivit rätt BCF/BSF kommandon, fast med mycket
mindre risk för att det blev fel !

> Anledningen till att jag gjorde en extra MOVLW var att jag var osäker på
> ifall värdet i W finns kvar eller försvinner efter en MOVWF...

Var skulle det ta vägen och vilket värde skulle finnas där i så fall ??

> Så vid en include för den specifika processorn får man automatiskt ett
> namn (tex TRISA) bundet till den specifika adressen i registret från start?

INC filen gör exakt samma sak som du kan göra själv med EQU !
Man varför göra det själv !!??
Men vid det här laget har du väll redan tittat i INC filen, eller hur ? :-)

> bsf 03h, 5
> bcf 83h, 5

Hoppas detta är sista gången du skriver register och bitar numeriskt ! :-)
Jag tror att jag har nämnt det ett flertal gånger redan. Övanstående två
redan *SKA* skrivas så här :

> bsf status, rp0
> bcf status, rp0

Man, som sagt (igen), BANKSEL är bättre för att hantera bankerna...

> 6 Executable code and data must be defined in an appropriate section
> 7 Register in operand not in bank 0. Ensure that bank bits are correct.
> 7 Executable code and data must be defined in an appropriate section

Det där är inga felkoder, det är feltexterna. Koderna ligger lite före på
samma rader (men som du klippte bort). Har du kollat upp vad manualen
sa om rspektive felkod ?

Dessutom är inte alla *fel*, en av dom är en varning (som man kan strunta i).
Vilken det är framgår av den del av raderna som du klippte bort...

> Den raden brukar inte resultera i error för min del, utan hex-filen kommer snyggt och prydligt.

Självklart, eftersom det inte är något fel, det står "Warning" på raden !

> De utgår alla ifrån att man redan kan assembler.

OK, kanske att databladen för själva processoerna gör det, men det finns
ett "Chapter 1. MPASM Assembler Overview" i MPASM manualen, och det
förrutsätter inte att man redan kan assembler...
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

OK, kanske att databladen för själva processoerna gör det, men det finns
ett "Chapter 1. MPASM Assembler Overview" i MPASM manualen, och det
förrutsätter inte att man redan kan assembler...
Men som enda introduktion till Assembler är den ganska tunn. Då finns det bättre material, tex Covingtons PDF.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Då finns det bättre material, tex Covingtons PDF.

Hm, till upplägget så är den kanske det. Men den är omodern på flera sätt.

> tris PORTB ; copy w to port B control reg

Instruktionen TRIS används inte längre. MOVWF TRISA, heter det i dag.

Och att köra MPASM från DOS är nog inte många som gör idag.

Han skriver också "MPLAB is very useful but its operation is beyond
the scope of this article.", vilket låter lite märkligt idag, 2008. Jag tror
inte någon nybörjare idag *inte* börjar med MPLAB.

Det generella upplägget och syftet med dokumentet är bra, men tyvärr
missar det målet i dag. Inte så konstigt för ett ca 10 år gammalt dokument.
Samma dokument med något annat än 16F84A och med modern assembler
kod hade varit bra/bättre.

Det här är naturligstvis ett generellt problem med "nätet", det finns för
mycket material som har gått långt över sitt "bäst före datum" och som
borde "rensas bort ur hyllorna"... :-)
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Jo, det har du rätt i, den har ett bra upplägg, men kunde bra revideras för att hänga med. Men gratis, betyder att man får vad man betalar för. Tycker annars att den bok jag tipsade om i en tidigare tråd, är en av de bästa jag sett på länge.

Du kan ju alltid be dem revidera den ;)
http://www.covingtoninnovations.com/contactus.html

Edit:
Ett annat bra sätt är ju att studera någon annans kod, tex Pickit2 lessons:
http://ww1.microchip.com/downloads/en/D ... %20(b).zip
Användarvisningsbild
Fritzell
Inlägg: 4531
Blev medlem: 29 januari 2004, 22:43:35

Inlägg av Fritzell »

Mycket information i denna tråd har det blivit. Stort tack för att ni engagerar er så!

Covingtons pdf var precis vad jag behövde. PIC Assembly Language for the
Complete Beginner :D. Kanske något omodern men ändå mycket relevant för en nybörjare, tack för länken. Har kommit ca 2/3 delar. Har byggt en PIC-programmera idag och ska prova att koda lite igen med den nya kunskapen jag fått härifrån och från guiden så får vi se hur det går. Återkommer väl förmodligen ganska snart igen :)
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Kolla även in denna tråd:
http://elektronikforumet.com/forum/view ... hp?t=30674

Ett annat tips är PICList och att helt enkelt googla efter PIC. Som Sodjan påpekar så kan mycket vara dated och behöva justeras, men å andra sidan är algoritmer eviga. Detta verk tex skrevs ju inte heller i går:
jonzter
Inlägg: 11
Blev medlem: 20 december 2008, 22:33:56
Ort: Bromma

Inlägg av jonzter »

Jag måste ändå säga att databladen och Reference Manual(DS33023) och andra PDF-er från microchip är överlägsna.
Databladet är lite tradigt de två första gångerna men snart vet man vad man letar efter och hur man ska använda det man precis läst.
Än är det väldigt mkt som är luddigt, förstår orden gör man ju, men så är det bara resten. Men det kommer bit för bit :P
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Jag måste ändå säga att databladen och Reference Manual(DS33023) och andra PDF-er från microchip är överlägsna.
Absolut, Microchip är helt överlägsna då det gäller dokumentation. Men det behöver inte betyda att de är lämpliga för (alla) nybörjare. Jag har själv arbetat som lärare så jag vet att förutsättningarna är olika.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Inlägg av blueint »

Datablad är torra och sega, men oftast pang på rödbetan. Så om man vill gå till botten lönar dom sig. Man får stenkoll.
För exempel osv.. är det värre ;)
Användarvisningsbild
Fritzell
Inlägg: 4531
Blev medlem: 29 januari 2004, 22:43:35

Inlägg av Fritzell »

Nu har jag skrivit ett program som fungerade i verkligheten :D. Blinkande lysdiod:

Kod: Markera allt

	processor 16F627
	#include p16f627.inc
	__CONFIG _WDT_OFF & _PWRTE_ON & _BODEN_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_ON

	org 0x0000



	banksel TRISA

	clrf	TRISA
	clrf	TRISB
	clrf	VRCON
	
	banksel PORTA

	clrf	CMCON

	A1 equ 20h
	B1 equ 21h
	


HUVUDLOOP

	movlw	h'FF'		;Fyll på register
	movwf	A1			;Fyll på register
	movwf	B1			;Fyll på register

	movlw	h'08'
	movwf	PORTB		;Tänder lysdioden bit3 portB



;Delay


DEL1

	decfsz	A1,1
	goto DEL1
	movlw	h'FF'
	movwf	A1
	decfsz	B1,1
	goto DEL1

;Släck lysdioden


	movlw	h'00'
	movwf	PORTB		

	movlw	h'FF'		;Fyll på register
	movwf	A1			;Fyll på register
	movwf	B1			;Fyll på register

;Delay

DEL2

	decfsz	A1,1
	goto DEL2
	movlw	h'FF'
	movwf	A1
	decfsz	B1,1
	goto DEL2
	goto HUVUDLOOP



	END
Nu ska jag börja läsa på hur man läser av en ingång... :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Bara några småsaker som kan vara bra att tänka på innan du skriver
nästa kodsnutt... :-)

> processor 16F627

Och det är verkligen en gammal 627 ? Annars är "A" modellerna
mycket vanligare idag (alltså 627A, 628A och 648A). Vill bara kolla
att det inte bara är ett skrivfel.

> clrf CMCON

Notera att för att helt stänga av komparatorerna så är det inte värdet h'00'
som CMCON ska sättas till. Se exempelkoden i kapitlet "I/O PORTS" i
databladet. En kommentar på den där raden hade klargjort om det
är med avsikt eller inte...

"A1" och "B1" är inga jättebra namn, de säger inget om vad de är till för.
"counter1" och "counter2" eller liknande är bättre.

> decfsz A1,1

Använd gärna "W" eller "F" som "destination".
I alla fall jag kommer aldrig ihåg vad 0 och 1 står för...

Du behöver inte "ladda om" A1 varje varv ! Eftersom du i alla fall alltid
vill ha 'FF' i både A1 och B1 så kan du plocka bort alla movlw h'FF' och
movwf A1/B1. Även de allra första. Eventuellt kommer den allra första
blinkningen att få en annan tid, men sedan snurrar det på som det ska.
Användarvisningsbild
Fritzell
Inlägg: 4531
Blev medlem: 29 januari 2004, 22:43:35

Inlägg av Fritzell »

Ok... :)

Japp det är en gammal 627:a.


Notera att för att helt stänga av komparatorerna så är det inte värdet h'00'
som CMCON ska sättas till.


Hm okej. Har läst exempelkoden men förstår inte riktigt varför man inte skulle sätta CMCON till 0?

Använd gärna "W" eller "F" som "destination".
I alla fall jag kommer aldrig ihåg vad 0 och 1 står för...


Japp, naturligtvis skall F användas. Det betyder ju att värdet sparas i F, alltså det aktuella registret. Trodde först att man med denna instruktion bestämde hur mycket som skulle subtraheras.

Du behöver inte "ladda om" A1 varje varv ! Eftersom du i alla fall alltid
vill ha 'FF' i både A1 och B1 så kan du plocka bort alla movlw h'FF' och
movwf A1/B1. Även de allra första. Eventuellt kommer den allra första
blinkningen att få en annan tid, men sedan snurrar det på som det ska.


Så registrerna nollställs alltså automatiskt när de har nått 0?

Har en annan liten fundering...
Tänkte testa att läsa av en ingång med följande kod:

Kod: Markera allt

; Test av avläsning av ingång

	processor 16F627
	#include p16f627.inc
	
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON 


	org 0x0000

;Konfigurera portar

	bsf		STATUS,RP0
	movlw	h'FF'
	movwf	TRISA ;Alla ingångar
	clrf	TRISB
	movwf	h'00'
	movwf	VRCON
	bcf		STATUS,RP0
	movwf	CMCON

;Läs av bit0, PORTA. Tänd utgång


test
	BTFSS	PORTA,1 ;Läs av bit1 PORTA
	goto	test

	movlw	h'08'
	movwf	PORTB

loop
	goto loop

	end
När man aktiverar bit1 skall bit3 på PORTB gå hög. I kopplingen ligger ett pulldown på RB1. Men inget händer när man lägger på spänning där (4.5V). Jag förstår inte varför :humm:
BMI
Gått bort
Inlägg: 496
Blev medlem: 31 juli 2006, 22:29:08
Ort: Halmstad

Inlägg av BMI »

CMCON brukar vanligtvis sättas till "07" B 00000111" om man vill stänga av.

Har inte kollat 627 datablad men det är nog samma som 628A
Användarvisningsbild
Fritzell
Inlägg: 4531
Blev medlem: 29 januari 2004, 22:43:35

Inlägg av Fritzell »

Aha hm, hittade lite mer info i databladet nu. Det är precis som du säger. Och man var tydligen tvungen att lägga koden för att inaktivera komparatorerna innan inställningen av I/O för TRISA/B. Nu lyckas jag med att läsa av en ingång :)

Mycket enkelt program för att tända/släcka en utgång när man aktiverar en ingång (RA1).

Kod: Markera allt

; Test av avläsning av ingång

	processor 16F627
	#include p16f627.inc
	
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON 


	org 0x0000

;Konfigurera portar
	movlw	h'07'
	movwf	CMCON
	bsf		STATUS,RP0
	movlw	h'02'
	movwf	TRISA
	clrf	TRISB
	clrf	VRCON
	bcf		STATUS,RP0

	Q2	equ 20h
	Q1	equ	21h
	movlw	h'FF'
	movwf	Q2

;Läs av bit1, PORTA. Tänd utgång


read1
	BTFSS	PORTA,1
	goto	read1

	movlw	h'08' ;Tänder lysdiod
	movwf	PORTB


;Fördröjning tills nästa avläsning

delay2
	movlw	h'FF'
	movwf	Q1
delay1
	decfsz	Q1,f
	goto	delay1
	decfsz	Q2,f
	goto 	delay2

;Läs av bit1, PORTA

read2
	btfss	PORTA,1
	goto	read2

;Släck utgång

	clrf	PORTB

;Fördröjning

	movlw	h'FF'
	movwf	Q2
delay4
	movlw	h'FF'
	movwf	Q1
delay3
	decfsz	Q1,f
	goto	delay3
	decfsz	Q2,f
	goto 	delay4

	goto read1


	end
[/size]
Skriv svar