Datasheets I/O Poorten.

Het hieronder behandelde hoofdstuk over de I/O poorten gaat in eerste instantie uit van de datasheet van de PIC 18F25K22 , met af en toe een zijsprong naar andere veel gebruikte controllers.
Poort Registers
Te beginnen met het TRIS register, dit register bepaalt of een I/O pin, in of uitgang is. Als de pin ingang is, heeft het een hoog ohmige impedantie, als de pin uitgang is, is deze of GND of VSS. Een bepaalde pin wordt aangeduid op de volgende manier: TRISx.y, x is hier de poort letter (A,B of C) en y het pin nummer van betreffende poort (RA0 = 0).

Het volgende register is het PORT register. Dit register geeft direct de status van de I/O pinnen, dit register is niet bedoeld om naar te schrijven (kan wel!).

Het LAT register (Data Output Latch) is bedoeld als buffer naar de output pin. De output pin volgt de status van dit register. De controller kan aan de inhoud van dit register altijd zien wat de status van de output pin zou moeten zijn ( ook wanneer deze door een externe belasting (capacitief, stoorpuls) niet op het niveau is waar het zou moeten zijn)
Dit is belangrijk omdat wanneer de controller de status van een output pin wijzigt, deze eerst de status van de hele poort leest en daarna deze informatie met de gewijzigde pin weer terugschrijft (naar de hele poort) . Het zou als direct van de pinnen gelezen wordt (PORTx) door een stoorpuls of vertraging fout kunnen gaan, ook op andere pinnen op die poort. De output van een pin moet dus altijd naar LATx.y geschreven worden.
Deze manier van werken noemt men “Read Modify Write” (RMW) en is een bekend probleem bij de PIC 16… en PIC12.. familie die geen LATx registers hebben, bij deze families wordt dit probleem meestal software matig ondervangen (schaduw buffer).

Het volgende register is het ANSEL register (Analog Select). Dit register bepaald of een pin analoog of digitaal is (de pin moet met TRISx.y op input gezet zijn). Bij de 18F..K22 is er een ANSEL register per poort (ANSELA, ANSELB en ANSELC). Bij de 18F..K20 is dit ANSEL en ANSELH. Bij de wat oudere controllers (b.v. 18F4520 en ouder) wordt hier nog het ADCON1 register voor gebruikt. Als men niet zeker weet wat voor registers er gebruikt moeten worden is het dus een goede zaak om dit in het betreffende datasheet op te zoeken.

Het SLRCON register valt buiten deze uitleg.

Generic I/O Poort Blokschema
Poort Registers
Hiernaast een blokschema waarin je kunt zien hoe de I/O pin aangestuurd wordt en hoe TRIS, LAT, PORT en ANSEL te werk gaan.













Voorbeeld hoe je poort setting voor de 18F25K22 in Proton Basic kunt toepassen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
; Demo hoe ANSEL en TRIS te gebruiken

Device 18F25K22

CONFIG_START    
     FOSC = INTIO67                  ;interne oscillator A6, A7 poortfuntie
     FCMEN = OFF                 ;Fail-Safe Clock Monitor disabled
     IESO = OFF                  ;internal external switchover mode
     PWRTEN = On                 ;power-up timer  (18F25K22)
     BOREN = On                  ;brown-out reset
     BORV = 285                  ;brown-out reset value (2,85V) (18F25K22)
     WDTEN = OFF                 ;watchdog timer
     WDTPS = 128                 ;1:128 WDT prescalar
     PBADEN = OFF                ;analog port B<4:0>
     STVREN = On                 ;;stack overflow reset
     LVP = OFF                   ;low voltage programming
     XINST = OFF                 ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
     Debug = OFF                 ;no debug
     CCP2MX = PORTB3             ;CCP2 input/output is multiplexed with RB3
CONFIG_END

XTAL = 64

         '76543210
OSCCON = %01111100   ;x,16 mhz,int osc,FOSC osc
OSCTUNE= %01000000   ;4x PLL enable
   
TRISA =  %11011111   ;A5 Output (led) rest input (hier is het nodig om A0 (AD reading) op 1 te zetten)
ANSELA = %00000001   ;Poort A.0 Analoog voor AD reading  (als voorbeeld de rest op digitaal)

ANSELC = %00111111   ;Poort C.6 en C.7 op digitaal voor serieele communicatie  (als voorbeeld de rest op analoog)
ANSELB = %00000000   ;Poort B alles digitaal (voor display)

ADCON1 = %00000000   ;VREF+ aan voeding (AD reading)
ADCON2 = %10010111   ;Right Justified, 4 TAD, FRC AD clock (AD reading settings)

Declare HSERIAL_BAUD  = 9600          ;Transmissiesnelheid van de data over de bus
Declare HSERIAL_RCSTA = %10010000     ;Bit7:Enable serial port / Bit4:Continu ontvangen
Declare HSERIAL_TXSTA = %00100000     ;Bit5:Transmitpin ingeschakeld (TXEN (Transmit ENable) = 1)
Declare HSERIAL_CLEAR On

Symbol  LED     LATA.5    ; LED op poort A5 (i.p.v PORTA.5 is het i.v.m. RMW prolemen beter om LATA.5 te gebruiken)
Dim     ADRead  As Word

Cls                  ; display init

Print At 1,1, "Knutselaar.eu"       ; Proton default 16x2 display

loop:

    DelayMS 500

    ADRead = ADIn 0       ; AD read op AN0 (poort A.0)

    Toggle LED
    HSerOut [Dec ADRead,13]
    Print At 2,1, DEC4 ADRead

GoTo loop

End




Hit Counter by Digits
   Sinds 08 Feb 2013