Bueno, estoy usando MPLAB X y básicamente estoy tratando de lograr un UART de software para este pequeño PIC que se ejecuta a 4 MHZ. Al principio lo intenté con retrasos porque se ha dicho que incluso a 4 MHZ, podría alcanzar los 9600 bps (que es lo que necesito, nada menos), pero por alguna razón no pude alcanzar los 1200 bps. He leído que los temporizadores son mucho más precisos, así que empecé a buscar en Google y salí con este código de ejemplo para parpadear un LED:
#define _XTAL_FREQ 4000000
// Configuration Bits
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#define LED GP2
#include <xc.h>
unsigned int count = 0;
void interrupt ISR() {
count++; // Interrupt causes count to be incremented by 1
if(count == 18) {
LED = ~LED; // Toggle LED every sec
count = 0;
}
TMR0 = 192; // TMR0 returns to its initial value
INTCONbits.T0IF = 0; // Bit T0IF is cleared so that the interrupt could reoccur
}
void main(void) {
ANSEL = 0;
ADCON0 = 0;
CMCON = 0x07;
VRCON = 0;
TRISIO = 0b111011;
GPIO = 0b000100;
OPTION_REG = 0x07; // Prescaler (1:256) is assigned to the timer TMR0
TMR0 = 192; // Timer T0 counts from 192 to 255
INTCON = 0xA0; // Enable interrupt TMR0 and Global Interrupts
while (1) {
// No code here
}
return;
}
Establecí TMR0 en 192 porque eso es 3/4 de 255, por lo que el LED parpadearía cada cuarto de segundo. Cuando lo programé y lo probé, pude ver el parpadeo del LED varias veces y luego seguir encendido. A veces parpadeaba 10 veces, algunas solo 3 y luego se quedaban. Lo extraño es que se mantiene encendido porque también podría mantenerse apagado. Tal vez tenga algo que ver con el problema. Si pudieras señalarme en cualquier lugar, realmente lo apreciaría.
EDITAR:
Aquí hay una foto de la configuración de PIC. Dejé esa resistencia de 10k de GP4 a tierra porque la estaba usando para otro código ahora que recuerdo. También había un cable proveniente de ese pin que flotaba alrededor.
Tal vez esa resistencia podría haber traído problemas.