Edit
Pozostaje jeszcze kwestia PIC16F819 w którym Pin MCRL może być używany jako port, ale tylko wejściowy, wiec wstawię tam JP1.
Czy PICa można zblokować tak jak AVRy że trzeba specjalny programator aby go odblokować
Kod: Zaznacz cały
__CONFIG(x&x&x);
Kod: Zaznacz cały
__CONFIG(1,x&x&x);
__CONFIG(2,x&x&x);
Przy czym PLL chę na razie wyłączyć, aby nie puścić sobie przypadkiem CPU na 80MHz i go nie ugotować.// Config Register: CONFIG1
#define CONFIG1 0x8007
// Oscillator Selection
// ECH, External Clock, High Power Mode (4-32 MHz): device clock supplied to CLKIN pin
#define FOSC_ECH 0xFFFF
// ECM, External Clock, Medium Power Mode (0.5-4 MHz): device clock supplied to CLKIN pin
#define FOSC_ECM 0xFFFE
// ECL, External Clock, Low Power Mode (0-0.5 MHz): device clock supplied to CLKIN pin
#define FOSC_ECL 0xFFFD
// INTOSC oscillator: I/O function on CLKIN pin
#define FOSC_INTOSC 0xFFFC
// EXTRC oscillator: External RC circuit connected to CLKIN pin
#define FOSC_EXTRC 0xFFFB
// HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins
#define FOSC_HS 0xFFFA
// XT Oscillator, Crystal/resonator connected between OSC1 and OSC2 pins
#define FOSC_XT 0xFFF9
// LP Oscillator, Low-power crystal connected between OSC1 and OSC2 pins
#define FOSC_LP 0xFFF8
// Watchdog Timer Enable
// WDT enabled
#define WDTE_ON 0xFFFF
// WDT enabled while running and disabled in Sleep
#define WDTE_NSLEEP 0xFFF7
// WDT controlled by the SWDTEN bit in the WDTCON register
#define WDTE_SWDTEN 0xFFEF
// WDT disabled
#define WDTE_OFF 0xFFE7
// Power-up Timer Enable
// PWRT disabled
#define PWRTE_OFF 0xFFFF
// PWRT enabled
#define PWRTE_ON 0xFFDF
// MCLR Pin Function Select
// MCLR/VPP pin function is MCLR
#define MCLRE_ON 0xFFFF
// MCLR/VPP pin function is digital input
#define MCLRE_OFF 0xFFBF
// Flash Program Memory Code Protection
// Program memory code protection is disabled
#define CP_OFF 0xFFFF
// Program memory code protection is enabled
#define CP_ON 0xFF7F
// Data Memory Code Protection
// Data memory code protection is disabled
#define CPD_OFF 0xFFFF
// Data memory code protection is enabled
#define CPD_ON 0xFEFF
// Brown-out Reset Enable
// Brown-out Reset enabled
#define BOREN_ON 0xFFFF
// Brown-out Reset enabled while running and disabled in Sleep
#define BOREN_NSLEEP 0xFDFF
// Brown-out Reset controlled by the SBOREN bit in the BORCON register
#define BOREN_SBODEN 0xFBFF
// Brown-out Reset disabled
#define BOREN_OFF 0xF9FF
// Clock Out Enable
// CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin
#define CLKOUTEN_OFF 0xFFFF
// CLKOUT function is enabled on the CLKOUT pin
#define CLKOUTEN_ON 0xF7FF
// Internal/External Switchover
// Internal/External Switchover mode is enabled
#define IESO_ON 0xFFFF
// Internal/External Switchover mode is disabled
#define IESO_OFF 0xEFFF
// Fail-Safe Clock Monitor Enable
// Fail-Safe Clock Monitor is enabled
#define FCMEN_ON 0xFFFF
// Fail-Safe Clock Monitor is disabled
#define FCMEN_OFF 0xDFFF
// Config Register: CONFIG2
#define CONFIG2 0x8008
// Flash Memory Self-Write Protection
// Write protection off
#define WRT_OFF 0xFFFF
// 000h to 1FFh write protected, 200h to 1FFFh may be modified by EECON control
#define WRT_BOOT 0xFFFE
// 000h to FFFh write protected, 1000h to 1FFFh may be modified by EECON control
#define WRT_HALF 0xFFFD
// 000h to 1FFFh write protected, no addresses may be modified by EECON control
#define WRT_ALL 0xFFFC
// PLL Enable
// 4x PLL enabled
#define PLLEN_ON 0xFFFF
// 4x PLL disabled
#define PLLEN_OFF 0xFEFF
// Stack Overflow/Underflow Reset Enable
// Stack Overflow or Underflow will cause a Reset
#define STVREN_ON 0xFFFF
// Stack Overflow or Underflow will not cause a Reset
#define STVREN_OFF 0xFDFF
// Brown-out Reset Voltage Selection
// Brown-out Reset Voltage (VBOR) set to 1.9 V
#define BORV_19 0xFFFF
// Brown-out Reset Voltage (VBOR) set to 2.5 V
#define BORV_25 0xFBFF
// Low-Voltage Programming Enable
// Low-voltage programming enabled
#define LVP_ON 0xFFFF
// High-voltage on MCLR/VPP must be used for programming
#define LVP_OFF 0xDFFF
Kod: Zaznacz cały
// Wersja poprzednia bez PLL
// CONFIG 1
// XINST_OFF Extension instruction disabled
// INTOSCSEL_LOW LF-INTOSC is in Low-Power mode during Sleep
// SOSCSEL_LOW Low-power SOSC circuit is selected
// FOSC_INTIO2 INTIO2 Internal RC oscillator as primary oscyllator
__CONFIG(1, XINST_OFF & INTOSCSEL_LOW & SOSCSEL_LOW & FOSC_INTIO2 );
// CONFIG 2
// WDTEN_OFF WDT is disabled in hardware (Watch Dog)
// BOREN_OFF Brown-out Reset is disabled in hardware and software
// PWRTEN_ON Power-up Timer, start delay 66ms (see 5.6) depends on LF-INTOSC
__CONFIG(2, WDTEN_OFF & BOREN_OFF & PWRTEN_ON); //
// CONFIG 3
// MCLRE_ON MCLR pin is enabled; RG5 input pin is disabled
// RTCOSC_SOSCREF RTCC uses SOSC as a reference clock (RTCC używa zewnętrznego kwarcu)
__CONFIG(3, MCLRE_ON & RTCOSC_SOSCREF);
// CONFIG 4
// BBSIZ_BB1K 1 kW boot block size
__CONFIG(4, BBSIZ_BB1K);
// CONFIG 5
__CONFIG(5, CP0_OFF & CP1_OFF & CP2_OFF & CP3_OFF & CP4_OFF & CP5_OFF & CP6_OFF & CP7_OFF & CPD_OFF & CPB_OFF);
// CONFIG 6
__CONFIG(6, WRT0_OFF & WRT1_OFF & WRT2_OFF & WRT3_OFF & WRT4_OFF & WRT5_OFF & WRT6_OFF & WRT7_OFF & WRTD_OFF & WRTB_OFF);
//__CONFIG(6, );
//__CONFIG(7, );Czyli nie chcesz uwolnić pinu poprzez wylutowanie kondensatora?kayron pisze:To akurat wiem co tam jest VUSB, Tylko że procesor który ja tam chce wstawić na tym pinie ma port RC3, i nie wiem jak go skonfigurować, aby ten kondensator nie stwarzał problemów, czy nie uszkodził CPU przy swoim przeładowaniu ?
Ten akurat dotyczy projektu na PIC18F67K90kayron pisze:A po twoim przykładzie użycia __CONFIG widzę że programowałeś dosyć rozbudowane CPU.
W każdym datasheet mikrokontrolera jest tabelka z bitami: CONFIGURATION BITS AND DEVICE IDskayron pisze:Co do konfiguracji, to gdzieś czytałem, że skasowanie CPU poleceniem ERASE powoduje ustawienie fabrycznych ustawień, a można jakoś je sobie zgrać ? Bo nigdzie w dokumentacji na razie nie znalazłem ustawień domyślnych/fabrycznych tych bitów ?
Kod: Zaznacz cały
#include <htc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
unsigned int i;
unsigned char led;
unsigned char s;
struct{
char kierunek:1;
char znacznik:1;
} bits;
#define kierunek bits.kierunek
#define znacznik bits.znacznik
void main()
{
TRISC = 0b11100000;
led = 1;
PORTC = 15;
__delay_ms(500);
s = led;
znacznik = 0;
kierunek = 0;
for (;;)
{
PORTC = led;
if (znacznik == 0){
if(kierunek == 0)led = 1<<led;
else led = led>>1;
led = led | s;
znacznik = 1;
}
else{
if(kierunek == 0) s = 1<<s;
else s = s>>1;
led = s & led;
znacznik = 0;
}
__delay_ms(25);
if (led == 0)
{
kierunek = !kierunek;
led = 1;
s = 1;
__delay_ms(15);
}
if (led == 16){
kierunek = !kierunek;
__delay_ms(15);
}
}
}#include <htc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif
//Definicje dla obsługi portów I/O;
//UWAGA !!! Port C nie posiada Pull-upów. Jeżeli to konieczne
//nalerzy stosować zewnętrzne rezystory podciągające do VDD.
#define RC TRISC
#define RB TRISB
#define RA TRISA // Rejestr kierunku lini I/O portu A;
//UWAGA !!! RA<3> może pełnić tylko rolę wejścia, jeżeli nie jest przypisane
// jako MCLR (External RESET).
#define Pull_A WPUA // Rejestr Pull_upów portu A;
#define INT_A IOCA // Rejestr aktywacji przerwań od portu A;
// Porty są dodatkowo powiązane z rejestrami ANSEL i ANSELH;
// konfigurujacymi tryby analogowe poszczegulnych pinów MCU;
unsigned char wynik;
unsigned char licz;
void interrupt pomiar(void)
{
if(T0IF == 1)
{
TMR0 = 10;
++licz;
if (licz > 8 )
{
licz = 0;
++wynik;
if(wynik > 15) wynik = 0;
}
PORTC = wynik;
T0IF = 0;
}
}
void main()
{
RA = 0b0000001; //RA0 jako wejście
ANSEL = 1; //analogowe
TRISC = 0b11110000;
//PORTC = 0b00001010;
//__delay_ms(500);
wynik = 1;
PORTC = wynik;
licz = 0;
OPTION_REG = 0b10000111;//ustaw preskaler na 256
TMR0 = 10; // wartośc poczatkowa T0
T0IE = 1;
GIE = 1;
for(;;)
{
}
}
Kod: Zaznacz cały
TRISA = 0;
TRISA |= (1<<TRISA0);
Kod: Zaznacz cały
// Register: TRISA
volatile unsigned char TRISA @ 0x085;
// bit and bitfield definitions
volatile bit TRISA0 @ ((unsigned)&TRISA*8)+0;
volatile bit TRISA1 @ ((unsigned)&TRISA*8)+1;
volatile bit TRISA2 @ ((unsigned)&TRISA*8)+2;
volatile bit TRISA3 @ ((unsigned)&TRISA*8)+3;
volatile bit TRISA4 @ ((unsigned)&TRISA*8)+4;
volatile bit TRISA5 @ ((unsigned)&TRISA*8)+5;
#ifndef _LIB_BUILD
volatile union {
struct {
unsigned TRISA0 : 1;
unsigned TRISA1 : 1;
unsigned TRISA2 : 1;
unsigned TRISA3 : 1;
unsigned TRISA4 : 1;
unsigned TRISA5 : 1;
};
} TRISAbits @ 0x085;
#endif
W datasheet pisze dlaczego TRISA3 jest zawsze czytany jako 1.kayron pisze:Może mi powiedzieć ktoś dla czego taki zapis:zamiast oczekiwanej wartości 1 w rejestrze TRISA daje mi 9 ?Kod: Zaznacz cały
TRISA = 0; TRISA |= (1<<TRISA0);
na przykład tak:kayron pisze:... jak można używać w programie definicji z pliku .h ?
Np. TYCh:Kod: Zaznacz cały
// Register: TRISA volatile unsigned char TRISA @ 0x085; // bit and bitfield definitions volatile bit TRISA0 @ ((unsigned)&TRISA*8)+0; volatile bit TRISA1 @ ((unsigned)&TRISA*8)+1; volatile bit TRISA2 @ ((unsigned)&TRISA*8)+2; volatile bit TRISA3 @ ((unsigned)&TRISA*8)+3; volatile bit TRISA4 @ ((unsigned)&TRISA*8)+4; volatile bit TRISA5 @ ((unsigned)&TRISA*8)+5; #ifndef _LIB_BUILD volatile union { struct { unsigned TRISA0 : 1; unsigned TRISA1 : 1; unsigned TRISA2 : 1; unsigned TRISA3 : 1; unsigned TRISA4 : 1; unsigned TRISA5 : 1; }; } TRISAbits @ 0x085; #endif
Kod: Zaznacz cały
TRISAbits.TRISA3 = 0;