diff --git a/2ano/2semestre/ac2/aula08/part2-ex2.c b/2ano/2semestre/ac2/aula08/part2-ex2.c index b1eb9cb..33d9185 100644 --- a/2ano/2semestre/ac2/aula08/part2-ex2.c +++ b/2ano/2semestre/ac2/aula08/part2-ex2.c @@ -2,8 +2,8 @@ void _int_(8) isr_T2() { static int c = 0; - if (c++ == 6) { - IEC0bits.T2IE = 0; + if (++c == 6) { + T2CONbits.TON = 0; LATE &= 0xFFFE; c = 0; } @@ -12,7 +12,8 @@ void _int_(8) isr_T2() { void _int_(7) isr_INT1() { LATE |= 0x0001; - IEC0bits.T2IE = 1; + TMR2 = 0; + T2CONbits.TON = 1; IFS0bits.INT1IF = 0; } @@ -24,14 +25,14 @@ int main() { IPC1bits.INT1IP = 2; IEC0bits.INT1IE = 1; IFS0bits.INT1IF = 0; + INTCONbits.INT1EP = 0; IPC2bits.T2IP = 2; IFS0bits.T2IF = 0; T2CONbits.TCKPS = 7; PR2 = 39062; - TMR2 = 0; - T2CONbits.TON = 1; + IEC0bits.T2IE = 1; EnableInterrupts(); diff --git a/2ano/2semestre/ac2/aula09/AC2-P-Aula09.pdf b/2ano/2semestre/ac2/aula09/AC2-P-Aula09.pdf new file mode 100644 index 0000000..d3a88b9 Binary files /dev/null and b/2ano/2semestre/ac2/aula09/AC2-P-Aula09.pdf differ diff --git a/2ano/2semestre/ac2/aula09/part1.c b/2ano/2semestre/ac2/aula09/part1.c new file mode 100644 index 0000000..5b7e807 --- /dev/null +++ b/2ano/2semestre/ac2/aula09/part1.c @@ -0,0 +1,91 @@ +#include + +#define SAMPLES 4 + +volatile int voltage = 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; + +void send2displays(unsigned char value) { + static display flag = LOW; + value = ((value / 10) << 4) + (value % 10); + 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 _int_(4) isr_T1(void) { + AD1CON1bits.ASAM = 1; + IFS0bits.T1IF = 0; +} + +void _int_(12) isr_T3(void) { + send2displays(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; + IFS1bits.AD1IF = 0; +} + +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; + + EnableInterrupts(); + while (1); + + return 0; +} diff --git a/2ano/2semestre/ac2/aula09/part2-ex1.c b/2ano/2semestre/ac2/aula09/part2-ex1.c new file mode 100644 index 0000000..51a2fb0 --- /dev/null +++ b/2ano/2semestre/ac2/aula09/part2-ex1.c @@ -0,0 +1,21 @@ +#include + +int main() { + T3CONbits.TCKPS = 2; + PR3 = 49999; + TMR3 = 0; + T3CONbits.TON = 1; + + // tON = 0.25 * (1 / 100) = 2.5ms + // fOutPreScaler = 20MHz / 4 = 5MHz + // tOutPreScaler = 1 / 5MHz = 200ns + // OC1RS = (2.5 * 10^-3) / (200 * 10^-9) = 12500 + OC1CONbits.OCM = 6; + OC1CONbits.OCTSEL = 1; + OC1RS = 12500; + OC1CONbits.ON = 1; + + while (1); + + return 0; +} diff --git a/2ano/2semestre/ac2/aula09/part2-ex3.c b/2ano/2semestre/ac2/aula09/part2-ex3.c new file mode 100644 index 0000000..020210d --- /dev/null +++ b/2ano/2semestre/ac2/aula09/part2-ex3.c @@ -0,0 +1,27 @@ +#include + +void setPWM(unsigned int dutyCycle) { + if (dutyCycle < 0 || dutyCycle > 100) + return; + OC1RS = ((PR3 + 1) * dutyCycle) / 100; +} + +int main() { + T3CONbits.TCKPS = 2; + PR3 = 49999; + TMR3 = 0; + T3CONbits.TON = 1; + + // tON = 0.25 * (1 / 100) = 2.5ms + // fOutPreScaler = 20MHz / 4 = 5MHz + // tOutPreScaler = 1 / 5MHz = 200ns + // OC1RS = (2.5 * 10^-3) / (200 * 10^-9) = 12500 + OC1CONbits.OCM = 6; + OC1CONbits.OCTSEL = 1; + OC1RS = 12500; + OC1CONbits.ON = 1; + + while (1) setPWM(80); + + return 0; +} diff --git a/2ano/2semestre/ac2/aula09/part2-ex5.c b/2ano/2semestre/ac2/aula09/part2-ex5.c new file mode 100644 index 0000000..741af24 --- /dev/null +++ b/2ano/2semestre/ac2/aula09/part2-ex5.c @@ -0,0 +1,32 @@ +#include + +void setPWM(unsigned int dutyCycle) { + if (dutyCycle < 0 || dutyCycle > 100) + return; + OC1RS = ((PR3 + 1) * dutyCycle) / 100; +} + +int main() { + T3CONbits.TCKPS = 2; + PR3 = 49999; + TMR3 = 0; + T3CONbits.TON = 1; + + // tON = 0.25 * (1 / 100) = 2.5ms + // fOutPreScaler = 20MHz / 4 = 5MHz + // tOutPreScaler = 1 / 5MHz = 200ns + // OC1RS = (2.5 * 10^-3) / (200 * 10^-9) = 12500 + OC1CONbits.OCM = 6; + OC1CONbits.OCTSEL = 1; + OC1RS = 12500; + OC1CONbits.ON = 1; + + TRISC &= 0xBFFF; + + while (1) { + setPWM(10); + LATC = (LATC & 0xBFFF) | (PORTD & 0x0001) << 14; + } + + return 0; +} diff --git a/2ano/2semestre/ac2/pfull b/2ano/2semestre/ac2/pfull index 4af26e8..e6281b1 100755 --- a/2ano/2semestre/ac2/pfull +++ b/2ano/2semestre/ac2/pfull @@ -1,19 +1,34 @@ #!/bin/bash +# Validate arguments if [ "$#" -ne 1 ]; then echo "Usage: $0 " exit fi + +# Parse arguments file=${1##*/} dir=${1%/*} filename="${file%.*}" -cd "$dir" || exit + +# Go to source directory +if [ -d "$dir" ]; then + cd "$dir" || exit +fi + +# Compile and clean up pcompile "$file" || exit for f in *; do if [[ "$f" =~ ^.+\.(o|elf|map|sym)$ ]]; then rm "$f" fi done + +# Program and open terminal ldpic32 "$filename.hex" || exit pterm || exit -cd "$OLDPWD" || exit + +# Go back to original directory +if [ -d "$dir" ]; then + cd - || exit +fi