Guest cosmin800 Posted July 31, 2005 Share Posted July 31, 2005 tot umbland pe net sa rezolv una din probleme, am aflat ca intre picurile nu pot umbla direct cu semnalul ttl pentru ca picurile cu cmos-uri ...banuiesc ca aia nu au mintit pe acolo pe unde am vazut eu, si in acest caz ... cum se face din semnal ttl semnal cmos ? Link to comment Share on other sites More sharing options...
Cristiano Posted July 31, 2005 Share Posted July 31, 2005 Pai sa o luam pe rand:1. un pin configurat ca iesire de la PIC conectat la o intrare TTL.Pinii de la PIC configurati ca iesire sunt de tip CMOS: nivel iesire low: intre 0 si 0,6V nivel iesire high: intre Vdd-0,7 si Vdd (adica intre 4,3 si 5V, pt. Vdd=5V).O intrare TTL standard accepta urmatoarele: nivel intrare low: intre 0 si 0,8V nivel intrare high: intre 2 si 5V.Concluzie: o intrare TTL poate fi conectata fara probleme la un pin de la PIC configurat ca iesire.2. un pin configurat ca intrare (digitala) de la PIC conectat la o iesire TTL.2.a. pinul de la PIC configurat ca intrare are buffer de intrare de tip TTL: nivel intrare low: intre 0 si 0,8V nivel intrare high: intre 2 si 5V (pt. Vdd = 5V)O iesire TTL standard: nivel iesire low: intre 0 si 0,8V nivel iesire high: intre 2,7V si 5V.Concluzie: o iesire standard TTL poate fi conectata fara probleme la un pin de la PIC configurat ca intrare si care are buffer de tip TTL.2.b. pinul de la PIC configurat ca intrare are buffer de intrare de tip ST (Schmitt Trigger): nivel intrare low: intre 0 si 0,2Vdd (intre 0 si 1V pt. Vdd = 5V) nivel intrare high: intre 0,8Vdd si Vdd (intre 4 si 5V pt. Vdd = 5V)O iesire TTL standard: nivel iesire low: intre 0 si 0,8V nivel iesire high: intre 2,7V si 5V.Concluzie: pot aparea probleme la conectarea unei iesiri TTL la un pin de la PIC configurat ca intrare si care are buffer de tip ST (posibil ca nivelul high de la iesirea TTL sa nu fie recunoscut).Tipurile de buffer-e de intrare la PIC le gasesti in datasheet (capitolul "Device Overview").O solutie, daca folosesti circuite TTL standard (74LSxxx ori 74Fxxx) ar fi sa le inlocuiesti cu echivalente CMOS (74HCxxx ori 74HCTxxx) in caz ca ai de-a face cu situatia 2.b. Daca nu esti in situatia 2.b., poti folosi linistit circuite TTL.Alta solutie e sa folosesti buffer-e care accepta intrari TTL si au iesiri CMOS (seria 74HCTxxx). Link to comment Share on other sites More sharing options...
Guest cosmin800 Posted July 31, 2005 Share Posted July 31, 2005 am mai citit pe net ca intrarile ar trebui in mod normale conectate la masa printr-un rezistor de 1k-10k, intreb asta pentru ca am un circuit care se prezinta cam in felul urmator:folosesc un pic 16f8771: pini C0 si C1 sunt conectati la o memorie eeprom i2c, tot pe pini C0 si C1 am doua rezistente care pleaca la masa. 2: pe pinii C6 si C7 am o interfata seriala care pleaca pe un max 232 si apoi in calculator 3: pe pinul B4 am un CLOCK de la un ttl (ei spun ca este ttl in pdf), pe pinul B3 am DATA ideea este ca trebuie sa iau semnalul ttl de pe pini B3, B4am configurat tot portul B ca input si am instalat o intrerupere pe pinii B4-B7 (INT_RB).ideea este urmatoarea in momentul in care are loc o tranzitie low-high sau high-low pe pinul B4 (clock) se apeleaza intreruperea iar daca CLOCK este low iau valoarea de pe DATA( pin B3).Singura problema este ca interuperea este apelata si atunci cand nu sunt conectate intrarile. adika lasati in aer pinii B4 si B3 tot e apelata inreruperea, sau CLOCK este tot timpul low adika nu se schimba dar intreruperea este apelata.Din ce citesc in documentatia picului spune ca intreruperea e apelata cand se schimba semnalul pe unul pini B4,B5,B6,B7 sa fie de vina pinii configurati ca intrari si lasati in aer ?chestia asta se intampla daca intind mana pe langa montaj, daca il misc oleaca ....asa deodata incepe sa apeleze intreruperea aia continu ...prinde paraziti sau ceva de genul asta ... si inca ceva ... secventa de cod: old=0; while(1) { aa=input(F_CLK); if ((aa==0) && (old==1))//clock este high to low ... { aa=input(F_DTA); //citim data if(aa==1) printf("0");else printf("1"); } old=aa; } nu face la fel de urat ca atunci cand folosesc intreruperea.din documentatie reiese ca pinii B3 si B4 sunt TTLuri ...deci nu de aici ar fi problema ...Folosesc CCS C 3.222Vreo idee? Link to comment Share on other sites More sharing options...
Cristiano Posted July 31, 2005 Share Posted July 31, 2005 Cititul pe net este foarte bun, insa trebuie dublat si de gandirea proprie. Legarea la masa (prin 1 - 10k) se recomanda in cazul in care pinii respectivi sunt neconectati (si nu intotdeauna, depinde de structura interna a circuitelor - unele au pull-up ori pull-down intern, la altele se leaga un condensator la masa, etc). Daca pe o conexiune ai un element care asigura intotdeauna un nivel logic cunoscut, nu mai sunt necesare rezistente de pull-up, down, etc. In cazul tau: 1. nu are ce cauta rez. la masa pe RC0 si RC1. De fapt nu vad de ce legi I2C pe RC0 si RC1, PIC16F877A suporta I2C in hardware, iar SCL si SDA trebuie conectati la RC3 si RC4. Specificatiile I2C mentioneaza rezistente de pull-up (4k7) pe cele 2 linii, nu pull-down. 2. RC6 si RC7 se leaga direct la MAX232, fara nici o alta componenta aditionala (pull-up, pull-down, etc). 3. in mod normal, un semnal de CLOCK e intotdeauna iesire, deci pe RB4 (care are buffer de intrare de tip TTL) nu va mai trebui nimic in plus. Similar pentru RB3, daca DATA e iesire de la acelasi circuit care genereaza CLOCK (banuiesc ca e iesire, din moment ce ai zis ca RB e configurat ca intrare). Cat despre problema ta ... provine din faptul ca testezi circuitul cu intrarile neconectate (deoarece nu va exista nici un element care sa asigure un nivel logic cunoscut). Daca in aplicatia finala e posibil ca ele sa fie neconectate (de ex. un modul care nu e conectat tot timpul), atunci recomand folosirea pull-up integrat de pe PORTB. Inca ceva: asigura-te ca se trateaza corect intreruperea (vezi in datasheet modul in care se detecteaza si se genereaza interrupt-on-change, prin niste porti XOR si niste latch-uri care memoreaza starea precedenta), trebuie citit portul (pentru a actualiza latch-urile si a elimina mismatch-condition) si apoi trebuie resetat manual RBIF. Link to comment Share on other sites More sharing options...
Guest cosmin800 Posted July 31, 2005 Share Posted July 31, 2005 am uitat sa iti spun ca: 1: i2c-ul atat software si hardware nu a vrut sa functioneze cu compilatorul ccs c/3.222 (foarte probabil o problema a compilatorului), atunci a trebuit sa scriu eu codul i2c care de altfel merge fara probleme. 2: da intr-adevar pe pinii C0 si C1 sunt conectate niste rezistente la plus. problema cu clock-ul a aparut si atunci cand intrarea ttl era conectata, am pus un led in paralel pe clock si statea aprins(asa ar trebui sa fie, high atat timp cat nu se trimit date), nu am osciloscop sa vad daca semnalul pe clock pulseaza. Din specificatii CLK ar trebui sa pulseze doar atunci cand transmite date, dar dupa cum imi apar datele mie pe serial pulseasa tot timpul. /* PIN_B4 = CLOCK (37) PIN_B3 = DATA (36) */ short x; x=input(F_CLK); //CITESTE CLOCK if(x==0) x=input(F_DTA); //DACA CLOCK ESTE 0 (LOW) CITESTE DATA if(x==1) printf("0"); else printf("1"); //TRIMITE DATA IN RS232 } Link to comment Share on other sites More sharing options...
Cristiano Posted July 31, 2005 Share Posted July 31, 2005 Indiferent de rutinele din CCS, cred ca era mai bine sa folosesti modulul I2C hardware din PIC (mai ales ca ai facut tu rutina).Apoi sunt niste valori gresite: pull-up trebuie sa fie 4k7 in loc de 2k, condensatorii la cuart sunt prea mici (trebuie minim 15pf).Legat de problema, activeaza pull-up-urile integrate ale PORTB. Cat despre codul pe care l-ai postat, nu e clar daca folosesti intreruperea sau nu.P.S. sper ca frecventa CLK e suficient de scazuta pentru a putea fi prelucrata cu PIC-ul. Link to comment Share on other sites More sharing options...
Guest cosmin800 Posted August 1, 2005 Share Posted August 1, 2005 multumesc pentru pontul cu pullup-ul din pic, dupa ce i-am dat enable nu mai imi apar toate ametelile si bruiajele alea de tot kktul, nu imi citeste semnalul ttl de pe interfata cum trebuie dar sunt pe calea cea buna (cred), am schimbat cristalul de 4 cu unu de 20 si nu a mai vrut sa porneasca picul, acuma incerc cu unu de 12.288, s-ar putea sa fie si de la condensatorii de la cristal de care ai spus tu ca sunt prea mici, oricum multumesc mult pentru faza cu pull-upul pentru ca de unu singur nu descopeream si eram nevoit sa pun rezistente pe montak aiurea.bafta. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.