Estoy usando un PIC12F675 para un proyecto, y todo funciona bien, excepto una cosa. GP4 no funciona como IO digital. He mirado mucho las configuraciones y el código, pero no pude encontrar nada.
Config:
#pragma config FOSC = INTRCCLK
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = OFF
#pragma config BOREN = ON
#pragma config CP = OFF
#pragma config CPD = OFF
Código:
#include <xc.h>
#include <math.h>
#include "config.h"
#define _XTAL_FREQ 4000000
void delay(unsigned int freq){
for(int i = 0; i < (int)freq; i++){
__delay_ms(1);
}
}
void dClock(unsigned int freq){
GPIO1 = 1;
delay(freq);
GPIO1 = 0;
delay(freq);
}
void InitADC(){
ANSEL = 0x11;
ADCON0 = 0b10000001;
CMCON = 0x7;
VRCON = 0;
}
unsigned int GetADCValue(){
ADCON0 = 0b10000011;
while(GO_nDONE);
return (ADRESH << 8) + ADRESL;
}
void main(void) {
TRISIO0 = 1; //analog input
TRISIO1 = 0; //output
TRISIO2 = 0; //indication
TRISIO3 = 1; //mode
TRISIO4 = 0; //halt
TRISIO5 = 1; //pulse_button
char pressed = 0;
GPIO1 = 0;
InitADC();
while(1){
if(GPIO4 == 0){
if(GPIO3 == 0){
GPIO2 = 1;
unsigned int freq = GetADCValue();
dClock(freq);
}
else{
GPIO2 = 0;
if(GPIO5 == 1 && pressed == 0){
GPIO1 = 1;
__delay_ms(50);
GPIO1 = 0;
pressed = 1;
}
else if(GPIO5 == 0 && pressed == 1){
pressed = 0;
}
}
}
}
return;
}
pic
c
embedded
programming
audio
oscillator
spark
dc-dc-converter
boost
charge-pump
eagle
analog
battery-charging
failure
humidity
hard-drive
power-supply
battery-charging
charger
solar-energy
solar-charge-controller
pcb
eagle
arduino
voltage
power-supply
usb
charger
power-delivery
resistors
led-strip
series
usb
bootloader
transceiver
digital-logic
integrated-circuit
ram
transistors
led
raspberry-pi
driver
altium
usb
transceiver
piezoelectricity
adc
psoc
arduino
analog
pwm
raspberry-pi
converter
transformer
switch-mode-power-supply
power-electronics
dc-dc-converter
phase-shift
analog
comparator
phototransistor
safety
grounding
current
circuit-protection
rcd
batteries
current
battery-operated
power-consumption
power-electronics
bridge-rectifier
full-bridge
ethernet
resistance
mosfet
ltspice
mosfet-driver
ftdi
synchronous
fifo
microcontroller
avr
atmega
atmega328p
verilog
error
modelsim
power-supply
solar-cell
usb-pd
i2c
uart
Ali Abo Shady
fuente
fuente
#pragma config FOSC = INTRCCLK
dice al PIC que muestre su reloj en GP4? ¿No hay unaFOSC
opción diferente que debería estar usando?Respuestas:
Solo para agregar a la respuesta correcta de Spehro:
Dado que el microcontrolador que está utilizando tiene solo 8 pines, necesariamente deben compartir la funcionalidad para proporcionar las diversas funciones que el dispositivo es capaz de hacer.
Solo quería proporcionar una especie de "hoja de ruta" para ayudar a explicar cómo funciona la configuración.
Consulte el diagrama de función del pin en la hoja de datos de la página 2:
Notarás que el pin físico 3 tiene al menos cinco funciones: GP4, AN3,! T1G, OSC2 y CLKOUT. A veces tiene que especificar en la configuración qué función debe tener el pin. Definitivamente no siempre está claro. Me resulta útil buscar referencias en la hoja de datos para la función de registro o pin con la que tengo problemas.
Aquí hay un extracto de la página 52 en el que se encontró GP4:
Los microcontroladores a menudo pueden operar utilizando un oscilador interno si tienen uno, o desde un oscilador externo como un cristal. Aún más, pueden conectar su oscilador interno a un pin para sincronizar otros dispositivos. El registro de configuración aquí tiene tres bits (
FOSC
) que determinan cómo se configura esto.Si observa los dos modos enumerados con valores
101
y100
, ambos especifican el uso del oscilador interno, pero una de las opciones conecta GP4 al reloj, donde el otro mantiene su función como GPIO.Las constantes definidas
INTRCCLK
yINTRCIO
Spehro mencionadas deben reflejar estos valores.fuente
Ha configurado el PIC para emitir la señal de reloj interna en GP4 usando
Reemplace INTRCCLK con INTRCIO.
fuente