Sida 2 av 7
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 11:14:16
				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.
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 12:31:00
				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.
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 12:34:52
				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 

 
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 12:59:12
				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".
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 14:13:42
				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.
 
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 14:26:47
				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
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 14:28:45
				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.
 
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 14:49:40
				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å 

 
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 14:55:27
				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
 
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 15:11:50
				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?
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 15:20:46
				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!  

 
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 15:36:44
				av Nerre
				Och vad har vi lärt oss av detta?
Jo, att exempel inte är ett komplett läromedel.
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 4 april 2015, 17:24:03
				av Erik M
				Nej.
Vi har verifierat att tillsammans kommer vi framåt.
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 5 april 2015, 11:41:59
				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.
			 
			
					
				Re: PIC, varför inte... går det....?
				Postat: 5 april 2015, 12:57:11
				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.  
 
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...  
