PIC, varför inte... går det....?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Nerre
Inlägg: 27217
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: PIC, varför inte... går det....?

Inlägg av Nerre »

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.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: PIC, varför inte... går det....?

Inlägg av Erik M »

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.
Användarvisningsbild
Glenn
Inlägg: 36693
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: PIC, varför inte... går det....?

Inlägg av Glenn »

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 :)
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC, varför inte... går det....?

Inlägg av Icecap »

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".
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: PIC, varför inte... går det....?

Inlägg av Erik M »

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

Kod: Markera allt

    bsf      STATUS,RP0
    movlw    b'00111111'
    movwf    TRISA
    movlw    b'00000000'
    movwf    TRISC
    bcf      STATUS,RP0
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.
Användarvisningsbild
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....?

Inlägg av Swech »

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
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46954
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC, varför inte... går det....?

Inlägg av TomasL »

Det är väl ändå det jag gör med TRISx och BANK1... på en PIC16F690?
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.
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.
jako
Inlägg: 337
Blev medlem: 26 oktober 2006, 18:32:35
Ort: Sandviken

Re: PIC, varför inte... går det....?

Inlägg av jako »

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å :)
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: PIC, varför inte... går det....?

Inlägg av Erik M »

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)

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
och

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
och

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
Nerre
Inlägg: 27217
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: PIC, varför inte... går det....?

Inlägg av Nerre »

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?
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: PIC, varför inte... går det....?

Inlägg av Erik M »

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! :tumupp:
Nerre
Inlägg: 27217
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: PIC, varför inte... går det....?

Inlägg av Nerre »

Och vad har vi lärt oss av detta?

Jo, att exempel inte är ett komplett läromedel.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: PIC, varför inte... går det....?

Inlägg av Erik M »

Nej.

Vi har verifierat att tillsammans kommer vi framåt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC, varför inte... går det....?

Inlägg av sodjan »

> 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.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: PIC, varför inte... går det....?

Inlägg av Erik M »

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

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... :vissla:
Skriv svar