Własny starter Kit dla PIC16F8xx ??

To forum jest dla wszystkich pasjonatów mikrokontrolerów PIC. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C jak i asemblerze.
ODPOWIEDZ

Czy byłbyś zainteresowany małym Tutorialem wprowadzajączym do procesorów PIC12/16/18 ?

Czas głosowania minął 07 lis 2011, 8:36

TAK. Chciałbym poznać te CPU.
3
75%
NIE. Nie czuję potrzeby poznawania tych CPU.
1
25%
 
Liczba głosów: 4

Awatar użytkownika
kayron
Użytkownik
Posty: 2051
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Własny starter Kit dla PIC16F8xx ??

Post autor: kayron » 11 lis 2010, 20:05

Otóż buduje sobie własny starterKit do PIC16F84 oraz PIC16F819 i mam pytanie czy tak można skonstruować obwód RESET, aby programować procesor w układzie. Będę używał PICKit 2 na USB.
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ć :?: Mam nadzieję że te procesory są pozbawione tej ułomności AVRów.
Załączniki
PIC_prog.JPG
Mała poprawka na MCRL / PA5
PIC_prog.JPG (10.96 KiB) Przejrzano 19594 razy
Ostatnio zmieniony 23 paź 2011, 16:37 przez kayron, łącznie zmieniany 2 razy.

Awatar użytkownika
kayron
Użytkownik
Posty: 2051
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 22 paź 2011, 11:04

Mała reanimacja tematu.
Czy ktoś może mi udzielić paru wskazówek.
Ale po kolei mam procesor PIC16F1936, che go włożyć do płytki PICDUINO AVT 1625.
Teoretycznie można go tam włożyć, ale co zrobić z portem RC3 który jest podpięty do masy przez kondensator 100nf? znaczy się jak ustawić ten pin portu, aby uniknąć niespodzianek ? jako wyjście w stanie H, czy jak ?
Drugie pytanie raczej dla wyjadaczy C, a konkretnie to kompilatora HI-TECH. Jak ustawić bity konfiguracyjne makrem

Kod: Zaznacz cały

__CONFIG(x&x&x);
Znaczy sie nie wiem czy dobrze rozumiem jego konstrukcję, bo są dwa rejestry konfigurojace te CPU, czyli należało by to zapisać tak:

Kod: Zaznacz cały

__CONFIG(1,x&x&x);
__CONFIG(2,x&x&x);
Gdzie w obu przypadkach x to parametry z pliku pic16f1936.h
// 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
Przy czym PLL chę na razie wyłączyć, aby nie puścić sobie przypadkiem CPU na 80MHz i go nie ugotować. :oops:

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 22 paź 2011, 21:30

przykład bitów z jednego z moich projektów:

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, );

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 22 paź 2011, 22:07

Co do pinu i kondensatora zobacz co w procesorze użytym na tej płytce jest na tym pinie i już będziesz wiedział dlaczego ten kondensator tam jest i co z nim zrobić, gdy wstawisz swój uC.

Prawdopodobnie jest to pin VUSB i wszystko już jasne ;)

Awatar użytkownika
kayron
Użytkownik
Posty: 2051
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 23 paź 2011, 10:25

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 ? Niby AVT w dokumentacji napisało że można wkładać inne CPU np. PIC18f2320, który też ma tam port I/O, ale nie napisali co z nim zrobić, aby uniknąć niespodzianek.
A po twoim przykładzie użycia __CONFIG widzę że programowałeś dosyć rozbudowane CPU.
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 ?
Jeszcze jedno pytanie, na zdjeciu niżej widać że muj procesor widnieje jako Midrange/1.8V Min Configuration co to oznacza że do programowania musi być zasilany minimum 1,8Volta ? Bo można w nim włączyć LDO Regulator, ale trzeba wtedy poświęcić jeden pin procesora na kondensator filtrujący Low-ESR i wtedy rdzeń zasilany jest 3,6V, a I/O 5V.
Załączniki
PIC_programer.JPG

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 23 paź 2011, 13:39

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 ?
Czyli nie chcesz uwolnić pinu poprzez wylutowanie kondensatora?
To ustaw pin jako wyjście i niezależnie co na nim dasz 1 czy 0 bedzie ok.
Jakie przeładowanie masz na myśli?

kayron pisze:A po twoim przykładzie użycia __CONFIG widzę że programowałeś dosyć rozbudowane CPU.
Ten akurat dotyczy projektu na PIC18F67K90

kayron 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 ?
W każdym datasheet mikrokontrolera jest tabelka z bitami: CONFIGURATION BITS AND DEVICE IDs
U ciebie jest to chyba: CONFIGURATION WORD

Awatar użytkownika
kayron
Użytkownik
Posty: 2051
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 29 paź 2011, 19:15

No cóż powoli notuje postępy :razz:
Udało mi się zrobić efekt z nieustraszonego :mrgreen: Na 4 LEDach z PICKITa nie prezentuje się to jakoś wybitnie, ale krok naprzód zawsze jest jakiś.
Filmik
Teraz mogę opanowywać Timery, aby je zagonić do pracy zamiast delaya.

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);
  }
}
}

Awatar użytkownika
kayron
Użytkownik
Posty: 2051
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 28 gru 2011, 19:45

Może ktoś mi powie czemu taki program nie daje znaku życia od Timera 0 w PICu16F690 ?
Niby wszystko jest zrobione zgodnie notą kat, a nie mam przerwań od T0 ?
Kompilator HITECH.
Ja na razie mam brak pomysłow co robię nie tak, aby dioda na RC mi zaczęła migać w takt przerwań od T0?
Program sie kompiluje bez żadnych Błędów czy Ostrzeżeń.
PS. Dobra rozgryzłem problem, nie skonfigurowałem sobie właściwe CPU w Configuration Bits. I miałem aktywny WDT non stop.
#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(;;)
{
}
}

Awatar użytkownika
kayron
Użytkownik
Posty: 2051
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 08 sty 2012, 19:16

Może mi powiedzieć ktoś dla czego taki zapis:

Kod: Zaznacz cały

TRISA = 0;
TRISA |= (1<<TRISA0);
zamiast oczekiwanej wartości 1 w rejestrze TRISA daje mi 9 ?
Ostatecznie 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

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 10 sty 2012, 18:07

kayron pisze:Może mi powiedzieć ktoś dla czego taki zapis:

Kod: Zaznacz cały

TRISA = 0;
TRISA |= (1<<TRISA0);
zamiast oczekiwanej wartości 1 w rejestrze TRISA daje mi 9 ?
W datasheet pisze dlaczego TRISA3 jest zawsze czytany jako 1.
czytaj: 4.1 PORTA and the TRISA Registers
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
na przykład tak:

Kod: Zaznacz cały

TRISAbits.TRISA3		=	0;

Awatar użytkownika
seg
Użytkownik
Posty: 228
Rejestracja: 17 sie 2005, 1:08
Lokalizacja: PÓŁNOC - POŁUDNIE

Post autor: seg » 15 sty 2012, 10:38

Nie znam C, ale czy tam nie powinno być "&" zamiast "@"?

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 15 sty 2012, 12:55

Nie.

ODPOWIEDZ