animal 0 9 сентября, 2014 Опубликовано 9 сентября, 2014 (изменено) · Жалоба Доброго времени суток, господа! Умудрился заблудиться в трех соснах. Нога 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); } Изменено 9 сентября, 2014 пользователем animal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evc 0 9 сентября, 2014 Опубликовано 9 сентября, 2014 · Жалоба Забыли #pragma config FOSC = INTOSC По умолчанию стоит ECN, если не ошибаюсь. Таким образом RA5 конфигурируется как вход для тактового сигнала. То, что потом переключаете в OSCCON на внутренний осцилятор, не переключает драйвер вывода. Очень интересная конфигурация таймера1. Зачем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
animal 0 9 сентября, 2014 Опубликовано 9 сентября, 2014 · Жалоба evc, спасибо! С каким-то умыслом я эту строку закавычил в коммент. Убей не помню, почему... А с таймер1 это обезьянье тыканье уже, типа "а вдруг заработает". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
animal 0 9 сентября, 2014 Опубликовано 9 сентября, 2014 (изменено) · Жалоба Жаль тему нельзя переименовать в "много глупых вопросов". Следующие вилы возникли с таймером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); } Изменено 9 сентября, 2014 пользователем animal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evc 0 9 сентября, 2014 Опубликовано 9 сентября, 2014 · Жалоба ... Я так понимаю - вы хотите чтоб таймер2 считал до 155. Для этого, у таймера2 есть период-регистр - PR2. Уберите везде где стоит TMR2=100 и просто один раз в начале программы, при инициализации, укажите значение PR2. Прерывание, даже и если наступит, вы увидите это только один раз, да и то если до этого на выводах портаА было что-то отличное от единиц. Лучше замените "LATA = 0b11111111" на "LATA = ~LATA". Посмотрите TRISA. Должен быть 0х00. Ваши вопросы не глупые, вам побольше терпения нужно и во всем разберетесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
animal 0 9 сентября, 2014 Опубликовано 9 сентября, 2014 (изменено) · Жалоба По таймеру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); Заработала! :)) Что тороплюсь - это да... Кажется, что пять строчек трижды уже перепроверил и если не работает, значит что-то неверно понял... А находятся очепятки глупые... Изменено 9 сентября, 2014 пользователем animal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться