Seppy Postat Iunie 12, 2017 Partajează Postat Iunie 12, 2017 (editat) Buna seara, doresc sa realizez un mic montaj cu un PIC12F675 cu doua intrari si doua iesiri ,care ar trebui sa faca urmatoarele: -la aplicarea unui impuls pe o intrarea 1 sa comute iesirea 1 pe ON -la aplicarea unui impuls pe intrarea 2 sa comute iesirea 1 pe OFF -daca de la aplicarea impulsului pe In 1 pana la sosirea impulsului pe In2 trece mai mult de 90 secunde se activeaza iesirea 2 si dezactiveaza iesirea 1 si ramane in aceasta stare pana la reset . am desenat o mica schema de mana ">http:// Multumesc ! Editat Iunie 12, 2017 de Seppy Link spre comentariu
Elison Postat Iunie 12, 2017 Partajează Postat Iunie 12, 2017 (editat) 12F675.rar Ai in atasament schema, hex, configurare.Sa ai grija, cand scrii hexul, sa nu pierzi valorile pentru osccal. Editat Iunie 12, 2017 de Elison Link spre comentariu
mars01 Postat Iunie 12, 2017 Partajează Postat Iunie 12, 2017 (editat) Salut! compilator mikroC for PIC 7.1.0 arhiva contine proiect mikroC (inclusiv fisier .HEX) si simulare Proteus 8.6 SP3 #define IN1 GP5_bit #define IN2 GP4_bit #define OUT1 GP0_bit #define OUT2 GP1_bit #define OFF 0 #define ON 1 #define INPUT 1 #define OUTPUT 0 #define APASAT 0 #define NEAPASAT 1 unsigned char old_IN1 = NEAPASAT; unsigned char old_IN2 = NEAPASAT; volatile unsigned int counter = 0; void initializare() { ADON_bit = 0; // ADC OFF ANSEL = 0; // GPIO is digital I/O CMCON = 7; // Comparator disabled TRISIO5_bit = INPUT; TRISIO4_bit = INPUT; TRISIO0_bit = OUTPUT; TRISIO1_bit = OUTPUT; OUT1 = OFF; OUT2 = OFF; WPU5_bit = 1; // pull-up resistor ON WPU4_bit = 1; // pull-up resistor ON //Timer1 //Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 100 ms T1CON = 0x11; TMR1IF_bit = 0; // clear TMR1 Interrupt flag TMR1H = 0x3C; // preload TMR counters TMR1L = 0xB0; } void Interrupt(){ if (TMR1IF_bit && TMR1IE_bit) { TMR1IF_bit = 0; TMR1H = 0x3C; TMR1L = 0xB0; if (counter == 900) // 900 * 100ms = 90000ms = 90sec { counter = 0; OUT2 = ON; OUT1 = OFF; GIE_bit = 0; // disable global interrupts while(1); // stai in bucla pana la RESET } else { counter++; } } } void main() { initializare(); while(1) { if (IN1 == APASAT) { delay_ms(10); if ((IN1 == APASAT) && (old_IN1 == NEAPASAT)) { OUT1 = ON; TMR1IE_bit = 1; // enable TMR1 PEIE_bit = 1; GIE_bit = 1; // enable global interrupts } } old_IN1 = IN1; if (IN2 == APASAT) { delay_ms(10); if ((IN2 == APASAT) && (old_IN2 == NEAPASAT)) { OUT1 = OFF; counter = 0; TMR1IE_bit = 0; // disable TMR1 GIE_bit = 0; // disable global interrupts } } old_IN2 = IN2; } } protectie_seppy.zip Editat Iunie 12, 2017 de mars01 Link spre comentariu
Seppy Postat Iunie 13, 2017 Autor Partajează Postat Iunie 13, 2017 Multumesc mult , cand ajung acasa de la servici programez PIC-ul si fac montajul . O zi buna sa aveti ! Link spre comentariu
Seppy Postat Iunie 13, 2017 Autor Partajează Postat Iunie 13, 2017 Buna ziua , am incercat varianta lui mars01 si merge exact cum am dorit , o sa incerc si varianta lui Elison ,( dupa schema data functioneaza cu impuls pozitiv ), oricum gasesc aplicatie si pentru varianta asta Multumesc mult D-lui Elison si mars01 pentru ajutor ! Link spre comentariu
mars01 Postat Iunie 14, 2017 Partajează Postat Iunie 14, 2017 (editat) Ca si un exemplu util, am modificat programul astfel incat sa fie usor portabil pentru alt compilator C pentru controlore pe 8bit sau de ce nu, pentru alt controler PIC. Tot ce trebuie modificat sunt #define-urile de la inceput ca sa corespunda pentru nou controler/compilator. Aceasta se face cu datasheet-ul in brate. // #defines for the key words #define IN1 GP5_bit #define IN2 GP4_bit #define RELEU GP0_bit #define ERROR GP1_bit #define ADON_BIT ADON_bit #define ANSEL_REG ANSEL #define CMCON_REG CMCON #define IN1_DIR TRISIO5_bit #define IN2_DIR TRISIO4_bit #define RELEU_DIR TRISIO0_bit #define ERROR_DIR TRISIO1_bit #define PULLUP_IN1 WPU5_bit #define PULLUP_IN2 WPU4_bit #define TMR_CONTROL_REG T1CON #define TMR_IF_BIT TMR1IF_bit #define TMR_ON_OFF_BIT TMR1IE_bit #define TMR_HIGH_REG TMR1H #define TMR_LOW_REG TMR1L #define INT_ENABLE_BIT GIE_bit #define PERIF_INT_ENABLE_BIT PEIE_bit #define ISR() Interrupt() #define delay_ms(x) delay_ms(x) // verificati daca compilatorul are functie de delay si daca da care este numele // end for defines of the keywords #define OFF 0 #define ON 1 #define INPUT 1 #define OUTPUT 0 #define APASAT 0 #define NEAPASAT 1 unsigned char old_IN1 = NEAPASAT; unsigned char old_IN2 = NEAPASAT; volatile unsigned int counter = 0; void initializare() { ADON_BIT = OFF; // ADC OFF ANSEL_REG = OFF; // GPIO is digital I/O CMCON_REG = 7; // Comparator disabled IN1_DIR = INPUT; IN2_DIR = INPUT; RELEU_DIR = OUTPUT; ERROR_DIR = OUTPUT; RELEU = OFF; ERROR = OFF; PULLUP_IN1 = ON; // pull-up resistor ON PULLUP_IN2 = ON; // pull-up resistor ON //Timer1 //Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 100 ms TMR_CONTROL_REG = 0x11; TMR_IF_BIT = OFF; // clear TMR1 Interrupt flag TMR_HIGH_REG = 0x3C; // preload TMR counters TMR_LOW_REG = 0xB0; } void ISR() { if (TMR_IF_BIT && TMR_ON_OFF_BIT) { TMR_IF_BIT = OFF; TMR_HIGH_REG = 0x3C; TMR_LOW_REG = 0xB0; if (counter == 900) // 900 * 100ms = 90000ms = 90sec { INT_ENABLE_BIT = OFF; // disable global interrupts counter = 0; ERROR = ON; RELEU = OFF; while(1); // stai in bucla pana la RESET } else { counter++; } } } void main() { initializare(); while(1) { if (IN1 == APASAT) { delay_ms(10); if ((IN1 == APASAT) && (old_IN1 == NEAPASAT)) { RELEU = ON; TMR_ON_OFF_BIT = ON; // enable TMR1 PERIF_INT_ENABLE_BIT = ON; // enable peripheral interrupts INT_ENABLE_BIT = ON; // enable global interrupts } } old_IN1 = IN1; if (IN2 == APASAT) { delay_ms(10); if ((IN2 == APASAT) && (old_IN2 == NEAPASAT)) { TMR_ON_OFF_BIT = OFF; // disable TMR1 INT_ENABLE_BIT = OFF; // disable global interrupts TMR_HIGH_REG = 0x3C; TMR_LOW_REG = 0xB0; RELEU = OFF; counter = 0; } } old_IN2 = IN2; } } LE: Si fiindca este vorba de protectie am activat watchdog-ul astfel incat in caz de interferente si blocare sa se autoreseteze. Atasat este proiectul mikroC for PIC 7.1.0 cu watchdog activat. // #defines for the key words #define IN1 GP5_bit #define IN2 GP4_bit #define RELEU GP0_bit #define ERROR GP1_bit #define ADON_BIT ADON_bit #define ANSEL_REG ANSEL #define CMCON_REG CMCON #define IN1_DIR TRISIO5_bit #define IN2_DIR TRISIO4_bit #define RELEU_DIR TRISIO0_bit #define ERROR_DIR TRISIO1_bit #define PULLUP_IN1 WPU5_bit #define PULLUP_IN2 WPU4_bit #define TMR_CONTROL_REG T1CON #define TMR_IF_BIT TMR1IF_bit #define TMR_ON_OFF_BIT TMR1IE_bit #define TMR_HIGH_REG TMR1H #define TMR_LOW_REG TMR1L #define INT_ENABLE_BIT GIE_bit #define PERIF_INT_ENABLE_BIT PEIE_bit #define ISR() Interrupt() #define delay_ms(x) delay_ms(x) // verificati daca compilatorul are functie de delay si daca da care este numele #define WDOG_PRESCALER_BIT PSA_bit #define PRESCALER_BIT2 PS2_bit #define PRESCALER_BIT1 PS1_bit #define PRESCALER_BIT0 PS0_bit // end for defines of the keywords #define OFF 0 #define ON 1 #define INPUT 1 #define OUTPUT 0 #define APASAT 0 #define NEAPASAT 1 unsigned char old_IN1 = NEAPASAT; unsigned char old_IN2 = NEAPASAT; volatile unsigned int counter = 0; void initializare() { ADON_BIT = OFF; // ADC OFF ANSEL_REG = OFF; // GPIO is digital I/O CMCON_REG = 7; // Comparator disabled // watchdog timeout is at 18ms * 4(from prescaler) = 72ms PRESCALER_BIT2 = 0; PRESCALER_BIT1 = 1; PRESCALER_BIT0 = 0; WDOG_PRESCALER_BIT = ON; // Prescaler asignat catre WATCHDOG IN1_DIR = INPUT; IN2_DIR = INPUT; RELEU_DIR = OUTPUT; ERROR_DIR = OUTPUT; RELEU = OFF; ERROR = OFF; PULLUP_IN1 = ON; // pull-up resistor ON PULLUP_IN2 = ON; // pull-up resistor ON //Timer1 //Prescaler 1:2; TMR1 Preload = 15536; Actual Interrupt Time : 100 ms TMR_CONTROL_REG = 0x11; TMR_IF_BIT = 0; // clear TMR1 Interrupt flag TMR_HIGH_REG = 0x3C; // preload TMR counters TMR_LOW_REG = 0xB0; asm CLRWDT; } void ISR() { if (TMR_IF_BIT && TMR_ON_OFF_BIT) { TMR_IF_BIT = 0; asm CLRWDT; TMR_HIGH_REG = 0x3C; TMR_LOW_REG = 0xB0; if (counter == 900) // 900 * 100ms = 90000ms = 90sec { INT_ENABLE_BIT = OFF; // disable global interrupts counter = 0; ERROR = ON; RELEU = OFF; while(1) // stai in bucla pana la RESET { asm CLRWDT; } } else { counter++; } } } void main() { asm CLRWDT; // clear watchdog (adica da-i peste bot sa nu latre) initializare(); while(1) { if (IN1 == APASAT) { delay_ms(10); if ((IN1 == APASAT) && (old_IN1 == NEAPASAT)) { asm CLRWDT; RELEU = ON; TMR_ON_OFF_BIT = ON; // enable TMR1 PERIF_INT_ENABLE_BIT = ON; // enable peripheral interrupts INT_ENABLE_BIT = ON; // enable global interrupts } } old_IN1 = IN1; asm CLRWDT; if (IN2 == APASAT) { delay_ms(10); if ((IN2 == APASAT) && (old_IN2 == NEAPASAT)) { asm CLRWDT; TMR_ON_OFF_BIT = OFF; // disable TMR1 INT_ENABLE_BIT = OFF; // disable global interrupts TMR_HIGH_REG = 0x3C; TMR_LOW_REG = 0xB0; RELEU = OFF; counter = 0; } } old_IN2 = IN2; asm CLRWDT; } } protectie_seppy.rar Editat Iunie 14, 2017 de mars01 Link spre comentariu
Liviu M Postat Iunie 14, 2017 Partajează Postat Iunie 14, 2017 La mine o configuratie "multi-pic" arata cam asa: #if defined(_PIC18F14K50_H_) #define LN_FIFO_LEN 100 #define LN_COMMAND_MAX_NR LN_FIFO_LEN/2 #define LN_MAX_NR_REC_MESS 10 #define SENSORS_PORT PORTC #define SENSORS_TRIS TRISC #define SENSORS_LAT LATC #define NR_OF_PORTS 8 #elif defined(_PIC18F13K50_H_) #define LN_FIFO_LEN 50 #define LN_COMMAND_MAX_NR LN_FIFO_LEN/2 #define LN_MAX_NR_REC_MESS 5 #define SENSORS_PORT PORTC #define SENSORS_TRIS TRISC #define SENSORS_LAT LATC #define NR_OF_PORTS 8 #elif defined(_PIC16F877_H_) || defined(_PIC16F877A_H_) #define LN_FIFO_LEN 6 #define LN_COMMAND_MAX_NR 3 //LN_FIFO_LEN/2 #define LN_MAX_NR_REC_MESS 2 #define SENSORS_PORT PORTD #define SENSORS_TRIS TRISD #define SENSORS_PORT2 PORTB #define SENSORS_TRIS2 TRISB #define NR_OF_PORTS 16 #elif defined(_PIC18F452_H_) #define LN_FIFO_LEN 100 #define LN_COMMAND_MAX_NR LN_FIFO_LEN/2 #define LN_MAX_NR_REC_MESS 10 #define SENSORS_PORT PORTD #define SENSORS_TRIS TRISD #define SENSORS_LAT LATD #define SENSORS_PORT2 PORTB #define SENSORS_TRIS2 TRISB #define SENSORS_LAT2 LATB #define NR_OF_PORTS 8 #endif Link spre comentariu
mars01 Postat Iunie 14, 2017 Partajează Postat Iunie 14, 2017 Pentru cateva controlere merge. Dar altfel Microchip are o gramada de controlere pe 8bit si nu e fezabil sa faci un carnat de #if defined. Link spre comentariu
Liviu M Postat Iunie 14, 2017 Partajează Postat Iunie 14, 2017 (editat) Pai n-am facut pentru tot ce produce uChip, clar, ci pentru controllerele care ma interesau pe mine (ce am prin sertare si n-ar strica sa se consume ). Editat Iunie 14, 2017 de Liviu M Link spre comentariu
Seppy Postat Iunie 14, 2017 Autor Partajează Postat Iunie 14, 2017 Multumesc , am incercat si varianta asta cu watchdog si functioneaza bine ,Aceasta varianta de program o sa ramana in microcontroller definitiv , acum proiectez cablajul Link spre comentariu
jeltopop pop Postat Iunie 14, 2017 Partajează Postat Iunie 14, 2017 mars01, in versiunea cu 'latrat', mai aveai putin si puneai "asm CLRWDT;" dupa fiecare instructiune. Daca watchdog este la 72ms iar tu ai 2 x 10ms debounce in while(1), pentru ce atata CLRWDT ? Link spre comentariu
Liviu M Postat Iunie 14, 2017 Partajează Postat Iunie 14, 2017 E grav/important? Link spre comentariu
jeltopop pop Postat Iunie 14, 2017 Partajează Postat Iunie 14, 2017 E grav/important? Nu e logic. Link spre comentariu
Liviu M Postat Iunie 14, 2017 Partajează Postat Iunie 14, 2017 (editat) Ah, am mai avut un coleg care se impiedica de orice virgula in programele altora. Problema e ca avea de criticat in programele (functionale ale) altora, dar programele lui nu le-a vazut nimeni. E un forum (destul de) liber. Ai voie sa postezi si variantele tale super logice alaturi de cele mai putin logice. Editat Iunie 14, 2017 de Liviu M Link spre comentariu
mars01 Postat Iunie 14, 2017 Partajează Postat Iunie 14, 2017 (editat) jeltopop, cand adaug instructiunea de reset a watchdog-ului in program fac cam cum fac cand pun sare in ciorba: le presar .... un praf aici, unu' acolo. Miam... ce-mi place sarea-n bucate .... Editat Iunie 14, 2017 de mars01 Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum