Sari la conținut
ELFORUM - Forumul electronistilor

O intrebare


ovydiub

Postări Recomandate

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
  • Răspunsuri 8
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • ovydiub

    4

  • Liviu M

    3

  • Bamse

    2

Top autori în acest subiect

. 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

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

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 spre comentariu

Hehe, era prea simplu, nu mi-a trecut prin cap :nas: :jytuiyu 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

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

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 spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări