Jump to content
ELFORUM - Forumul electronistilor
ovydiub

O intrebare

Recommended Posts

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 to comment
Share on other sites

. 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 to comment
Share on other sites

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 to comment
Share on other sites

Sal !!!... foarte interesant :aplauze . 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 :da

Link to comment
Share on other sites

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 to comment
Share on other sites

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 :rade:

 

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 to comment
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.



×
×
  • 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.Terms of Use si Guidelines