Pic12f683 имеет только цифровой выход на выводе 2 (GP5)

#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 все исправила.