PICKit2 lektion nr 1

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Plutonium
Inlägg: 60
Blev medlem: 24 februari 2005, 00:04:14
Ort: Essunga station
Kontakt:

Inlägg av Plutonium »

På detta vis

Kod: Markera allt

#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
     org 0
Start:
     bsf     STATUS,RP0       ; select Register Page 1
     bcf     TRISC,0          ; make IO Pin C0 an output
     bcf     TRISC,1          ; make IO Pin C0 an output
     bcf     STATUS,RP0       ; back to Register Page 0
     bsf     PORTC,0          ; turn on LED C0 (DS1)
     bsf     PORTC,1          ; turn on LED C0 (DS1)
     goto    $                ; wait here
     end
     
Resultatet blir att enbart LED nr 2 lyser och inte båda.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Resultatet blir att enbart LED nr 2 lyser och inte båda.

Självklart. det är exakt så som databladet beskriver det ! :-)


Prova detta :

Kod: Markera allt

#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
     org 0
Start:
     banksel ANSEL
     clrf    ANSEL
     banksel TRISC
     bcf     TRISC,0          ; make IO Pin RC0 an output
     bcf     TRISC,1          ; make IO Pin RC1 an output
     banksel PORTC
     bsf     PORTC,0          ; turn on LED C0 (DS1)
     bsf     PORTC,1          ; turn on LED C1 (DS2 ?)
     goto    $                ; wait here
     end
Notera användningen av banksel !

Detta :

> bsf STATUS,RP0 ; select Register Page 1

stämmer igentligen inte. Kommandot väljer bank 1 *eller* bank 3,
det beror på hur den andra bank-biten (RP1) är ställd. Så
använd alltid banksel, den gör alltid rätt.

Notera också att hanterigen av ANSEL är tydligt beskriven på
sidan om PORTC i databladet. Det finns även med i det kodexempel
som finns på samma sida.

Det som händer med din kod är att LED1 först tänds, sedan släcks
den när LED2 tänds. Varför ? Jo, en I/O pinne som är konfigurerade
som en analog pinne, läses alltid som "0". BSF/BCF instruktionerna
läser alltid först hela registret (t.ex PORTC), ändrar sedan den
aktuella *biten* och skriver sedan tillbaka hela registret.

Så summan är att det är viktigt att läsa sidan om PORTx i databladet.
Det är ofta en del saker som kanske inte är självklara men viktiga.
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

Nu har min mplab damp :/
jag får inte fram fil listan och jag kan inte docka mina fönster.

löste det.
Plutonium
Inlägg: 60
Blev medlem: 24 februari 2005, 00:04:14
Ort: Essunga station
Kontakt:

Inlägg av Plutonium »

Tack så mycket.

Nu har jag bildat en liten uppfattning av det du beskrev, och har lite lättare att relatera det till den teoretiska biten.

Kommer jag någon gång ha nytta av bsf STATUS,RP0 eller bara lägga banksel på minnet?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Tändes både lysdioderna ?

Du bör helt glömma att du såg att man kan manipulera RP0/RP1
via direkta BCF/BSF kommandon. Det finns ju ingen anledning när
BANKSEL gör hela jobbet för dig. BANKSEL gör i princip aldrig fel, den
slår upp vilken bank som registret (på samma rad som BANKSEL)
ligger i och genererar de korrekta BCF/BSF kommandona som behövs.

D.v.s att BANKSEL gör samma sak som du kan göra själv, men
automatiskt och alltid rätt... :-)

Så här i en början så är det bara att gödsla med BANKSEL när man
byter register. Visst, i många fall (då två register ligger i samma bank)
så blir kanske den ena BANKSEL onödig, men det spelar ingen större roll.
Och ibland så hade det kanske räckt att ändra den ena av RP0/RP1 bitarna.

Senare, när du har full koll på vad du gör, så går det att trimma bort
de BANKSEL som är onödiga.
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

jag har alltid kört funktioner för att välja bank.
inte ens sett att det fanns en funktion med redan :)

men nu har jag gjort lite kod men den harl ite damp för den växlar bara diod om jag växlar vdd on och off i mplab.

Kod: Markera allt

#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
     org 0


cblock 0x20
    variabel1   ;Used for internal calculations
  endc

Start:
    banksel ANSEL
    clrf    ANSEL
    banksel TRISC
    bcf     TRISC,0          ; make IO Pin RC0 an output
    bcf     TRISC,1          ; make IO Pin RC1 an output
	bsf	TRISA,3		;Gör ra3 till input
    
	banksel PORTC
	movlw	D'0'	;lägg 0 i W
	movwf	PORTC	;släck alla dioder
    ;bsf     PORTC,0          ; turn on LED C0 (DS1)
    ;bsf     PORTC,1          ; turn on LED C1 (DS2 ?)
	banksel PORTA
loopa:	
	btfsc PORTA,3	;här testar vi knappen (om 1 hoppa till loopb)
		goto loopb
			bcf PORTC,0
			bsf PORTC,1	;tänd diod 2 om knappen är tryckt.
loopb:
	btfss PORTA,3	;här testar vi knappen (om 0 hoppa till loopa)
		goto loopa
			bcf PORTC,1
			bsf PORTC,0
			
	goto	loopa                ; börja från loopa
    
	end
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

funka som det skulle när jag koppla på ström från min voltregulator och koppla ur PICkit 2
växlar diod när jag håller inne knappen.

I koden har du ett exempel på
movlw och movwf
så du förstår hur dom fungerar.

Nästa steg är då att spara i variabeln och pulla ra3 och växla diod efter 1 klick på knappen.
Senast redigerad av eAk 11 september 2008, 00:57:40, redigerad totalt 1 gång.
Plutonium
Inlägg: 60
Blev medlem: 24 februari 2005, 00:04:14
Ort: Essunga station
Kontakt:

Inlägg av Plutonium »

Ja dom tändes så fint.

Mycket bra information du postade.

Tusen tack.

Nu tänkte jag avancera mig lite och stänga av och sätta på mina två LED.
Har tagit reda på att min störmbrytare sitter på PORTA, 3.
eAk kan du bekräfta att brytaren sitter på PORTA, 3?
Hur skrivs funktionen för att nyttja PORTA, 3 för just mitt ändamål?
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

läs koden jag skrev åt dig precis :P
där växlar du diod med knappen.
när du håller inne knappen. men funkar bara på min när inte pickit2 ger strömmen förstår inte riktigt varför.
kan någon svara på det?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Notera att för lite mer avancerad användning an knappar så kan
man behöva ta hänsyn till kontaktstudsar, och det blir en hel del mer
komplext än de exempel som finns här.

> Hur skrivs funktionen för att nyttja PORTA, 3 för just mitt ändamål?

Beror på vad ditt ändamål är. Du får väl beskriva det...
Plutonium
Inlägg: 60
Blev medlem: 24 februari 2005, 00:04:14
Ort: Essunga station
Kontakt:

Inlägg av Plutonium »

eAk skrev:läs koden jag skrev åt dig precis :P
där växlar du diod med knappen.
när du håller inne knappen. men funkar bara på min när inte pickit2 ger strömmen förstår inte riktigt varför.
kan någon svara på det?
Testade precis koden, och den fungerar inte för mig dock.
I början blinkar LED nr 1 & 2 fram och tillbaka utan att trycka på "knappen", därefter lyser LED nr 2 konstant och reagerar inte allt på "knapp" tryckningen.
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

kopplar du 5volt regulerat till power kontakten på demo boarden funkar det klockrent.

precis jag har läst lite om debounce. man sätter en timer såfort knappen känns av så den struntar i om knappen ändrar sig en liten stund sedan utför det som ska göras.
Plutonium
Inlägg: 60
Blev medlem: 24 februari 2005, 00:04:14
Ort: Essunga station
Kontakt:

Inlägg av Plutonium »

sodjan skrev:Notera att för lite mer avancerad användning an knappar så kan
man behöva ta hänsyn till kontaktstudsar, och det blir en hel del mer
komplext än de exempel som finns här.

> Hur skrivs funktionen för att nyttja PORTA, 3 för just mitt ändamål?

Beror på vad ditt ändamål är. Du får väl beskriva det...
Om man trycker ner knappen och släpper upp den så skall alla LED:er slockna i detta fall TRISC, 0 och TRISC, 1 och repeterar man processen skall dessa LED:er tändas.
Vet inte hur mer utförligt jag kan förklara mig.
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Inlägg av eAk »

Jo pullar efter knapp tryckning, sparar en ändring i en variabel varje gång.
ändrar diod av/på efter vad som står i variabeln.
Plutonium
Inlägg: 60
Blev medlem: 24 februari 2005, 00:04:14
Ort: Essunga station
Kontakt:

Inlägg av Plutonium »

eAk skrev:kopplar du 5volt regulerat till power kontakten på demo boarden funkar det klockrent.
Nu vet jag inte om jag hänger med riktigt. Hur och vart på boarden?
Skriv svar