diff --git a/2ano/2semestre/ac2/aula11/AC2-P-Aula11.pdf b/2ano/2semestre/ac2/aula11/AC2-P-Aula11.pdf new file mode 100644 index 0000000..777a6ff Binary files /dev/null and b/2ano/2semestre/ac2/aula11/AC2-P-Aula11.pdf differ diff --git a/2ano/2semestre/ac2/aula11/part1.c b/2ano/2semestre/ac2/aula11/part1.c new file mode 100644 index 0000000..9dbb187 --- /dev/null +++ b/2ano/2semestre/ac2/aula11/part1.c @@ -0,0 +1,50 @@ +#include + +int main() { + TRISCbits.TRISC14 = 0; + + U2BRG = ((PBCLK + 8 * 115200) / (16 * 115200)) - 1; + U2MODEbits.BRGH = 0; // 16x baud clock enabled (1 -> 4x baud clock) + + U2MODEbits.PDSEL = 00; // 8 data bits, without parity + U2MODEbits.STSEL = 0; // 1 stop bit + + U2STAbits.URXEN = 1; // Enable Receiver + U2STAbits.UTXEN = 1; // Enable Transmitter + + IEC1bits.U2RXIE = 1; + IEC1bits.U2TXIE = 0; + IPC8bits.U2IP = 2; + IFS1bits.U2RXIF = 0; + + U2MODEbits.ON = 1; + + EnableInterrupts(); + + while (1); + return 0; +} + +void putc(char byte) { + // wait while UTXBF == 1 + while (U2STAbits.UTXBF == 1); + // Copy byte to the UxTXREG register + U2TXREG = byte; +} + +void _int_(32) isr_uart2rx() { + // If OERR == 1 then reset OERR + if (U2STAbits.OERR == 1) + U2STAbits.OERR = 0; + // Wait while URXDA == 0 + while (U2STAbits.URXDA == 0); + // Save U2RXREG value + char c = U2RXREG; + + if (c == 'T') LATCbits.LATC14 = 1; + else if (c == 't') LATCbits.LATC14 = 0; + + putc(c); + + IFS1bits.U2RXIF = 0; +} diff --git a/2ano/2semestre/ac2/aula11/part2.c b/2ano/2semestre/ac2/aula11/part2.c new file mode 100644 index 0000000..f8dc68a --- /dev/null +++ b/2ano/2semestre/ac2/aula11/part2.c @@ -0,0 +1,57 @@ +#include "p32mx795f512h.h" +#include + +volatile struct { + char mem[100]; + int nchar; + int posrd; +} txbuf; + +void putStrInt(char *s) { + while (txbuf.nchar > 0); + + while (*s != '\0') + txbuf.nchar++[txbuf.mem] = *s++; + + txbuf.posrd = 0; + IEC1bits.U2TXIE = 1; +} + +int main() { + U2BRG = ((PBCLK + 8 * 115200) / (16 * 115200)) - 1; + U2MODEbits.BRGH = 0; // 16x baud clock enabled (1 -> 4x baud clock) + + U2MODEbits.PDSEL = 00; // 8 data bits, without parity + U2MODEbits.STSEL = 0; // 1 stop bit + + U2STAbits.URXEN = 1; // Enable Receiver + U2STAbits.UTXEN = 1; // Enable Transmitter + + IEC1bits.U2RXIE = 0; + IEC1bits.U2TXIE = 0; + IPC8bits.U2IP = 2; + IFS1bits.U2TXIF = 0; + U2STAbits.UTXISEL = 00; + + U2MODEbits.ON = 1; + + EnableInterrupts(); + txbuf.nchar = 0; + + while (1) { + putStrInt("Test string which can be as long as you like, up to a maximum of 100 characters\n"); + } + + return 0; +} + +void _int_(32) isr_uart2tx() { + if (!IFS1bits.U2TXIF) return; + if (txbuf.nchar-- > 0) { + U2TXREG = txbuf.posrd++[txbuf.mem]; + } else { + IEC1bits.U2TXIE = 0; + } + + IFS1bits.U2TXIF = 0; +} diff --git a/2ano/2semestre/ac2/aula11/part3.c b/2ano/2semestre/ac2/aula11/part3.c new file mode 100644 index 0000000..d09a971 --- /dev/null +++ b/2ano/2semestre/ac2/aula11/part3.c @@ -0,0 +1,155 @@ +#include + +#define SAMPLES 4 + +volatile int voltage = 0; +volatile int voltMin = 33; +volatile int voltMax = 0; + +const unsigned int dis7Scodes[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, + 0xFD, 0x07, 0x7F, 0x6F, 0x77, 0xFC, + 0x39, 0x5E, 0xF9, 0xF1}; + +typedef enum { HIGH, LOW } display; + +unsigned char toBdc(unsigned char value) { + return ((value / 10) << 4) + (value % 10); +} + +void send2displays(unsigned char value) { + static display flag = LOW; + unsigned char high = dis7Scodes[value >> 4]; + unsigned char low = dis7Scodes[value & 0x0F]; + + if (flag == HIGH) { + LATD = (LATD & 0xFF9F) | 0x0040; + LATB = (LATB & 0x80FF) | high << 8; + flag = LOW; + } else { + LATD = (LATD & 0xFF9F) | 0x0020; + LATB = (LATB & 0x80FF) | low << 8; + flag = HIGH; + } +} + +void putc(char byte) { + // wait while UTXBF == 1 + while (U2STAbits.UTXBF == 1); + // Copy byte to the UxTXREG register + U2TXREG = byte; +} + +void putstr(char *str) { + // use putc() function to send each charater ('\0' should not be sent) + while (*str != '\0') putc(*str++); +} + + +int main() { + TRISB &= 0x80FF; + TRISD &= 0xFF9F; + + TRISBbits.TRISB4 = 1; + AD1PCFGbits.PCFG4 = 0; + AD1CON1bits.SSRC = 7; + AD1CON1bits.CLRASAM = 1; + AD1CON3bits.SAMC = 16; + AD1CON2bits.SMPI = SAMPLES - 1; + AD1CHSbits.CH0SA = 4; + AD1CON1bits.ON = 1; + + IPC6bits.AD1IP = 2; + IFS1bits.AD1IF = 0; + IEC1bits.AD1IE = 1; + + // Configure Timer T1 with 5Hz frequency + T1CONbits.TCKPS = 2; + PR1 = 62499; + TMR1 = 0; + T1CONbits.TON = 1; + + // Configure Timer T3 with 100Hz frequency + T3CONbits.TCKPS = 2; + PR3 = 49999; + TMR3 = 0; + T3CONbits.TON = 1; + + IPC1bits.T1IP = 2; + IFS0bits.T1IF = 0; + IEC0bits.T1IE = 1; + + IPC3bits.T3IP = 2; + IFS0bits.T3IF = 0; + IEC0bits.T3IE = 1; + + U2BRG = ((PBCLK + 8 * 115200) / (16 * 115200)) - 1; + U2MODEbits.BRGH = 0; // 16x baud clock enabled (1 -> 4x baud clock) + + U2MODEbits.PDSEL = 00; // 8 data bits, without parity + U2MODEbits.STSEL = 0; // 1 stop bit + + U2STAbits.URXEN = 1; // Enable Receiver + U2STAbits.UTXEN = 1; // Enable Transmitter + + IEC1bits.U2RXIE = 1; + IEC1bits.U2TXIE = 0; + IPC8bits.U2IP = 2; + IFS1bits.U2RXIF = 0; + + U2MODEbits.ON = 1; + + EnableInterrupts(); + while (1); + + return 0; +} + +void _int_(4) isr_T1(void) { + AD1CON1bits.ASAM = 1; + IFS0bits.T1IF = 0; +} + +void _int_(12) isr_T3(void) { + send2displays(toBdc(voltage)); + IFS0bits.T3IF = 0; +} + +void _int_(27) isr_adc(void) { + int *p = (int *)(&ADC1BUF0); + int media = 0; + for (; p <= (int *)(&ADC1BUFF); p++) + media += *p; + media /= SAMPLES; + voltage = (media * 33 + 511) / 1023; + voltMin = voltage < voltMin ? voltage : voltMin; + voltMax = voltage > voltMax ? voltage : voltMax; + IFS1bits.AD1IF = 0; +} + +void _int_(32) isr_uart2rx() { + // If OERR == 1 then reset OERR + if (U2STAbits.OERR == 1) + U2STAbits.OERR = 0; + // Save U2RXREG value + char c = U2RXREG; + + if (c == 'M') { + char v = toBdc(voltMax); + putstr("VMax="); + putc((v >> 4) + 0x30); + putc('.'); + putc((v & 0x0F) + 0x30); + putc('V'); + putc('\n'); + } else if (c == 'm') { + char v = toBdc(voltMin); + putstr("VMin="); + putc((v >> 4) + 0x30); + putc('.'); + putc((v & 0x0F) + 0x30); + putc('V'); + putc('\n'); + } + + IFS1bits.U2RXIF = 0; +}