Перейти к содержанию
    

RA5 PIC12F1822

Доброго времени суток, господа! Умудрился заблудиться в трех соснах. Нога RA5 ведет себя как вход. Остальные ноги работают нормально. Что забыл отключить? Пните, плиз в нужном направлении. Компилятор XC8.

#include <xc.h>
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config STVREN = OFF      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)

#define _XTAL_FREQ 16000000
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

void initial(void)
{
    GIE=0;  //global interrupts ^^
    OSCCON = 0b01111010;        // Internal OSC 16MHz
    ANSELA=0b00000000; // 

    T1GCON=0b00000000;
    T1CON=0b00000100;                   // Timer1 clock Fosc,Prescaler 1:1,
                                                      // LP oscillator disable, TMR1 stop
    PORTA=0x00;
    LATA=0x00;
    TRISA=0b00000000;
    ADCON0=0b00000000;
    CCP1CON=0b00000000; // 
    SSP1CON1=0b00000000; //
} // initial()

void main(void)
{   initial();
    do{
        LATA=0b11111111;
        __delay_ms(1);
        LATA=0b00000000;
        __delay_ms(1);
    }while(1);
}

Изменено пользователем animal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забыли #pragma config FOSC = INTOSC

По умолчанию стоит ECN, если не ошибаюсь. Таким образом RA5 конфигурируется как вход для тактового сигнала. То, что потом переключаете в OSCCON на внутренний осцилятор,

не переключает драйвер вывода.

Очень интересная конфигурация таймера1. Зачем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

evc, спасибо! С каким-то умыслом я эту строку закавычил в коммент. Убей не помню, почему... А с таймер1 это обезьянье тыканье уже, типа "а вдруг заработает".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Жаль тему нельзя переименовать в "много глупых вопросов". Следующие вилы возникли с таймером2. Почему-то не наступает прерывание. :(

void interrupt isr(void)
{  
    if (TMR2IF)
    {   LATA=0b11111111;
        TMR2=100;
       TMR2IF=0;
    }
}
void main (void)
{
TMR2=100;   
T2CON=00000100; // tmr2 on, prescaler 1:1, postscaler 1:1
TMR2IF=0; //interrupt tmr2 clear
TMR2IE=1;
GIE=1;  //global interrupts ^^
PEIE=1;
do{}while(1);
}

Изменено пользователем animal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

 

Я так понимаю - вы хотите чтоб таймер2 считал до 155. Для этого, у таймера2 есть период-регистр - PR2.

Уберите везде где стоит TMR2=100 и просто один раз в начале программы, при инициализации, укажите значение PR2.

Прерывание, даже и если наступит, вы увидите это только один раз, да и то если до этого на выводах портаА

было что-то отличное от единиц. Лучше замените "LATA = 0b11111111" на "LATA = ~LATA". Посмотрите TRISA. Должен быть 0х00.

Ваши вопросы не глупые, вам побольше терпения нужно и во всем разберетесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По таймеру2, там оказалась тоже банальная описка: у T2CON= упущено "0b". Так-то у меня PWM не заработал, вот я и разбираю его по частям. :)

К чему пришел по поводу PWM:

PORTA=0x00;
LATA=0x00;
TRISA=0b00000000;
PR2=0xFF; //PWM
CCPR1L=100;   // duty=
CCP1CON=0b00001100;   // active high

TMR2=0;   
T2CON=0b00000100; // tmr2 on, prescaler 1:1, postscaler 1:1
TMR2IF=0; //interrupt tmr2 clear
TMR2IE=1;
PEIE=1;
GIE=1;  //global interrupts ^^
do{}while(1);

Заработала! :))

Что тороплюсь - это да... Кажется, что пять строчек трижды уже перепроверил и если не работает, значит что-то неверно понял... А находятся очепятки глупые...

Изменено пользователем animal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...