PIC, varför inte... går det....?
Re: PIC, varför inte... går det....?
Det är kanske lite otydligt att säga att pinnen är konfigurerad som digital eller analog.
Se det som att det inuti kretsen sitter en omkopplare med två lägen. För att få rätt funktion så måste du se till att den omkopplaren står i rätt läge.
Är den digital är pinnen (internt i kretsen) kopplad till en logikkrets och kan läsas av eller styras som en bit i en byte (beroende på om det är ingång eller utgång).
Är den analog så är pinnen (internt i kretsen) kopplad till en A/D- eller D/A-omvandlare (beroende på om det är ingång eller utgång) och den där biten i byten som nämns ovan är oanvändbar eftersom den inte är kopplad till pinnen.
Se det som att det inuti kretsen sitter en omkopplare med två lägen. För att få rätt funktion så måste du se till att den omkopplaren står i rätt läge.
Är den digital är pinnen (internt i kretsen) kopplad till en logikkrets och kan läsas av eller styras som en bit i en byte (beroende på om det är ingång eller utgång).
Är den analog så är pinnen (internt i kretsen) kopplad till en A/D- eller D/A-omvandlare (beroende på om det är ingång eller utgång) och den där biten i byten som nämns ovan är oanvändbar eftersom den inte är kopplad till pinnen.
Re: PIC, varför inte... går det....?
Jag hör dig Nerre. Och det har jag greppat.
Och vad jag tycker mig ha gjort är satt PORTA till digital input.
Ergo:
V^ ≤ 1 ⇨ Low
&
V^ ≥ 4 ( ... ∞) ⇨ High
Återsammanfattning:
En port initieras som standard till digital I/O.
En digital input port får in en spänning som ger värde 0 (≤1) eller 1 (≥4).
Omm en port initieras kan den sedan ställas till analog I/O.
En analog input port får in en spänning som omvandlas till att ge ett (byte) värde.
Och vad jag tycker mig ha gjort är satt PORTA till digital input.
Ergo:
V^ ≤ 1 ⇨ Low
&
V^ ≥ 4 ( ... ∞) ⇨ High
Återsammanfattning:
En port initieras som standard till digital I/O.
En digital input port får in en spänning som ger värde 0 (≤1) eller 1 (≥4).
Omm en port initieras kan den sedan ställas till analog I/O.
En analog input port får in en spänning som omvandlas till att ge ett (byte) värde.
Re: PIC, varför inte... går det....?
Nej, vad porten initieras som beror på vilken PIC du använder, det är inte alltid digitalt från början, även om jag hade önskat att det var så för det hade underlättat 

Re: PIC, varför inte... går det....?
Och sedan den läxa som en del har lärt sig: Om ett projekt är beroende av att en specifik inställning ska ske i register ska man utföra dessa inställningar och inte förlita sig på att "det är ju så efter reset".
Re: PIC, varför inte... går det....?
Fast... Jag har ju initierat dem som digitala.
Det är väl ändå det jag gör med TRISx och BANK1... på en PIC16F690?
Dvs jag hittar inte på och hoppas att de ska initieras på ett visst sätt. Jag använder, i detta fall, PIC16F690 med PICkit 2 (och MPLAB etc). Och såsom lektionerna för detta Starter Kit ser ut, och fungerar vid genomgång, så är serien
något som initierar
PORTA till digital Input
och
PORTC till digital Output ...
... eller åtminstone borde göra så.
Om och när jag riktar koden mot att användas med exempelvis mina PIC12F629, då tittar jag i databladet som gäller för PIC12F629, för att kolla vad som händer när jag gör vad med den då använda PIC12F629.
Och jag håller helt med om att detta måste göras!
Bara som att det heter PORT i ena fallet och exempelvis GPIO i andra etc.
Det är väl ändå det jag gör med TRISx och BANK1... på en PIC16F690?
Dvs jag hittar inte på och hoppas att de ska initieras på ett visst sätt. Jag använder, i detta fall, PIC16F690 med PICkit 2 (och MPLAB etc). Och såsom lektionerna för detta Starter Kit ser ut, och fungerar vid genomgång, så är serien
Kod: Markera allt
bsf STATUS,RP0
movlw b'00111111'
movwf TRISA
movlw b'00000000'
movwf TRISC
bcf STATUS,RP0
PORTA till digital Input
och
PORTC till digital Output ...
... eller åtminstone borde göra så.
Om och när jag riktar koden mot att användas med exempelvis mina PIC12F629, då tittar jag i databladet som gäller för PIC12F629, för att kolla vad som händer när jag gör vad med den då använda PIC12F629.
Och jag håller helt med om att detta måste göras!
Bara som att det heter PORT i ena fallet och exempelvis GPIO i andra etc.
- Swech
- EF Sponsor
- Inlägg: 4750
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
Re: PIC, varför inte... går det....?
Nu har du fått indikering från minst fyra medlemmar att du måste initiera den analoga delen som
digital, ändå så fortsätter du att anta att det fungerar så som du tror
Swech
Från databladet som du länkat till
EXAMPLE 4-1: INITIALIZING PORTA
Note: The ANSEL register must be initialized to
configure an analog channel as a digital
input. Pins configured as analog inputs will
read ‘0’.
BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTA ;Init PORTA
BSF STATUS,RP1 ;Bank 2
CLRF ANSEL ;digital I/O
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1 ;
MOVLW 0Ch ;Set RA<3:2> as inputs
MOVWF TRISA ;and set RA<5:4,1:0>
;as outputs
BCF STATUS,RP0 ;Bank 0
digital, ändå så fortsätter du att anta att det fungerar så som du tror
Swech
Från databladet som du länkat till
EXAMPLE 4-1: INITIALIZING PORTA
Note: The ANSEL register must be initialized to
configure an analog channel as a digital
input. Pins configured as analog inputs will
read ‘0’.
BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTA ;Init PORTA
BSF STATUS,RP1 ;Bank 2
CLRF ANSEL ;digital I/O
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1 ;
MOVLW 0Ch ;Set RA<3:2> as inputs
MOVWF TRISA ;and set RA<5:4,1:0>
;as outputs
BCF STATUS,RP0 ;Bank 0
Re: PIC, varför inte... går det....?
Nej det gör du inte, TRIS-registren väljer bara om pinnen skall vara digital in eller utgång, inte om den skall vara analog eller digital.Det är väl ändå det jag gör med TRISx och BANK1... på en PIC16F690?
Pinnar med analog/digital funktion är alltid analoga vid uppstart, du måste explicit ställa om dem från analog till digital funktion vilket du gör med ANSEL-registret.
Så länge du inte gör detta är den digitala delen helt bortkopplad.
Re: PIC, varför inte... går det....?
Ett exempel på initiering av port A-C som digitala portar:
(observera ANSEL och ANSELH)
;initialization routine
clrf PORTA ;initialize all ports
clrf PORTB
clrf PORTC
banksel ANSEL ;bank 2
clrf ANSEL ;all ports digital I/O
clrf ANSELH
banksel TRISA ;bank 1
movlw b'00011100' ;RA<4:2> as inputs
movwf TRISA
movlw b'00000000' ;RB0-RB7 outputs
movwf TRISB
movlw b'00000010' ;RC<7:2,0> as output
movwf TRISC ;RC1-Input
banksel PORTA ;bank 0
Kämpa på
(observera ANSEL och ANSELH)
;initialization routine
clrf PORTA ;initialize all ports
clrf PORTB
clrf PORTC
banksel ANSEL ;bank 2
clrf ANSEL ;all ports digital I/O
clrf ANSELH
banksel TRISA ;bank 1
movlw b'00011100' ;RA<4:2> as inputs
movwf TRISA
movlw b'00000000' ;RB0-RB7 outputs
movwf TRISB
movlw b'00000010' ;RC<7:2,0> as output
movwf TRISC ;RC1-Input
banksel PORTA ;bank 0
Kämpa på

Re: PIC, varför inte... går det....?
Inte riktigt så Swech.
Det som fattats är vad du citerade och vad TomasL sa rätt upp och ner.
Problemet är dock, fortsättningsvis, att detta inte görs i lektionerna för PIC16F690.
Dvs portarna förefaller initieras som digitala i grund.
Det är inte förrän lektionerna går över till AD-omvandling som ANSEL (och ADCON1) dyker upp.
Därav förvirringen.
Notera skillnaden mellan vad som görs Lesson 2 och Lesson 3 nedan, och vad som görs i Lesson 4...
(jag har medvetet inte tagit med inledande copyright text etc, då det inklippta skulle blivit mer bökigt att hantera än vad som är vänligt utsätta någon för)
och
och
Det som fattats är vad du citerade och vad TomasL sa rätt upp och ner.
Problemet är dock, fortsättningsvis, att detta inte görs i lektionerna för PIC16F690.
Dvs portarna förefaller initieras som digitala i grund.
Det är inte förrän lektionerna går över till AD-omvandling som ANSEL (och ADCON1) dyker upp.
Därav förvirringen.
Notera skillnaden mellan vad som görs Lesson 2 och Lesson 3 nedan, och vad som görs i Lesson 4...
(jag har medvetet inte tagit med inledande copyright text etc, då det inklippta skulle blivit mer bökigt att hantera än vad som är vänligt utsätta någon för)
Kod: Markera allt
; PICkit 2 Lesson 2 - "Blink"
;
; First lesson showed how to make an LED turn on,
; Now we'll look at how to make it blink. Delay loops are necessary
; to slow down the on and off commands so they are visible to humans.
; *******************************************************************
; * See Low Pin Count Demo Board User's Guide for Lesson Information*
; *******************************************************************
; * NOTE: The PIC16F690 requires the AC162061 header for debugging *
; *******************************************************************
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
cblock 0x20
Delay1 ; Define two file registers for the
Delay2 ; delay loop
endc
org 0
Start:
bsf STATUS,RP0 ; select Register Page 1
bcf TRISC,0 ; make IO Pin B.0 an output
bcf STATUS,RP0 ; back to Register Page 0
MainLoop:
bsf PORTC,0 ; turn on LED C0
OndelayLoop:
decfsz Delay1,f ; Waste time.
goto OndelayLoop ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
decfsz Delay2,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto OndelayLoop ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
; call it a two-tenths of a second.
bcf PORTC,0 ; Turn off LED C0
OffDelayLoop:
decfsz Delay1,f ; same delay as above
goto OffDelayLoop
decfsz Delay2,f
goto OffDelayLoop
goto MainLoop ; Do it again...
end
Kod: Markera allt
; PICkit 2 Lesson 3 - "Rotate"
;
; Extends Lesson 2 to sequence through the display LEDs.
;
; *******************************************************************
; * See Low Pin Count Demo Board User's Guide for Lesson Information*
; *******************************************************************
; * NOTE: The PIC16F690 requires the AC162061 header for debugging *
; *******************************************************************
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
cblock 0x20
Delay1 ; Assign an address to label Delay1
Delay2
Display ; define a variable to hold the diplay
endc
org 0
Start:
bsf STATUS,RP0 ; select Register Page 1
clrf TRISC ; make IO PortC all output
bcf STATUS,RP0 ; back to Register Page 0
movlw 0x08
movwf Display
MainLoop:
movf Display,w ; Copy the display to the LEDs
movwf PORTC
goto skipDelay
OndelayLoop:
decfsz Delay1,f ; Waste time.
goto OndelayLoop ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
decfsz Delay2,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto OndelayLoop ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
; call it a two-tenths of a second.
skipDelay:
bcf STATUS,C ; ensure the carry bit is clear
rrf Display,f
btfsc STATUS,C ; Did the bit rotate into the carry?
bsf Display,3 ; yes, put it into bit 3.
goto MainLoop
end
Kod: Markera allt
; PICkit 2 Lesson 4 - "A2D"
;
; This shows how to read the A2D converter and display the
; High order parts on the 4 bit LED display.
; The pot on the Low Pin Count Demo board varies the voltage
; coming in on in A0.
;
; The A2D is referenced to the same Vdd as the device, which
; is provided by the USB cable and nominally is 5V. The A2D
; returns the ratio of the voltage on Pin RA0 to 5V. The A2D
; has a resolution of 10 bits, with 1023 representing 5V and
; 0 representing 0V.
;
; *******************************************************************
; * See Low Pin Count Demo Board User's Guide for Lesson Information*
; *******************************************************************
; * NOTE: The PIC16F690 requires the AC162061 header for debugging *
; *******************************************************************
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
cblock 0x20
Delay1 ; Assign an address to label Delay1
Delay2
Display ; define a variable to hold the diplay
endc
org 0
Start:
bsf STATUS,RP0 ; select Register Page 1
movlw 0xFF
movwf TRISA ; Make PortA all input
clrf TRISC ; Make PortC all output
movlw 0x10 ; A2D Clock Fosc/8
movwf ADCON1
bcf STATUS,RP0 ; back to Register Page 0
bcf STATUS,RP0 ; address Register Page 2
bsf STATUS,RP1
movlw 0xFF ; we want all Port A pins Analoga
movwf ANSEL
bcf STATUS,RP0 ; address Register Page 0
bcf STATUS,RP1
movlw 0x01
movwf ADCON0 ; configure A2D for Channel 0 (RA0), Left justified, and turn on the A2D module
MainLoop:
nop ; wait 5uS for A2D amp to settle and capacitor to charge.
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
bsf ADCON0,GO ; start conversion
btfss ADCON0,GO ; this bit will change to zero when the conversion is complete
goto $-1
swapf ADRESH,w ; Copy the display to the LEDs
movwf PORTC
goto MainLoop
end
Re: PIC, varför inte... går det....?
Det kan ju kanske bero på att de första lektionerna inte använder de pinnar som går att använda som analog port?
Re: PIC, varför inte... går det....?
RC0 är bland annat AN4.
Men där hittar du vad jag sökt!
Hoppas jag...
PORTC har hela tiden satts till output.
Och det jag tittar på är PORTA, som input.
Det torde förklara det hela.
Tack allihop för tålamod och generöst bemötande!
Men där hittar du vad jag sökt!
Hoppas jag...
PORTC har hela tiden satts till output.
Och det jag tittar på är PORTA, som input.
Det torde förklara det hela.
Tack allihop för tålamod och generöst bemötande!

Re: PIC, varför inte... går det....?
Och vad har vi lärt oss av detta?
Jo, att exempel inte är ett komplett läromedel.
Jo, att exempel inte är ett komplett läromedel.
Re: PIC, varför inte... går det....?
Nej.
Vi har verifierat att tillsammans kommer vi framåt.
Vi har verifierat att tillsammans kommer vi framåt.
Re: PIC, varför inte... går det....?
> PORTC har hela tiden satts till output.
> Och det jag tittar på är PORTA, som input.
> Det torde förklara det hela.
Ja, men det är fortfarande ett dåligt exempel (i exempel 2).
Även om man enbart kör som output, så är det snyggare att sätta
ANSEL/ANSELH korrekt i alla fall, fast det "fungerar" utan det.
> Och det jag tittar på är PORTA, som input.
> Det torde förklara det hela.
Ja, men det är fortfarande ett dåligt exempel (i exempel 2).
Även om man enbart kör som output, så är det snyggare att sätta
ANSEL/ANSELH korrekt i alla fall, fast det "fungerar" utan det.
Re: PIC, varför inte... går det....?
Det håller jag med om, väldigt mycket.
Det är tillräckligt mycket konstigt här som det är.
Som att dela upp adresser på sidor, när adressen redan är unik som den är.
Som att standard för en port är att vara analog, på ett digitalt microchip.
OK, jag kan nästan begripa det där med sidor (bank).
Ett husnummer på en gata med flera hus.
Men... Endast ett av husen är bebott i taget.
Så det finns ingen post som ska till de andra husen.
Om de två första bitarna användes för det, istället för ingenting(?!), vore livet enklare.
Ex att b'00xx xxxx' var Bank0, b'01xx xxxx' Bank1 etc.
Istället för RP0 & 0x03 (plus allt bcf, clrf etc etc) och RP0 & 0x85...
Nå, nu rullar jag vidare - eller iallafall nästan...
Det är tillräckligt mycket konstigt här som det är.
Som att dela upp adresser på sidor, när adressen redan är unik som den är.
Som att standard för en port är att vara analog, på ett digitalt microchip.
OK, jag kan nästan begripa det där med sidor (bank).
Ett husnummer på en gata med flera hus.
Men... Endast ett av husen är bebott i taget.
Så det finns ingen post som ska till de andra husen.

Om de två första bitarna användes för det, istället för ingenting(?!), vore livet enklare.
Ex att b'00xx xxxx' var Bank0, b'01xx xxxx' Bank1 etc.
Istället för RP0 & 0x03 (plus allt bcf, clrf etc etc) och RP0 & 0x85...
Nå, nu rullar jag vidare - eller iallafall nästan...
