Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
Everest

Rog ajutor comutator on-off cu 8 canale PIC16F628A

Recommended Posts

Va rog cine poate sa ma ajute la urmatorul proiect.

Vreau sa fac un un comutator on-off cu 8 canale in felul urmator:

- la pornire toate ledurile sa fie stinse

- butoanele sunt fara retinere

- primele doua canale sa aiba functia ON-OFF ... la prima apasare sa se aprinda ledul si la a doua apasare sa se stinga ledul.

- celelalte 6 canale sa aiba functia ON doar atunci si cat timp este apasat butonul fiecarui canal ... de exemplu, cand se apasa butonul 5 sa se aprinda ledul 5 si sa stea aprins doar cat timp este tinut apasat butonul .

- toate canalele sa fie independente

 

Posted Image

 

 

Am gasit aici : http://picprojects.org.uk/projects/rela ... /index.htm ceva asemanator dar nu cu functiile pe care le vreau eu.

Exact aceasta schema o folosesc si am realizato in Proteus pentru a proba softul.

Poate este mai usor sa modifice cineva softul de la proiectul acesta.

Atasez arhiva cu schema si proiectul facut in Proteus cu softul de pe site.

 

Multe multumiri.

Share this post


Link to post
Share on other sites

verifica HEX-ul din atasament daca functioneaza si practic, in simulare merge orice. :rade:pin-ul de reset (RA5/MCLR)/VPP) nu obisnuiam sa-l dezactivez, sper sa intre in modul programare.l.e.1: am tesat practic si nu merg RB5, RB6, RB7. Verifica sa vad daca e ceva de la placa de dezvoltare sau din soft.l.e.2: RB6, si RB7 nu functionau din cauza unor jumperi de pe placa (OSC/IO)

PIC16F628A comanda 8 leduri _ 20s.zip

Share this post


Link to post
Share on other sites

verifica HEX-ul din atasament daca functioneaza si practic, in simulare merge orice. :rade: pin-ul de reset (RA5/MCLR)/VPP) nu obisnuiam sa-l dezactivez, sper sa intre in modul programare.l.e.1: am tesat practic si nu merg RB5, RB6, RB7. Verifica sa vad daca e ceva de la placa de dezvoltare sau din soft.

Multe multumiri.Vreau sa experimentez un sistem de supraveghere cu doua camere de filmat si doua motorase ... am niste vecini cam tuciurii si mi-am gasit masina de doua ori zgariata si o data cu un cui intr-un cauciuc.In loc de leduri o sa pun relee.In simulare vad ca functioneaza exact cum am vrut.Astazi nu mai am cand sa probez practic , maine o sa realizez montajul si o sa postez.Daca esti amabil poti te rog sa postezi si asm-ul ? ... poate imi mai trebuie inca un canal sau doua cu comanda on-off.

Share this post


Link to post
Share on other sites

mergea si RB5 problema fiind un jumper ce deconecta pinul RA5 de la tastatura si-l conecta la MCLR-ul programatorului.

Codul in C este foarte simplu si utilizeaza libraria BUTON din mikroC.

 

bit oldstate0, oldstate1, oldstate2, oldstate3, oldstate4, oldstate5, oldstate6, oldstate7;void main() {CMCON = 0x07;PORTA = 0x00;TRISA = 0xFF;PORTB = 0x00;TRISB = 0x00; while(1){    // buton si led 0 - cu retinere    if (Button(&PORTA, 0, 1, 1)) {      oldstate0 = 1;    }    if (oldstate0 && Button(&PORTA, 0, 1, 0)) {   // Detect one-to-zero transition      PORTB.F0 = ~PORTB.F0;      oldstate0 = 0;    }    // buton si led 1 - cu retinere    if (Button(&PORTA, 1, 1, 1)) {      oldstate1 = 1;    }    if (oldstate1 && Button(&PORTA, 1, 1, 0)) {   // Detect one-to-zero transition      PORTB.F1 = ~PORTB.F1;      oldstate1 = 0;    }    // buton si led 2 - momentan    if (Button(&PORTA, 2, 1, 1)) {      oldstate2 = 1;      PORTB.F2 = 0;    }    if (oldstate1 && Button(&PORTA, 2, 1, 0)) {   // Detect one-to-zero transition      PORTB.F2 = 1;      oldstate2 = 0;    }    // buton si led 3 - momentan    if (Button(&PORTA, 3, 1, 1)) {      oldstate3 = 1;      PORTB.F3 = 0;    }    if (oldstate3 && Button(&PORTA, 3, 1, 0)) {   // Detect one-to-zero transition      PORTB.F3 = 1;      oldstate3 = 0;    }    // buton si led 4 - momentan    if (Button(&PORTA, 4, 1, 1)) {      oldstate4 = 1;      PORTB.F4 = 0;    }    if (oldstate4 && Button(&PORTA, 4, 1, 0)) {   // Detect one-to-zero transition      PORTB.F4 = 1;      oldstate4 = 0;    }    // buton si led 5 - momentan    if (Button(&PORTA, 5, 1, 1)) {      oldstate5 = 1;      PORTB.F5 = 0;    }    if (oldstate5 && Button(&PORTA, 5, 1, 0)) {   // Detect one-to-zero transition      PORTB.F5 = 1;      oldstate5 = 0;    }    // buton si led 6 - momentan    if (Button(&PORTA, 6, 1, 1)) {      oldstate6 = 1;      PORTB.F6 = 0;    }    if (oldstate6 && Button(&PORTA, 6, 1, 0)) {   // Detect one-to-zero transition      PORTB.F6 = 1;      oldstate6 = 0;    }    // buton si led 7 - momentan    if (Button(&PORTA, 7, 1, 1)) {      oldstate7 = 1;      PORTB.F7 = 0;    }    if (oldstate7 && Button(&PORTA, 7, 1, 0)) {   // Detect one-to-zero transition      PORTB.F7 = 1;      oldstate7 = 0;    } }}

Share this post


Link to post
Share on other sites

Daca nu abuzez prea mult dn-le Stefan Nicolae, puteti face acelasi soft si pentru varianta cu PIC12F629 cu schema de pe acelasi site ?

 

Posted Image

 

 

Si anume:

1. Un HEX cu softul care sa cuprinda:

- la pornire toate ledurile sa fie stinse

- butoanele sunt fara retinere

- primul canal sa aiba functia ON-OFF

- celelalte 2 canale sa aiba functia ON doar atunci si cat timp este apasat butonul fiecarui canal

 

2. Un HEX cu softul care sa cuprinda:

- la pornire toate ledurile sa fie stinse

- butoanele sunt fara retinere

- toate 3 canalele sa aiba functia ON-OFF

 

3. Un HEX cu softul care sa cuprinda:

- la pornire toate ledurile sa fie stinse

- butoanele sunt fara retinere

- toate 3 canalele sa aiba functia ON doar atunci si cat timp este apasat butonul fiecarui canal

 

Doresc aceste 3 variante de soft pentru a le putea combina in functie de ce idei imi mai vin pe parcursul proiectului.

Atasez arhiva cu schema si proiectul facut in Proteus cu softul de pe site.

 

Multe multumiri.

 

L.E. - poate puteti introduce si PIC12F675 in soft impreuna cu PIC12F629, pentru a folosi acelasi hex pe ambele PIC-uri.

Share this post


Link to post
Share on other sites

Am simulat putin acel hex postat de Stefan, si daca tin apasat butonul RA1, butonul RA2 nu mai lucreaza deloc. Poate nu e mare problema si in realitate nimeni nu va tine apasat butonul, dar asta demonstreaza ca nu sunt tocmai independente canalele.

Asa ca am facut si eu un hex, cu procesarea simultana a tuturor intrarilor. HEX-ul e mult mai mic (cam de 12.5 ori!):

; Comutator 8 canale (2 cu retinere si 6 instantanee); Fosc = 48kHz	radix		dec	processor	16F628A	#include	"p16f628a.inc"					clrf	PORTB		;initializari		bsf	STATUS,RP0		clrf	TRISB		bcf	PCON,3		;setare Fosc=48kHz		bcf	STATUS,RP0		movlw	111b		;dezactivare intrari analogice		movwf	CMCON		;la comparator		clrf	20h		start      movlw 	60		;delay 20ms		addlw 	-1		btfss 	STATUS,Z		goto 	$-2						comf	 PORTA,W		;procesare intrari		movwf	22h		xorwf	20h,W		btfss	STATUS,Z		xorwf	20h,F		movwf	21h				xorwf	PORTB,W		movwf	23h					comf	 22h,W		andwf	21h,W		andlw	11b		xorwf	23h,W		movwf	PORTB		goto	start								org	2007h	dw	10000100010000b		end

New Text document.HEX.txt

Share this post


Link to post
Share on other sites

Am simulat putin acel hex postat de Stefan, si daca tin apasat butonul RA1, butonul RA2 nu mai lucreaza deloc. Poate nu e mare problema si in realitate nimeni nu va tine apasat butonul, dar asta demonstreaza ca nu sunt tocmai independente canalele.Asa ca am facut si eu un hex, cu procesarea simultana a tuturor intrarilor. HEX-ul e mult mai mic (cam de 12.5 ori!):

Multumesc pentru hex .Pe simulator functioneaza perfect, ca si cel postat de Stefan la care n-am intalnit problema enuntata de tine.Poate ma poti ajuta si cu hex-urile pentru PIC12F629/675 pentru comutatorul cu 3 canale postat mai sus. In cursul zilei o sa fac montajul de proba si am sa postez rezultatele.Merci pentru atentie.

Share this post


Link to post
Share on other sites

@10vid: Cod ceva mai optimizat se poate scrie si in C. Mie, cu un compilator total neoptimiza(n)t (picc lite, de la hitech/microchip), cu codul de mai jos (netestat, nesimulat, adica probabil nefunctional) ajung la un fisier de ~ 2.5 ori mai mare ca al tau. Da' cu avantajul (pentru mine) ca-l pot citi mai usor. :rade: Repet, codul e probabil nefunctional, e doar "de comparat":

/*  * File:   main.c * Author: liviu * * Created on February 24, 2013, 11:51 AM */#include <stdio.h>#include <stdlib.h>#include <htc.h>#define _XTAL_FREQ 37000 // 37 kHz__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_ON & LVP_OFF & CPD_OFF & CP_OFF);/* *  */int main(int argc, char** argv) {    unsigned char ucInActual = 0;    unsigned char ucInOld = 0;    unsigned char ucIntrariModificate = 0;    unsigned char ucOutStatus=0;    CMCON = 0x07;    TRISA = 0xFF; //PORTA in    PORTA = 0;    TRISB = 0x00; //PORTB out    PORTB = 0;    OSCF=0; //37 kHz    ucInActual = PORTA;    ucInOld = PORTA;    ucOutStatus = 0;    while (1) //bucla infinita    {        ucInActual = PORTA;  //citeste PORTA        ucIntrariModificate = ucInActual ^ ucInOld;        if(ucIntrariModificate) // starea actuala difera de starea salvata => intrare apasata        {           __delay_ms(20);  //debouncing           ucInActual = PORTA;  //citeste PORTA           ucIntrariModificate = ucInActual ^ ucInOld;           if(ucIntrariModificate) // diferentele persisita           {               ucOutStatus ^= ucIntrariModificate; //comutata iesirile modificate               ucOutStatus &= 0x03; // pastreaza doar iesirile cu retinere               ucOutStatus |= (ucInActual & 0xFC); //pentru 7..2 copiaza starea intrarilor la iesiri               PORTB = ucOutStatus; //"afiseaza"               ucInOld = ucInActual;           }        }    }        return (EXIT_SUCCESS);}
Compilatorul zice ca:

Memory Summary: Program space used 60h ( 96) of 800h words ( 4.7%) Data space used Bh ( 11) of E0h bytes ( 4.9%) EEPROM space used 0h ( 0) of 80h bytes ( 0.0%) Configuration bits used 1h ( 1) of 1h word (100.0%) ID Location space used 0h ( 0) of 4h bytes ( 0.0%)

PS Cum iti ies cei 48 kHz de-i folosesti in program?

testButoane.X.production.hex.txt

Share this post


Link to post
Share on other sites

10vid ai probleme cu simulatorul. codul meu este testat atat in simulare cat si practic, nu are problema enuntata.

E normal ca un cod scris direct in ASM (sfant) sa fie de niste multe ori mai mic ca un cod scris intr-un limbaj de nivel inalt, mai ales daca se folosesc librariile din MikroC (Button, Delay) si codul nu este optimizat.

Codul tau era foarte util cu liniile comentate, poate asa intelegeam cum e cu asamblarea.

ex: "xorwf 20h,W" face sau-exclusiv intre registrul W (probabil starea lui PORTA) si datele din locatia de memorie cu adresa 20h ???

Share this post


Link to post
Share on other sites

Cum iti ies cei 48 kHz de-i folosesti in program?

4MHz sau 48kHz se pot alege setand sau resetand bitul 3 din registrul PCON al 16F628A. Consum mai mic si o rutina delay mai scurta. Chestii socoteli. :somn:

 

Am mai optimizat si eu si am reusit sa mai scot o instructiune. :rade: (25 words)

Am denumit o constanta tip_intrare pentru a putea configura din capul programului care intrari sa fie si care .

 

; Comutator 8 canale; Fosc = 48kHz        radix           dec        processor       16F628A        #include        "p16f628a.inc"        ;************************************************************************#define tip_intrare     00000011b       ;PORTA bit: 7,6,5,4,3,2,1,0     *                                        ;1=cu retinere 0=fara retinere  *;************************************************************************                clrf    PORTB           ;initializari                bsf     STATUS,RP0                clrf    TRISB                bcf     PCON,3          ;setare Fosc=48kHz                bcf     STATUS,RP0                movlw   111b            ;dezactivare intrari analogice                movwf   CMCON           ;la comparator                clrf    20hstart           movlw   60              ;delay 20ms                addlw   -1                btfss   STATUS,Z                goto    $-2		                comf    PORTA,W         ;procesare intrari                movwf   22h                xorwf   20h,W                xorwf   20h,F                movwf   21h		                xorwf   PORTB,W                movwf   23h			                comf    22h,W                andwf   21h,W                andlw   tip_intrare                xorwf   23h,W                movwf   PORTB                goto    start        org     2007h        dw      10000100010000b        end

10vid ai probleme cu simulatorul. codul meu este testat atat in simulare cat si practic, nu are problema enuntata.

M-as mira sa am probleme cu simulatorul tocmai la un program asa "complex" cum e asta.

Poate nu am expus suficient de bine problema: Am apasat biluta rosie de langa butonul "2" astfel butonul ramane apasat si dupa luarea mausului de pe el. Apoi am apasat normal pe butonul "3" si nimic nu se intampla, pentru ca butonul "2" era tot apasat.

Oricum am incercat hexul nou pe care l-ai postat si merge OK.

New text document 2.HEX.txt

Share this post


Link to post
Share on other sites

4MHz sau 48kHz se pot alege setand sau resetand bitul 3 din registrul PCON al 16F628A.

Asa-mi trebuie daca am citit "cartea" gresita. In data-sheetul de la 16F628 (fara A) frecventa aia e de 37 kHz :nebunrau: . Sorry. :jytuiyu

Share this post


Link to post
Share on other sites

Multumesc pentru ajutor lui @10vid si @Stefan Nicolae.

Dupa cum am promis, postez rezultatele.

Butonul 2 nu l-am legat la montaj de aceea nu l-am actionat in videoclip..

 

Posted Image

 

iL0koV55hM8

 

Mai am o rugaminte ... o modificare daca se poate.

As dori ca butonul 2, la apasare sa aprinda ledurilel 2 , 4 si 6 ... si sa fie cu retinere doar 20 secunde.

Si butonul 7 la apasare sa aprinda ledurilel 7 , 3 si 5 ... si sa fie cu retinere doar 20 secunde.

Celelalte butoane raman cum sunt acum.

Share this post


Link to post
Share on other sites

Mai am o rugaminte ... o modificare daca se poate.

As dori ca butonul 2, la apasare sa aprinda ledurilel 2 , 4 si 6 ... si sa fie cu retinere doar 20 secunde.

Si butonul 7 la apasare sa aprinda ledurilel 7 , 3 si 5 ... si sa fie cu retinere doar 20 secunde.

Celelalte butoane raman cum sunt acum.

Nu se poate face asa ?

Vreau ca din cele doua butoane sa pot aduce automat cele 2 motoare la un cap de cursa sau la celalalt.

Motoarele sunt cu reductor.

Share this post


Link to post
Share on other sites

Mai am o rugaminte ... o modificare daca se poate.As dori ca butonul 2, la apasare sa aprinda ledurilel 2 , 4 si 6 ... si sa fie cu retinere doar 20 secunde.Si butonul 7 la apasare sa aprinda ledurilel 7 , 3 si 5 ... si sa fie cu retinere doar 20 secunde.Celelalte butoane raman cum sunt acum.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.