Everest Postat Februarie 23, 2013 Partajează Postat Februarie 23, 2013 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 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. Link spre comentariu
Stefan Postat Februarie 23, 2013 Partajează Postat Februarie 23, 2013 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 Link spre comentariu
Everest Postat Februarie 23, 2013 Autor Partajează Postat Februarie 23, 2013 verifica HEX-ul din atasament daca functioneaza si practic, in simulare merge orice. 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. Link spre comentariu
Stefan Postat Februarie 23, 2013 Partajează Postat Februarie 23, 2013 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; } }} Link spre comentariu
Everest Postat Februarie 23, 2013 Autor Partajează Postat Februarie 23, 2013 Daca nu abuzez prea mult dn-le Stefan Nicolae, puteti face acelasi soft si pentru varianta cu PIC12F629 cu schema de pe acelasi site ? 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. Link spre comentariu
10vid Postat Februarie 24, 2013 Partajează Postat Februarie 24, 2013 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 Link spre comentariu
Everest Postat Februarie 24, 2013 Autor Partajează Postat Februarie 24, 2013 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. Link spre comentariu
Liviu M Postat Februarie 24, 2013 Partajează Postat Februarie 24, 2013 @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. 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 Link spre comentariu
Stefan Postat Februarie 24, 2013 Partajează Postat Februarie 24, 2013 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 ??? Link spre comentariu
Stefan Postat Februarie 24, 2013 Partajează Postat Februarie 24, 2013 a expirta timnpul pentru editarea mesajului anterior.atasez varianta usor imbunatatita (hex mai mic) a versiunii cu 16F628 si 3 versiuni cu 12F629 12F629@1MHz_1-retinere_2-3-momentan.zip 12F629@1MHz_1-2-3-retinere.zip 12F629@1MHz_1-2-3-momentan.zip Link spre comentariu
10vid Postat Februarie 24, 2013 Partajează Postat Februarie 24, 2013 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. Am mai optimizat si eu si am reusit sa mai scot o instructiune. (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 Link spre comentariu
Liviu M Postat Februarie 25, 2013 Partajează Postat Februarie 25, 2013 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 . Sorry. Link spre comentariu
Everest Postat Februarie 25, 2013 Autor Partajează Postat Februarie 25, 2013 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.. 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. Link spre comentariu
Everest Postat Februarie 27, 2013 Autor Partajează Postat Februarie 27, 2013 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. Link spre comentariu
Everest Postat Martie 9, 2013 Autor Partajează Postat Martie 9, 2013 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. 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