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