Sari la conținut

Laci

Members
  • Număr conținut

    21
  • Înregistrat

  • Ultima Vizită

Postări postat de Laci

  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. 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 :)

  3. 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.

  4. @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.

  5. 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.

  6. 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.

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

  8. 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 ...

     

    Aceasta metoda cred ca presupune mentinerea in permanenta in starea "conectat" a releului aferent infasurarii transformatorului de 1V! Adica, cand punem sub tensiune montajul, acesta automat ne va indica 1V urmand ca din tastatura sa setam o valoare imediat superioara. Dar oare o sa putem sa anulam acel volt ? Mai exact, atunci cand dorim 0V la iesire! In plus, mai e o problema aici, sa exemplific: daca tastam 7, valoarea in binar atribuita porturilor este 111, altfel spus: Port.B0=1; Port.B1=1; Port.B2=1; Port.B3...Port.B7=0. Cum setam in acest caz Port.B3...Port.B7=0 ? Sa definim toate porturile in zero la inceputul programului ? Apoi, un alt aspect care merita atentie: cum facem ca uC-ul sa "adune", adica cand tastam 4 si imediat dupa aceea 7 sa "vada" 47 ? Dupa altgoritmul prezentat "pe 7biti" acesta presupune - sa ma corectati daca gresesc - ca atunci cand tastam 4, porturile de iesire automat sa se configureze pentru 4V dar cand imediat dupa aceea dorim sa tastam 7, uC sa sterga 4 si sa configureze iesirile pentru 7V. Adica exista pericolul sa nu putem seta tensiunii mai mari de 9V ? Cu siguranta exista o solutie la asta dar... cum ?
  9. 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.

  10. Eu propun o alta metoda, look-up table, cu 256byte este rezolvat problema.

    In legatura cu microcontroller, nu trebuie mare filozofie, oricum costa cam 1-2E, eu asi pune un atmega88.

    Iar despre limbajul de programare: C, mediu de programare/compilator: avr-gcc si avr studio.

    Trebuie un display pentru tastatura si un buzzer, ar fii foarte bine sa fie si un feedback pentru siguranta.

  11. ce se poate face cu AVRul asta ? de exemplu, la ce as putea folosi intrarea digitala si cum ?????????????? :biggrin:

     

    Am sris in general despre utilizarea portului digital ca intrare, avr-ul respectiv este un atmega8, se pot face relativ multe aplicatii cu el, are ADC, PWM, UART, SPI, I2C.

     

    Intrarile digitale se folosesc pentru citirea unei stari digitale, ce are stari digitale? de exemplu un push button, un contact, orice dispozitiv care are 2 stari definite, care pot fi abstractizate cu 0 si 1.

    Cum se foloseste o intrare digitala? In aplicatia respectiva este documentat destul de bine, este si schema acolo.

  12. Salut,

     

    Am facut o aplicatie foarte simpla cu un ATmega8, o intrare si o iesire digitala, recomand pentru incepatori.

    Articolul este pus pe un blog, acum nu are rost sa copiez aici: http://www.youritronics.com/atmega8-protostack-simple-demo/

     

    Daca sunt oameni interesati, pot sa mai prezint si alte module periferice, tot printr-o aplicatie demo, puteti sa veniti si cu propuneri,

    dar nu de genul: am de facut la licenta...

  13. Microcontrolerele nu se pot programa in Lader, nu exista soft care sa faca conversia, insa exista Flowcode, care este defapt programare prin flow chart, adaugi blockuri si le configurezi, descarca si vezi ce stie :)

    Sa-ti masoara tensiunea si curentul nu ai nevoie de 18F, merge orice PIC care are ADC si destule pini pentru afisaj, insa pentru 18F ai compilatorul C18(se poate descarca de pe microchip.com), pentru 1-2E in plus nu stiu daca merita sa te complici cu asm..., sau folosesti un AVR, care este mult mai ieftin, ai compilator pentru el, la fel si flowcode...

  14. In ultima vreme am lucrat cu un PIC18F(C18), am facut cateva demo-uri si cu un 16F(asm), din familia AVR am folosit destul de mult ATmega88 si acum cred ca pot sa fac o comparatie mai buna intre avr si pic.

     

     

    1.) Frecventa de executie a instructiunilor(FCPU):

    PIC: Frec. Oscilator/4, daca am un quartz de 40MHz, instructiunile sunt executate cu 10MHz, si sunt unele care dureaza 3 x CLK_CPU !

    AVR: Frec. Oscilator daca am un quartz de 20Mhz, atunci si CPU are 20MHz, dar sunt instructiuni care dureaza 1,2 sau 3 CLK, dar majoritatea numai 1!

     

    2.) Registri/RAM:

    PIC: este un registru de lucru W, majoritatea trec prin acesta

    AVR: sunt 32 de registri de lucru

     

    PIC: in PIC RAM-ul este impartit in bankuri de 256byte, aici sunt si registri pentru modulele periferice, pentru accesare este necesar sa fim in bankul respectiv,

    la structuri de date mari poate fii un impediment daca nu incap intr-un bank, desigur sunt solutii si la nivel de C, numai ca trebuie tinut cont de acest lucru.

    La fel se intampla si cu un stack mai mare, trebuie definit o zona in 2 bankuri pentru linker.

     

    AVR: RAM liniar, se poate accesa de oriunde orice zona de ram sau registru

     

    3.)Instructiuni:

    PIC: 35-45 depinde de controller, sunt instructiuni de testare de bit

    AVR: 130-135, instructiunile de testare bit sunt limitate la primele 32 de registrii

     

    4.)Accesare EEPROM,FLASH:

    PIC: in flash se pot scrie numai un blockuri de 64byte, ca sa scrii in eeprom este nevoie de 2 linii de cod(nu stiu din ce motiv dar este necesar) care aparent nu fac nimic, se scrie intr-un registru (EECON2) odata 0xAA, si dupa 0x55 ...

    AVR: se poate accesa fiecare byte din flash

     

    5.)Intreruperi de tip Pin change/externe:

    PIC: destul de limitat, 4 pini cu aceasta functie

    AVR: pe aproape fiecare pin este posibil generarea unui intreruperi

     

    6.)Intreruperi in general:

    PIC: la cele 18F sunt 2 nivele high si low, fiecare intrerupere trebuie setat sa genereze nivelul dorit, desigur se poate alege ca fiecare sa aiba aceiasi nivel(compatibil cu 16F) dar, odata intrat in intrerupere fie high fie low trebuie cautat sursa exacta, asta prin testarea flagurilor, si stergerea lor din soft!!!

    De ex: daca am 3 timere si USART cu intreruperi setate pe low priority, cand apare intreruperea, trebuie sa testez fiecare bit in parte ca sa aflu exact de unde a venit intreruperea.

     

    AVR: Este un vector pentru intreruperi, fiecare intrerupere are locul lui unde sare, de acolo este redirectionat la functia care se ocupa de event. Numai la intreruperi de tip pin change trebuie cautat exact care dintre pini a initiat intrerupere.

     

    7.)Periferice:

    PIC: 18F6620 face parte din gama noua de picuri are 64kB flash si 4Kb RAM, deci nu este o comparatie ideala cu ATmega88 care are numai 8KB flash si 1KRAM, are cateva functii in plus, cum ar fii auto-baud, insa ce nu mia placut ca timerii au prescaller maxim 16, (insa au postscale...) modulele PWM, si Input capture nu sunt legate direct de timeri, ci prin configurare se aleg timerii pentru diferite functii

     

    AVR: Fiind de talie mai mica, totusi are destule periferice destepte, daca ne uitam la un avr mai mare atunci vedem ca sunt mai multe timere mai multe periferice, si apare JTAG-ul care lipseste din PIC (au posibiliate de debugg prin ICD2).

     

    8.) ADC

    PIC: Parca este mai stabil, nu ia atata zgomot, dar nu poti selecta de exemplu canalul 1,2,5,6 fara 3 si 4!

    AVR: Ca sa poti folosi toate 10biti, trebuie filtrat bine AVCC, se poate selecta oricare dintre canale.

     

    9.) Parere personala: Cred ca PIC este o arhitectura inferioara, ca sa faci o masuratoare ADC trebuie sa configurezi destul de mult, nu este optimizat pentru C, sau nici macar pentru ASM, acele bankuri complica mult, insa are periferice puternice, este compilator pentru 18F limitat dupa 60 de zile, dar cu performanta destul de buna(nu intru in detalii)

    AVR insa este mult mai avansat, mai rapid, si mai usor de folosit, compilator puternic FREE!

    Microchip a investit mult in marketing si se vede, in Romania se pare ca sunt mai raspanditi, insa firmele de specialitate tind sa foloseasca AVR-uri pentru ca sunt mai ieftine.

    Fiecare alege pe care vrea, fiecare isi face treaba, si dupa 1-2 luni te obisnuiesti de oricare, daca esti la inceput cel mai bine sa alegi din care poti intreba pe cineva.

    In RO gasiti mai mult suport pentru PIC-uri, ma refer la manuale, cursuri, la facultati se preda mai mult PIC, insa in general pentru AVR suportul este mai puternic, au un forum foarte bun.

     

    Am incercat sa fac o comparatie obiectiva si cat se poate de simpla, sper sa va fie de ajutor.

  15. Interesanta intrebare, in primul rand: in afara faptului ca la comparatie avem in vedere uC pe 8 biti, mare semanare nu este intre cele 2(Atmel sau Microchip) Eu cunosc AVR-urile, cu PIC-uri acum incep, din punctul meu de vedere PIC-ul are un mare avantaj: imunitate la zgomot electromagnetic, in rest este mult sub AVR(ma refer la arhitectura)

     

    Depinde de aplicatie, nu cred ca este un raspuns universal.

×
×
  • 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