Estou usando um PIC12F675 para um projeto e tudo funciona bem, exceto uma coisa. GP4 não funciona como E / S digital. Eu olhei muito as configurações e o código, mas não consegui 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
fonte
fonte
#pragma config FOSC = INTRCCLK
diz ao PIC para emitir seu relógio no GP4? Não existe umaFOSC
opção diferente que você deva usar?Respostas:
Apenas para adicionar à resposta correta de Spehro:
Como o microcontrolador que você está usando possui apenas 8 pinos, eles necessariamente precisam compartilhar a funcionalidade para fornecer os vários recursos de que o dispositivo é capaz.
Eu só queria fornecer uma espécie de "roteiro" para ajudar a explicar como a configuração funciona.
Confira o diagrama de funções dos pinos na página 2 da folha de dados :
Você notará que o pino físico 3 tem pelo menos cinco funções: GP4, AN3,! T1G, OSC2 e CLKOUT. Às vezes, você precisa especificar na configuração qual função o pino deve ter. Definitivamente, nem sempre é claro. Acho útil pesquisar na folha de dados por referências ao registro ou à função de pinos com os quais estou tendo problemas.
Aqui está um trecho da página 52, no qual o GP4 foi encontrado:
Os microcontroladores muitas vezes podem operar usando um oscilador interno, se houver, ou a partir de um oscilador externo, como um cristal. Ainda mais, eles podem conectar seu oscilador interno a um pino para sincronizar outros dispositivos. O registro de configuração aqui possui três bits (
FOSC
) que determinam como isso é configurado.Se você observar os dois modos listados com valores
101
e100
, ambos especificam o uso do oscilador interno, mas uma das opções conecta o GP4 ao relógio, onde o outro mantém sua função como GPIO.As constantes definidas
INTRCCLK
eINTRCIO
Spehro mencionadas devem refletir esses valores.fonte
Você configurou o PIC para emitir o sinal do relógio interno no GP4 usando
Substitua INTRCCLK por INTRCIO.
fonte