Nybörjarfrågor PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Fritzell
Inlägg: 4531
Blev medlem: 29 januari 2004, 22:43:35

Nybörjarfrågor PIC

Inlägg av Fritzell »

Har börjat med skriva lite i Assembler (skriver i MPLAB) men lyckas inte ens med att byta från bank0 till bank1 i koden till en PIC16F627.

Hur skriver man koden för en PIC med fyra banker? BSF 03h,5 kan väl inte räcka eftersom det finns mer än två alternativ? Och varför skulle man sätta just 'RP0' hög för en PIC med bara två banker?

Har läst databladet om och om igen och fattar ändå inte hur jag skall göra.

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

Inlägg av sodjan »

Du byter inte till en specifik bank alls.
Du byter till den bank där det register som du vill komma åt finns.
Leta upp BANKSEL i daokumentation (PDF eller online i MPLAB).
Du kan även kolla hur BANKSEL används här : http://www.jescab.se/HD44780.html

> BSF 03h,5 kan väl inte räcka eftersom det finns mer än två alternativ?

Självklart inte, *en* bit kan bara ha två olika värden.
Det är därför det finns två bank-bitar (RP0 och RP1).

Och att ange register och bitar med "03" resp "5" på det där sättet är
en *väldigt* dålig vana. Glöm omedelbart att du någonsin skrev det... :-)

> Och varför skulle man sätta just 'RP0' hög för en PIC med bara två banker?

Därför att databladet säger det, kanske ?
Förstår inte frågan. Vad vill du göra istället ?

> Har läst databladet om och om igen och fattar ändå inte hur jag skall göra.

Det räcker med att läsa just det som handlar om bank-bitarna.
Och om BANKSEL i dokumentationen, som sagt.

Och exakt vad är det som är oklart ?
Det är helt omöjligt att svara på något svepande om att "fattar inte".
Citera det stycke i databladet som är oklart så kan det redas ut.
Användarvisningsbild
Fritzell
Inlägg: 4531
Blev medlem: 29 januari 2004, 22:43:35

Inlägg av Fritzell »

Jo precis. Ursäkta för dåligt ställda frågor. Har alltså inte kommit speciellt långt utan ska börja med att gå in i Bank1 och ange alla portar som utgångar, till att börja med.

Detta borde utifrån min lilla kunskap gå till på nått likande vis

bsf 03h,"bank1"

movlw 00h
movwf 85h (TrisA)
movlw 00h
movwf 86h (TrisB)

bcf 03h,"till bank 0"


och att ange register och bitar med "03" resp "5" på det där sättet är
en *väldigt* dålig vana. Glöm omedelbart att du någonsin skrev det...


Vet tyvärr inte hur man kan göra detta på några smidigare sätt :)... Förutom att binda ett namn till registret med kommandot equ.

Vet inte om jag är totalt kass på att hitta i datablad men hittar inget om BANKSEL i databladet för 628:an.

Vad jag inte riktigt hänger med på är hur man skall veta vilken av RP0 och RP1 som går till vilken bank, ex att man sätter RP0 till 1 kommer man till bank 1.

Förstår heller inte hur man skall skriva detta.
bsf 03h,RP0,1 - om man skulle ställa RP0 till 1?

Eller,
movlw 03h (binärt 11)
movwf 03h,RP1
om 11 på RP1 nu skulle betyda att man hamnade i Bank3.

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

Inlägg av sodjan »

Det ser faktiskt ut som om du inte alls har kollat koden
på den länk som jag postade !!?? Det gör det ju lite meningslöst
att tjata om om samma saker som jag redan har skrivit i förra inlägget,
men vi gör ett nytt försök i alla fall... :-)

Kod: Markera allt

  banksel   trisa   ; Byt till rätt bank
  movlw     h'00'
  movwf     trisa
  movwf     trisb
  banksel   porta  ; Kan också göras senare, när det behövs...
Eller, eftersom de i alla fall ska sättas till "noll" :

Kod: Markera allt

  banksel   trisa   ; Byt till rätt bank
  clrf      trisa
  clrf      trisb
  banksel   porta  ; Kan också göras senare, när det behövs...
Varför gör du extra MOVLW mellan de två MOVWF ??

> Förutom att binda ett namn till registret med kommandot equ.

Gör absolut inte det ! :-)
Du ska göra #include på device-filen för din processor.
Visst ja, du kollade ju inte länken som jag postade...

> Vet inte om jag är totalt kass på att hitta i datablad men hittar inget om BANKSEL i databladet för 628:an.

Helt naturligt, det finns inget *där* om just *det*.
Du ska kolla dokumentationen för MPASM.
Antingen PDF manualen eller online i MPLAB.
Eller mitt exemplprogram, om du hade kollat det...

> Vad jag inte riktigt hänger med på är hur man skall veta vilken av RP0
> och RP1 som går till vilken bank, ex att man sätter RP0 till 1 kommer
> man till bank 1.

Databladet, "TABLE 4-2: ACCESS TO BANKS OF REGISTERS".

Ange sedan exakt vad som är oklart med den tabellen, så får vi
ta det därifrån. (Men, som sagt, banksel sköter detta åt dig i alla fall...)
jonzter
Inlägg: 11
Blev medlem: 20 december 2008, 22:33:56
Ort: Bromma

Inlägg av jonzter »

Här har jag en fråga, också relativt ny på PIC.
Är det nödvändigt att gå in och fixa med register man inte har nytta av?
t ex INTCON och CMCON, alltså om man inte är intresserad av komparator och interrupt, teoretiskt sett alltså.
Är trött på att modda exempelkod och vill skriva något från scratch.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Vadå "inte har nytta av"?

Register (SFR, Special Function Register) har funktioner som styr hårdvaran och om det finns saker man inte använder (t.ex. inte använder UART) kan man låta bli dessa register... om det inte är så att de kan påverka de grejer man faktisk använder.

Exempel: använder inte AD-omvandlaren, skit i den alltså? FEL, de analoga pinnar ska först ställas till DIGITALA funktioner, sedan kan man strunta i AD-delen.

Men använder man inte interrupt kan man strunta i de register som har med det att göra... det är dock en dålig idé faktisk.

Ponera att det finns ett program, ingen interrupt eller liknande... men någon jävla störning får programmet att flippa och den börjar exekvera någon RETLW eller liknande och spårar helt ut.

Under denna utspårning kan det vara att man ha slagit på watchdog'en, den fångar situationen vid att kicka in en reset... men VET man att alla "oanvända" SFR står rätt och medger normal funktion?

Om du letar lite i trådar här lär du/ni upptäcka att det finns en och annan tråd där felet visade sig vara just "oooopppssss... jag trodde ju att default var xxx och då gjorde jag inget åt det och nu visar det sig att..."

Så att inte ha helt koll på att alla SFR som kan ha en funktion i det man ska göra och/eller förlita sig på "default" ger problem, helt enkelt.

Men ska man t.ex. bara blinka en LED och kolla hastigheten kan man vara lite slarvig men är det något man faktisk vill ska fungera stabilt och pålitligt är det bara att kolla igenom att allt som kan ha betydelse ställs rätt.
jonzter
Inlägg: 11
Blev medlem: 20 december 2008, 22:33:56
Ort: Bromma

Inlägg av jonzter »

Man ser både det ena och det andra i guider på nätet, men sammanfattningsvis skulle man alltså kunna säga att man ska anropa alla register som listas i databladet och sätta ett värde på dessa för att undvika överraskningar även om man spontant tror att dom är ointressanta!? (Y/N)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Är det nödvändigt att gå in och fixa med register man inte har nytta av?

Nej, om de inte påverkar det man har nytta av.
Ja, om de (ja, tvärt om då...)

Detta är inte alltid speciellt självklart. Så det är aldrig ogjort arbete
att kolla igenom databladet så att man i alla fall vet varför man inte
behöver fixa med de register som man hoppar över.

Just det om Icecap pekar på (analoga funktioner) är nog det allra mest
vanliga missen som man gör i början när man inte har kollat igenom
databladet ordentligt.

I de allra flesta fall så är det angivet i kapitlet för den enhet som man
tänker använda (t.ex "I/O PORTS") vilka andra delar av processorn som
man måste tänka på (t.ex registren för enable/disable av analoga funktioner).

Så i ditt aktuella fall, så är det så att CMCON måste man *alltid* se
till att det är ställt rätt. I 99 fall 100 100 betyder det att stänga av
komparatorerna helt.

Och varför är då inte just det läget power-on-default ?
Därför att man inte vill att pinnar som *kan* vara anslutna till
analoga signalkällor ska "starta" i digital-mode !

> att man ska anropa alla register som listas i databladet och sätta ett värde på dessa för att undvika överraskningar!?

"Alla" kanske är att hårddra det lite. Det finns register som enbart styr
den interna funktionen i vissa register (som t.ex registret för baud-rate
för USART) och dessa spelar ingen roll hur de är konfigurerade om man
ändå inte använder USART.

Däremot, om man t.ex ska använda I/O portar (vilket är väldigt vanligt :-) )
så läser man kapitlet "I/O PORTS" och tar hänsyn till det som står där.
Där står t.ex att alla pinnar med analoga funktioner alltid startar i
analog-mode. Detta får man fixa i sin "init" rutin.
jonzter
Inlägg: 11
Blev medlem: 20 december 2008, 22:33:56
Ort: Bromma

Inlägg av jonzter »

Jag är jättenöjd med informativa och underhållande svar. btw Sodjan, din infosida om datablad är bra som 17.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> btw Sodjan, din infosida om datablad är bra som 17.

Visst är den ! :-)
En dag kanske jag också hinner få den klar.
Men å andra sidan så kanske det räcker som det är...
Användarvisningsbild
Fritzell
Inlägg: 4531
Blev medlem: 29 januari 2004, 22:43:35

Inlägg av Fritzell »

Naturligtvis läste jag ditt exempelprogram som du länkade till innan jag skrev min post. Men att bara läsa ett stycke kod utan några förklaringar hjälper mig inte speciellt mycket just nu.

Hittade lite info i hjälpen för MPASM och vad jag kan förstå innebär alltså kommandot banksel trisA tex att vid programmet vid kompilering automatiskt byter till den bank där trisA finns? Verkar mycket smidigt!

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...

Databladet, "TABLE 4-2: ACCESS TO BANKS OF REGISTERS".

Hittar inte TABLE 4-2 i databladet, men dock REGISTER 3-1, Status Register. Vad jag tycker framgår dåligt är vilken av Bankerna RP0 samt RP1 styr... Samt vad man skall skriva till dessa för att hamna i respektive bank...

Skulle gärna vilja veta hur koden är uppbyggd från "scratch" innan jag går över till att använda förenklingar.

Edit: 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? Verkar också mycket smidigt :)

Tack för alla svar såhär långt!
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Hittar inte TABLE 4-2 i databladet, men dock REGISTER 3-1, Status Register. Vad jag tycker framgår dåligt är vilken av Bankerna RP0 samt RP1 styr... Samt vad man skall skriva till dessa för att hamna i respektive bank...
Sida 15. Men mekaniken är samma i alla processorer:

Bank RP1 RP0
0 0 0
1 0 1
2 1 0
3 1 1

PIC16F627A/628A
Bank0 20-7Fh
Bank1 A0h-FF
Bank2 120h-14Fh
Bank3 1F0h-1FFh
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? Verkar också mycket smidigt
Precis
Användarvisningsbild
Fritzell
Inlägg: 4531
Blev medlem: 29 januari 2004, 22:43:35

Inlägg av Fritzell »

Aha, nu börjar jag förstå hur tabellen var uppbyggd :). För att hamna i Bank3 måste alltså både RP0 och RP1 vara satta till 1?

Har provat att skriva detta i MPLAB, ett enkelt test för att byta till Bank1 och tillbaka till Bank0.

Kod: Markera allt

	list p=16f627
	#include p16f627.inc ;Includefilen
	__config 0x3ff8

	bsf 03h, 5
	bcf 83h, 5
	

	end
Vid BUILD får jag dessa felkoder:
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

:humf:
Senast redigerad av Fritzell 21 december 2008, 10:50:03, redigerad totalt 1 gång.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

6 Executable code and data must be defined in an appropriate section
Om du bara skrev in detdär så saknar du en massa, du måste definiera SECTION etc. Jag rekommenderar att du laddar ned PICKIT2 lessons och studerar dem.
7 Register in operand not in bank 0. Ensure that bank bits are correct.
Japp, den varningen får du. Bara så att du skall vara medveten om vad du gör.
jonzter
Inlägg: 11
Blev medlem: 20 december 2008, 22:33:56
Ort: Bromma

Inlägg av jonzter »

Tabellen är en helt vanlig sanningstabell. Så det stämmer.

"Register in operand not in bank 0. Ensure that bank bits are correct."

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