ovydiub Postat Martie 19, 2009 Partajează Postat Martie 19, 2009 Cum pot modifica textul astfel ca ledul de la RB3 sa stea aprins pana la o noua apasare a butonului cand sa se stinga si la o noua apare sa se aprinda ............. Acum sta aprins cat e apasat butonul#include #define LED RB3#define BUTON RB2void main(void) { TRISB=0b00000100; for(;;) { if(BUTON==0) //daca butonul e apasat LED=0; //aprinde ledul else //altfel LED=1; //ledul sta stins }} Link spre comentariu
Bamse Postat Martie 19, 2009 Partajează Postat Martie 19, 2009 . Sal.. ! in Basic suna cel mai simplu cam asa: Device = 16F84A XTAL 4 Symbol led As PORTB.1 'portu Ledului Symbol buton As PORTB.2 ' port butonstart: If buton = 1 Then Toggle led 'schimba starea port DelayMS 100 'intarziere buton = 0GoTo start trebuie sa fie si in C o comanda de genu TOGGLE nu uita sa "tragi" portu la masa cu un rezistor daca dai comanda pe logic 1 si la plus daca dai pe logic 0 R=1k aproximativ..din manual de BasicSyntaxTOGGLE Port.BitOverviewSets a pin to output mode and reverses the output state of the pin, changing 0 to 1 and 1 to 0.OperatorsPort.Bit - any valid Port and Bit combination. Link spre comentariu
Liviu M Postat Martie 21, 2009 Partajează Postat Martie 21, 2009 Mie imi iese ca mai jos, da' eu sunt un programator cam slab: void main(void){unsigned char ucIdx; //numarator apasari butonTRISB=0b00000100;for(;;){ if(BUTON==0) //daca butonul e apasat { DelayMs(100); //debouncing soft - functiile DelayUs() si DelayMs() vin cu picclite (cred ca asta folosesti, nu?) if(BUTON==0) //daca butonul e in continuare apasat { if(ucIdx == 255) // unsigned char are 8 biti; ucIdx=0; else ucIdx++; } } if(ucIdx % 2) // ucIdx nu se divide cu 2 (apasari impare ale butonului) LED=0; //aprinde ledul else //altfel LED=1; //ledul sta stins DelayMs(250); //asta asa, sa ne tragem sufletul }} Link spre comentariu
Bamse Postat Martie 22, 2009 Partajează Postat Martie 22, 2009 Sal !!!... foarte interesant . Se mai poate si incrementand o variabila la fiecare apasare de butonsi sa citesti ultimul bit din octetul variabilei0=000000001=000000012=000000103=00000011................; dar sa lasam pe ovydiub sa dea o veste Link spre comentariu
Liviu M Postat Martie 22, 2009 Partajează Postat Martie 22, 2009 Hehe, era prea simplu, nu mi-a trecut prin cap Ce am scris eu face acelasi lucru, da' cred ca dpdv al PIC-ului e mult mai eleganta varianta ta (cod mai compact). Link spre comentariu
ovydiub Postat Martie 23, 2009 Autor Partajează Postat Martie 23, 2009 Multumesc pentru raspunsuri, pana nu am definit delayUs si DelayMs cum am vazut in alt exemplu nu a mers compilarea, folosesc PICCLITE si Mplab, nu stiu daca este corecta definitia pentru "delayMs" fisieru din care am luat-o era pentu Q de 20MHz si eu am de 4MHz, am modificat valoarea delayUs din 250 in 50, e corect? nu ma pricep la C si nici programare, dar vreau sa invat. O seara placuta#include #define WaitFor1Us asm("nop"); asm("nop")#define Jumpback asm("goto $ - 3")unsigned char delayus_variable;//maxim 255 us#define DelayUs(x) { \ delayus_variable=(unsigned char)x; \ WaitFor1Us; } \ asm("decfsz _delayus_variable,f"); \ Jumpback;//maxim 255 msvoid DelayMs(unsigned char cnt){ unsigned char i; do { i = 4; do { DelayUs(50); } while(--i); } while(--cnt);}#define LED RB3#define BUTON RB2void main(void){unsigned char ucIdx; //numarator apasari butonTRISB=0b00000100;for(;;) { if(BUTON==0) //daca butonul e apasat { DelayMs(100); //functiile DelayUs() si DelayMs() vin cu picclite (asta folosesti, nu?) if(BUTON==0) //daca butonul e in continuare apasat { if(ucIdx == 255) // unsigned char are 8 biti; ucIdx=0; else ucIdx++; } } if(ucIdx % 2) // ucIdx nu se divide cu 2 (apasari impare ale butonului) LED=0; //aprinde ledul else //altfel LED=1; //ledul sta stins DelayMs(250); //asta asa, sa ne tragem sufletul }} Link spre comentariu
ovydiub Postat Martie 23, 2009 Autor Partajează Postat Martie 23, 2009 Nu am inteles varianta lui "Bamse" ,cum ar suna? Link spre comentariu
Liviu M Postat Martie 23, 2009 Partajează Postat Martie 23, 2009 In subdirectorul \samples\delay al picc-lite se afla tot ce-ti trebuie. Trebuie doar sa copiezi delay.h in subdirectorul \include (printre alte .h) si sa adaugi delay.c la proiect. Cel mai simplu, il copiezi si pe el in directorul in care ai proiectul si-l incluzi in proiect (la un moment dat eu am copiat functia DelayMs() in fisierul main.c). Mai definesti si frecventa cristalului (in delay.h scrie cum faci asta; cel mai simplu e sa modifici chiar in delay.h, da' trebuie s-o faci la fiecare proiect) si incluzi delay.h in proiectul tau. Daca ai reusit sa faci DelayUs(x) sa dureze chiar x usec (habar n-am si nici nu ma chinui sa vad), atunci in functia ta DelayMs() o milisecunda dureaza 200us Bamse zicea ca testul meu if(ucIdx % 2) se putea scrie ceva de genul if(ucIdx & 0x01). S-ar putea ca varianta asta sa fie mai "economica" (s-ar putea sa fie mai bine suportata in hardware, da' nu-s sigur, ca nu prea stiu asamblare). Link spre comentariu
ovydiub Postat Martie 24, 2009 Autor Partajează Postat Martie 24, 2009 Multumesc mult 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