vuoi
o PayPal
tutte le volte che vuoi
ON OFF
I due bit di DCxB permettono un controllo più preciso sul duty cycle: corrispondono a "un quarto di ciclo"
PIC18F25K22 ha 5 CCP, ognuno configurabile indipendentemente in una delle 3 modalità, e ognuno con i suoi pin di I/O
Pin: ogni CCP ha un pin di I/O condiviso con una porta I/O:
- CCP1 => RC2
- CCP2 => RC1 o RB3 (configurabile)
- CCP3 => RC6 o RB5 (configurabile)
- CCP4 => RB0
- CCP5 => RA4
SFR:
- CCPRxH, CCPRxL (CCPx Register): l'uso dipende dalla modalità del CCP (in XC8 esiste la variabile unica CCPRx)
- CCPTMRS0, CCPTMRS1 (CCP Timer Select): seleziona quale timer deve usare ogni CCP
CxTSEL (CCPx Timer Select): selezione timer da usare per ogni CCP
- 00: Capture/compare usa TIMER1, PWM usa TIMER2
- 01: Capture/compare usa TIMER3, PWM usa TIMER4
- 10: Capture/compare usa TIMER5, PWM usa TIMER6
CCPxCON (CCPx Control): configurazione di CCPx
- DCxB (CCPx Duty Cycle Bits): bit
- CCPxM (CCPx Mode): modalità CCP:
- 0000 - Spento
- 0010 - Compare
- 1000 - Capture
- 1001 - PWM
- 0100 - Toggle
- 0101 - 1
- 0110 - 0
- 0111 - Discesa
- 11xx - Salita
- Ogni 4 salite
- Ogni 16 salite
- CCP1IF => PIR1
- CCP2IF => PIR2
- CCP3IF => PIR4
- CCP4IF => PIR4
- CCP5IF => PIR4
- Inter-Integrated Circuit Bus - bus digitale (ideato da Philips), standard per connettere diversi IC sulla stessa scheda
- Ogni periferica ha un ruolo:
- 2Master - avvia la comunicazione, un solo master ammesso in una rete I C, in genere un MCU
- Slave - tutte le altre periferiche, rispondono agli stimoli del master
- Interfaccia sincrona (velocità max teorica 400 Kbps), bus a due fili che connettono tutte le periferiche:
- SDA: Serial DAta, bidirezionale, trasporta i dati serialmente
- SCL: Serial CLock, unidirezionale, dal master
agli slave, temporizza le trasmissioni
- I due fili usano resistori pull-up, per evitare collisioni elettriche:
- Quando i MOS di output sono spenti, la linea è a tensione V tramite la resistenza di pull-up (1 logico)cc
- Quando i MOS di output sono accesi, la linea è a tensione 0 perché connessa alla massa (0 logico)
- Quindi trasmettere 0 e 1 in software provoca l'accensione o lo spegnimento dei MOS in hardware
- Ogni slave ha un indirizzo noto
- Due standard per gli indirizzi: 7 bit (diffuso) e 10 bit (solo casi particolari)
- Ogni slave ha anche una register map: ogni registro ha un indirizzo (8 bit) e un valore (8 bit). Il master può leggere e scrivere questi registri tramite opportuni protocolli. Uso: configurare la periferica, inviare comandi, etc
- Stati
- Bus IDLE: SDA e SCL entrambi in stato 1
- START CONDITION (S): avviata dal master – SCL=1, SDA transizione 1-0. Avvia la comunicazione sul bus
- Trasferimento dati:
- Il valore del bit viene posto in
<SDA>
- Transizione 0-1-0 in
<SCL>
(impulso di clock) - 0-1: il byte è stabilmente sulla linea, lo slave ricevente può leggere
- 1-0: il byte sta cambiando con il successivo
- Prossimo bit
- Dopo gli 8 bit, il master aspetta un ACK: trasmette un nono impulso di clock, e lo slave ricevente mantiene
<SDA>
a 0 per indicare la corretta ricezione del byte. Se ciò non accade (NACK) il master interrompe la comunicazione
STOP CONDITION (P): avviata dal master - <SCL>
=1, <SDA>
transizione 0-1. Termina ogni comunicazione, bus IDLE
Trasferimento dati
- Master avvia la comunicazione con una Start Condition
- Master invia Write Command (8 bit): 7 bit di indirizzo e un bit R/W a 0 (ovvero scrivere sullo slave) e attende ACK
- Master invia il register number (8 bit) e attende ACK
- PER INVIARE DATI:
- Master invia il register data (8 bit) e attende ACK
- PER RICEVERE DATI:
- Master invia...
una nuova Start Condition
Master invia Read Command (8 bit): 7 bit di indirizzo e un bit R/W a 1 (ovvero leggere dallo slave) e attende ACK
Lo slave invia gli 8 bit e attende ACK dal master. Continua ad inviare 8 bit alla volta dai registri consecutivi finché non riceve un NACK (SDA a 1) dal master, che indica che il master non ha bisogno di altri dati.
Master termina la comunicazione con una Stop Condition
2MSSP (Master Synchronous Serial Port) - Periferica per comunicazioni I C e SPI. Può agire da master o slave
SFR:
2SSPxCON1: imposta la modalità di funzionamento: es I C/SPI, master/slave
SSPxCON2: in master mode, genera eventi (S, P, ACK, NACK)
ACKSTAT, ACKDT: ACK status e data
ACKEN: invia ACK data (resettato dall'hardware appena completato)
RCEN: attiva ricevitore (resettato dall'hardware appena completato)
PEN: invia Stop Condition (resettato dall'hardware appena completato)
SEN, RSEN:
invia Start Condition e Start Condition ripetuta (resettato dall'hardware appena completato)
SSPxCON3: specifica gli eventi che generano interrupt
SSPxSTAT: indica il verificarsi di eventi
- D/!A: indica se dati o indirizzo
- P: indica una Stop Condition
- S: indica una Start Condition
- BF: buffer pieno (durante la ricezione 1: ricezione completa; durante l'invio 1=trasmissione in corso)
Baud Rate Register: imposta la velocità di comunicazione (master mode)
Data Register: contiene i dati letti o da scrivere
Sintesi LAP 1 – UniCT Informatica Mario Cianciolo 6A A – E SFRPPENDICE LENCO UTILI
INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
INTCONbits INTCON2 RBPU INTEDG0 INTEDG1 INTEDG2 - TMR0IP - RBIP
INTCON3 INT2IP INT1IP - INT2IE INT1IE - INT2IF INT1IF
STATUS - - - N OV Z DC CRCON IPEN SBOREN - RI TO PD POR BOR
TMR0H High byte di Timer0 – registro completo a 16 bit: TMR0
TMR0L Low byte di Timer0
T0CON TMR0ON
T08BIT T0CS T0SE PSA T0PS<2:0>TMR1H High byte per Timer1 – registro completo a 16 bit: TMR1TMR1/3/5 TMR1L Low byte per Timer1T1CIB TMR1CS<1:0> T1CKPS<1:0> T1SOSCEN !T1SYNC T1RD16 TMR1ONT1GCON TMR1GE T1GPOL T1GTM T1GSPM T1GGO/!DONE T1GVAL T1GSS<1:0>ADRESH High byte del convertitore A/D – registro completo a 16 bit: ADRESADRES ADRESL Low byte del convertitore A/DADCON0 - CHS<4:0> GO/DONE ADONADCONbits ADCON1 TRIGSEL - - - PVCFG<1:0> NVCFG<1:0>ADCON2 ADFM - ACQT<2:0> ADCS<2:0>TMR2 Valore di Timer2TMR2/4/6 PR2 Periodo di reset di Timer2T2CON - T2OUTPS<3:0> TMR2ON T2CKPS<1:0>CCP1CO - - DC1B<1:0> CCP1M<3:0>NCCP1/2/3/4/5 CCPR1H High byte di CCP1 (usato solo con timer a 16 bit, no PWM) – registro completo a 16 bit: CCPR1CCPR1L Low byte di CCP1CCPTMR C3TSEL<1:0> - C2TSEL<1:0> - C1TSEL<1:0>S0CCPTMR - - - - C5TSEL<1:0> C4TSEL<1:0>S1BAUDCO ABDOVF RCIDL DTRXP CKTXP BRG16 -
WUE ABDENN1SPBRGHEUSART1/2 High byte del Baud Rate Generator di EUSART11SPBRG1 Low byte del Baud Rate Generator di EUSART1RCREG1 Registro ricezione di EUSART1TXREG1 Registro trasmissione di EUSART1TXSTA1 CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9DRCSTA1 SPEN RX9 SREN CREN ADDEN FERR OERR RX9DANSELA ANSELA7 ANSELA6 ANSELA5 ANSELA4 ANSELA3 ANSELA2 ANSELA1 ANSELA0A/B/C/D/E TRISA TRISA7 TRISA6 TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0LATA LATA7 LATA6 LATA5 LATA4 LATA3 LATA2 LATA1 LATA0PORTA PORTA7 PORTA6 PORTA5 PORTA4 PORTA3 PORTA2 PORTA1 PORTA0PIE1 - ADIE RC1IE TX1IE SSP1IE CCP1IE TMR2IE TMR1IEPIR1 - ADIF RC1IF TX1IF SSP1IF CCP1IF TMR2IF TMR1IFIPR1 - ADIP RC1IP TX1IP SSP1IP CCP1IP TMR2IP TMR1IPPIE2 OSCFIE C1IE C2IE EEIE BCL1IE HLVDIE TMR3IE CCP2IEPIR2 OSCFIF C1IF C2IF EEIF BCL1IF HLVDIF TMR3IF CCP2IFinterrupt IPR2 OSCFIP C1IP C2IP EEIP BCL1IP HLVDIP TMR3IP CCP2IPPIE3 SSP2IE BCL2IE RC2IE TX2IE CTMUIE TMR5GIE TMR3GIE TMR1GIEPIR3 SSP2IF BCL2IF RC2IF TX2IF CTMUIF TMR5GIF TMR3GIF TMR1GIFvari IPR3<TRISAbits.TRISA3 = 1; // RA3: input
TRISCbits.TRISC4 = 0; // RC4: output
int x = PORTAbits.RA3; // legge RA3
LATCbits.LATC4 = x; // scrive su RC4
Evitare busy waits:
// in questo modo il main loop può eseguire altre operazioni mentre attende il release dei pulsanti
#define CHECK_FOR_PRESS 1
#define CHECK_FOR_RELEASE 2
int main(int argc, char** argv) {
int stateRA1 = CHECK_FOR_PRESS;
for (;;) { // main loop
if (stateRA1 == CHECK_FOR_PRESS && PORTAbits.RA1 == 0) {
//...azioni necessarie
stateRA1 = CHECK_FOR_RELEASE;
} else if (stateRA1 == CHECK_FOR_RELEASE && PORTAbits.RA1 == 1) {
stateRA1 = CHECK_FOR_PRESS;
}
// ...ripetere per ogni
}
}
pulsante
void enable_interrupts() {
INTCONbits.GIE = 1; // abilita gli interrupts (switch globale)
INTCONbits.PEIE = 1; // abilita gli interrupts delle periferiche
RCONbits.IPEN = 0; // no priorità
}
// interrupt service routine – purché abbia l'attributo interrupt può avere qualsiasi nome. Chiamata ad ogni interrupt
void interrupt isr() {
/*if (xxxIF == 1) {... eseguire le azioni necessariexxxIF = 0;}*/
}
ADC
void setup_adc() {
TRISAbits.TRISA0 = 1; // RA0 = input
ANSELAbits.AN