Sari la conținut

Laci

Members
  • Număr conținut

    21
  • Înregistrat

  • Ultima Vizită

Informatii pentru contactare

  • Website URL
    http://www.outsolder.com

Laci's Achievements

Membru

Membru (1/6)

0

Reputație Comunitate

  1. Cu dsPIC se poate face un decoder mp3, daca stii protocolul :) AVR-urile si dsPIC30-urile au cam acelasi viteza adica 20MIPS, dar dsPIC are functii DSP, AVR nu, dsPIC este pe 16biti AVR pe 8, din asta rezulta ca dsPIC este mai performant, dar si 2-3ori mai scump. dsPIC33 are parca 40MIPS si costa in jur de 7E, un ARM AT91SAM7S256-AU facut de Atmel are 55MHz cam dublu la flash si ram, si 32biti costa 9E.
  2. Daca o sa am timp o sa fac pe placa de dezvotlare aplicatia respectiva :)
  3. 8bit: Familia 10-12F low pin, low-cost,low-end, complexitate redusa, resurse limitate, dezvoltare in assambler 16F low-cost, low-end(complexitate redusa) dezvoltare mai mult in assambler, se poate si in C/basic, dar arhitectura nu-i optimizata pentru asa ceva 18F middle-end, arhitectura optimizata pentru limbaje C/BASIC, compilator C18 free ! 16bit: dsPIC: viteza mare, multe resurse, compilator free de la microchip(niste limitari dupa 60 de zile), este un DSP, adica are module hardware dedicate pentru diferite functii de prelucrare semnale(impartire, functii algebrice) Nu poti sa le compari pentru ca sunt din alte familii, cum dar iti zic ca dsPIC este mai rapid, are mai mult flash/ram/periferice, ca pret costa cat un 18F, insa 18F stie numai inmultire, eu personal intr 18F si dsPIC opta pentru dsPIC :)
  4. Ai pm, si mail :)
  5. Solutia data de mine este in C, nu are nici o legatura cu avr-gcc, mikroe, etc. :) sunt cateva linii de cod scrise in C.
  6. In primul rand, nimeni nu a vorbit de asamblare, a fost numai mentionat, unul a zis de basic, dar in mare parte discutia era in mediul C, ca diferite compilatoare ala-i alta chestie. @donpetru, permitemi sa te ajut: PORTB = 0; // Seteaza PORT.B ca iesire (nu e bine, trebuie DDRB) case 1: kp = 1; break; // 1 => redundant case 2: kp = 2; break; // 2 => redundant case 3: kp = 3; break; // 3 => redundant case 4: kp = 4; break; // 4 => redundant case 5: kp = 5; break; // 5 => redundant case 6: kp = 6; break; // 6 => redundant case 7: kp = 7; break; // 7 => redundant case 8: kp = 8; break; // 8 => redundant case 9: kp = 9; break; // 9 => redundant case 10: kp = 10; break; // '*' => redundant case 11: kp = 11; break; // '0' ?? nu trebuia kp = 0; ? case 12: kp = 12; break; // '#' => redundant, e ca si cum ai scrie if(x==2) x=2; Astea sunt gresile admise pentru varianta beta. Mai sunt si greseli de arhitectura programului, care vor rezulta la functionare eronata... De ce nu incerci sa folosesti solutia data de mine? Se poate adapta f.usor eventual fa o comparatie.
  7. Corect dar ce se intampla daca scrii pe port 22? va rezulta 0b00010110 exact ce ai vrut cu conversie :) Intelegi? Crede-ma asa este, eventual simuleaza cu avr studio sau proteus
  8. @edy_wheazel: arhitectura micro controllelor, procesoarelor, circuitelor digitala se bazeaza pe logica booleana, datele sunt in format binar. Cand vorbim de un controller pe 8biti cum este si familia avr de la atmel avem un data bus care are latime de 8biti, registri sunt de 8biti. Un port digital este defapt un registru fiecare bit este reprezentat fizic de un pin, nu trebuie sa faci conversie zecimal binar pentru ca poti sa scrii direct o valoare de 1 byte(8biti) pe port. Insa ai dreptate ca in registrii se scriu numai valori in format hexazecimal, insa in C poti sa scii direct in zecimal pentru ca compilator face conversia in hexa.
  9. Te rog sa scrii o functie care face conversia din zecimal in binar si scrie pe port. Nu stiu cum iese mai simplu, dar sunt curios :)
  10. Ok, am inteles intrebarea, adica odata tastat 6 si 7 cum "deplasezi 6 cu un loc spre stanga", am facut asa: output_value = ((output_value*10)+key)&0xFF; Sa luam in detalii, in output_value este valoare veche care la inceput este 0, de la tastatura se citeste un numar 0..9, (acum nu pot sa scriu formula frumos cum este definit un numar intrun format arbitrar ca editorul nu suporta) Un numar in format zecimal 234 este definit asa: (10^2)*4+(10^1)*3+(10^0)*4 Deci output_value = 0 se citeste 4 => output_value = 0*10+4 => 4 se mai citeste 3 => output_value = 4*10+3 => 43 si se mai citeste 2 => output_value = 43*10+2 => 432, Totul fiind intro bucla se adun valorile ponderat pana cand se apasa # cand se scrie efectiv pe port, la apasarea * cand se sterge output_value este indicat si stergerea valori portului, am omis acest lucru. Dar cum se vede am depasit 255 valoare maxima reprezentata pe 8 biti, daca scriem pe port sau atribuim unei variabile de 8 biti se pierde byte-ul semnificativ(432 = 0x01B0) si va ramane valoarea 0xB0 = 176; ((output_value*10)+key)&0xFF => sterge byte-ul semnficativ, defapt face acelasi lucru ca si cand scriem o variabila de 16bit in 8bit, este redundant, dar eu totdeauna limitez asa cand este cazul ca sa fie sigur.
  11. Imi cer scuze, eram destul de grabit, pentru ca eram in concediu dar am zis ca daca am inceput discutia sa nu am pauze de cateva zile. In comentariu am pomenit de portb si in cod am scris portd, dar am fost consecvent si am folosit numai portd in cod, asa ca va rog frumos partea cu harcea pacea nu cred ca este adecvat. Am vrut sa explic, eventual sa atasez un cod care face citirea tastaturii(ca am facut destule aplicatii cu tastaturi), dar in momentul de fata ma retrag din discutie si de pe forum. Nu stiu cum vi sa parut codul sursa, eu am formatat cu space-uri acuma ca dupa submit apare asa, eu nu am nici o vina. Am cativa ani buni de experienta in dezvoltarea aplicatiilor embedded si consider ca stiu despre ce vorbesc, insa nu vreau sa-mi pierd vremea cu astfel de discutii, numai bine. P.S. Va ma spun inca odata portd sau portd sau oricare port intreg cu 8pini adica registru de 8 biti daca se scrie o valoare in decimal sau hexa, sau octal sau orice alta reprezentare pe port apare in binar. Acuma ca vrei sa accesezi fiecare bit in parte si sa faci un algoritm(se poate mult mai simplu) este problema ta, dar am spus ca nu are nici un rost. Nu ma credeti? se poate citi pdf-ul sau se poate simula in avr studio o simpla scriere pe port.
  12. Eu lucrez in C, cu compilator avr-gcc, algoritmul descris e ok, dar nu este nevoie de asa ceva. Scriu cateva randuri de cod sa vedeti cat de simplu este de facut: // sa zicem ca portb va fii folosit pentru comanda reelor #define KEY_NOT_PRESSED 0x0F unsigned char key, key_buff; int main(void) { unsigned short output_value=0; //.... DDRD = 0xff; //setat ca iesire PORTD= 0; // pentru siguranta... key=KEY_NOT_PRESSED; key_buff=KEY_NOT_PRESSED; //.... while(1) //bucla main { //.. if((key!=key_buff)&&(key!=KEY_NOT_PRESSED) ) // daca a fost apasat o alta tasta { switch(key) { case '#': //enter PORTD = output_value; break; case '*': //clear output_value = 0; break; default: output_value = ((output_value*10)+key)&0xFF; //limitare la maximum 255 }; //activare buzzer pentru 10-30ms }//if((key!=key_buff)&&(key!=KEY_NOT_PRESSED) ) // daca a fost apasat o alta tasta key_buff=key; }//while(1) //bucla main }//int main(void) // intrerupere de timer de 1-10ms ISR(...) { //.. key=GetKey(); //citire tastatura //.. } Cam asta ar fii partea de comanda a releelor, mai este citirea efectiva a tastaturii, comanda buzzerului, si comanda releului de siguranta
  13. Cum am spus si anterior trebuie un releu legat in serie cu iesirea, un fel de output enable si asa se poate seta 0V, si o alta chestie PORTB = 7; va rezulta 0b00000111 adica 7, nu vad problema :) nu inteleg nici problema cu "adunarea" pe o tastatura 4x3 sunt si 2 taste # si * de ex. # se poate folosi ca enter, se tasteaza valoare 123 si # pentru validare, simplu ca buna ziua si pe port PORTB = 123 daca trebuie adunare PORTB = PORTB+25; Prea multa filozofie prea putina practica ...
  14. Bun, vad ca trebuie sa explic in detalii, aveti tensiuni intre 1-255 asta inseamna defapt 7 biti -7relee, daca ploturile au tensiuni 1,2,4,8,16,32,64,128V adica puterile lui 2 nu trebuie nici un algoritm si nici look up table pur si simplu se scrie pe port valoare citita de la tastatura. Fiind vorba de 7biti, bitul 0va ramane liber recomand ca acel releu sa fie legat in serie cu iesirea si comandat numai dupa ce a fost configurat iesire,ca un output enable. Look-up table era indicat daca configuratie releelor ar fi fost mai complicata, vad ca nu ati inteles cum se foloseste si ce rol are un look up table, fiind vorba de o configuratie statica nu are rost sa recalculezi de fiecare data printr-un algoritm, valorile se introduc intr-un tabel si numai indexare se calculeaza, na bun cum implementam aici? Foarte simplu: valoare citita de la tastatura este indexul tabelului, adica tabelul are 256 locatii de 8 biti fiecare locatie are configuratia de relee pentru valoare de tensiune respectiva si se acceseaza cu valoare citita de la tastatura de ex. key=getkey() portd=tabel(key). In cazul prezent prima varianta este cea buna, dar se poate experimenta si cu look-up table.
  15. Sunt 8 relee, adica un port intreg, asta inseamna 1byte de date, valorile fiind de 1-255 avem nevoie de 255 diferite date pe 8 biti, nui mare treaba. Valoare de 1-255 se foloseste pentru indexare, tabelul este defapt un vector de date si gata. De exemplu unsigned char output_transform_tabel[] = {3, 7, 9, 12, ...}
×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock