#microcontroller #pic
#микроконтроллер #рис
Вопрос:
Я пытался начать работу с PIC12f683, чтобы ознакомиться с семейством микроконтроллеров PIC.
Я подключил его к Pickit 3 и разговариваю со своим компьютером, кажется, что все работает нормально.
Я пробовал различные примеры светодиодных мигалок из Интернета, но независимо от того, какой пример кода я пробую, или что я делаю с регистрами TRISO или GPIO, я получаю вывод только на вывод 2, ни один из других выводов GPIO ничего не сделает.
Говоря электрическим языком… Выводы 1, 4, 6, 7 и 8 подключены к Pickit для ICSP. На выводах 2, 3, 5 и 7 установлены светодиоды с резисторами 220 Ом, идущими от вывода к земле, а контакты 1 и 8 подключены к литий-ионной батарее (~ 3,7 В).
Это код, который я использую в настоящее время.
#define _XTAL_FREQ 8000000
#include <xc.h>
// BEGIN CONFIG
// CONFIG
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/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 // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#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)
#pragma config BOREN = OFF // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
//END CONFIG
int main()
{
TRISIO =0b00000000; //RB0 as Output PIN
GPIO = 0b00111111;
while(1)
{
GP5=1;
GP4=1;
GP0=1;
GP2=1;
__delay_ms(1000);
GP5=0;
GP4=0;
GP0=0;
GP2=0;
__delay_ms(1000);
}
return 0;
}
Я полагаю, что часть конфигурации была сгенерирована MPlab, остальная часть скопирована / изменена из этой инструкции:
https://www.instructables.com/id/How-to-Blink-an-Led-With-PIC16F886 -/
но результаты одинаковы независимо от того, какой пример кода я использую. Я предполагаю, что где-то есть регистровая или конфигурационная переменная, которую я где-то неправильно установил, но я не могу понять это.
Ответ №1:
Вам пришлось переключить свои выходы на цифровые.
int main()
{
TRISIO =0b00000000; //RB0 as Output PIN
ANSEL = 0; // all outputs digital !!!!!
CMCON0 = 0b00000111; //turn Cin Pins as I/O
GPIO = 0b00111111;
while(1)
{
GP5=1;
GP4=1;
GP0=1;
GP2=1;
__delay_ms(1000);
GP5=0;
GP4=0;
GP0=0;
GP2=0;
__delay_ms(1000);
}
return 0;
}
Выходы GP0 … GP4 являются аналоговыми по умолчанию.
И, пожалуйста, помните, что GP3 совместно использует вывод с MCLR, поэтому это вывод только для ввода.
Комментарии:
1. Привет, спасибо! Это исправило контакты 3 и 5. Мне также пришлось отключить компаратор, установив CMCON0 = 0b11111111; чтобы получить вывод на вывод 6. И понимаю, что я никогда не получу никакого вывода на вывод 4, поскольку это вход только GP3 (почему вывод 4 GP3 и вывод 3 GP4 …).
2. (почему вывод 4 GP3 и вывод 3 GP4 …). Вы должны были задать это микросхеме. Я надеюсь, что теперь ваш код работает нормально.
3. Спасибо вам за это. Я сходил с ума, пытаясь выяснить, почему bff GPIO понижал уровень других выводов. Это потому, что по умолчанию они считываются как ноль, поэтому внутреннее чтение, изменение, запись сбиты с толку. Настройка CMCON0 все исправила.