george2209 Postat Septembrie 5, 2011 Partajează Postat Septembrie 5, 2011 Buna ziua,Deranjez si eu cu o intrebare din categoria (probabil) "stupid questions":Am un PIC 16F722 pe care il programez cu MikroC si am urmatoarea problema:pe rutina de "interrupt" cand imi vine un anumit mesaj via I2C (pic este slave) vreau sa pun un anume pin/bit pe un port oarecare pe 0 sau pe 1 (in functie de I2C request). Fac asta cam asa:PORTx = PORTx | 0b00000001; //pun PORTx.0 HIGHAcuma, problema mea e:Daca am urmatoarea "configuratie":void main(){ [...some code here...] TRISx = 0x00; //output PORTx = 0b10000000;}iar aici:void interrupt(){ [...some code here...] PORTx = PORTx | 0b00000001; //pun PORTx.0 HIGH}ma asteptam ca LED-urile aprinse sa fie:0b10000001DAR...se aprinde numai:0b00000001cu alte cuvinte in rutina "interrupt" cand citesc valoarea PORTx ea vine inapoi ca 0b00000000.Banuiesc ca, de vreme ce bitii sunt configurati pe OUTPUT, nu se pot citi?...??.Vre-un sfat ..pls.. MERCI!! Link spre comentariu
Liviu M Postat Septembrie 5, 2011 Partajează Postat Septembrie 5, 2011 Poate ar fi bine sa spui si care-i x-ul de la portul folosit, ca poate bitul 7 are si alte functii (de exemplu analog) si poate e setat default pe acea functie, caz in care nu "reactioneaza" cum te astepti la configurarea din TRIS. Link spre comentariu
george2209 Postat Septembrie 5, 2011 Autor Partajează Postat Septembrie 5, 2011 Salut Liviu,pai PORTx inseamna orice port ..eu am testat asta pe bitii porturilor PORTA si PORTB.Cei de pe PORTA sunt bine-nteles configurati ca digitali si output.x = orice "litera" dela A la C (exceptand bitii la care sunt legati alte compoinente i.e. quartul)..Intrebarea e "generala"..se poate citi un bit configurat ca output? Eu as zice ca DA de veme ce ai un registru responsabil de asta, insa de mers, nu merge...sau oare nu ii poti citi in interiourul rutinei "interrupt" ? Link spre comentariu
Liviu M Postat Septembrie 5, 2011 Partajează Postat Septembrie 5, 2011 Si eu as fi zis la fel. Ba mai mult, conform data-sheetului de la 16F877 (nu cred ca au modificat ceva in zona asta), orice modificare a unui port are loc dupa o citire prealabila a portului respectiv: Allwrite operations are read-modify-write operations.Therefore, a write to a port implies that the port pins areread, the value is modified and then written to the portdata latch.De-aia te-am si intrebat daca ai configurat bine porturile.LE M-am uitat acum pe data-sheetul de la 16f722 si RA7 (PORTA.7) e oscilatorul. Cum zici ca acolo ai quarzul, n-are cum sa mearga sa-l setezi in cod.Cat despre RB7, in aceeasi documentatie scarie6.3.4.8 RB7/ICSPDATFigure 6-12 shows the diagram for this pin. This pin isconfigurable to function as one of the following:• a general purpose I/O• In-Circuit Serial Programming dataNu m-am prins ce inseamna "is configurable to function as ICSP data". Adica nu m-am prins daca trebuie sa faci ceva sa fie digital (si nu ICSP data). Link spre comentariu
george2209 Postat Septembrie 5, 2011 Autor Partajează Postat Septembrie 5, 2011 Salut,O sa mai iau la mana codul cand ajung acasa...logic ar fi sa se poate citi.Acuma ca sa fiu si mai mult in ceata, imi amintesc (din pacate nu mai am adresa) ca am vazut pe net odata un cod in care se facea ceva asemanator insa tipul care a scris codul NU facea schimbarie in interiorul rutinei "interrupt" ci le prelua dupa intr-un loop din "main".Nu vad insa de ce nu ar merge in "interrupt"...tot sap pe net dar nu gasesc nimic referitor la asta... Link spre comentariu
Liviu M Postat Septembrie 5, 2011 Partajează Postat Septembrie 5, 2011 Vezi ca am editat postul de mai sus. Link spre comentariu
george2209 Postat Septembrie 5, 2011 Autor Partajează Postat Septembrie 5, 2011 Salut Liviu,Da am vazut referitor la RA6 si RA7. Totusi....Am incercat asa:void main(){ ....... PORTA = 0b00000001; // RA0 HIGH}si s-a aprins LEDul RA0apoi am trimis pe I2C un semnal sa imi aprinda RA4 in paralel cu RA0void interrupt(){ ....... PORTA = PORTA | 0b00010000; //RA4 HIGH}rezultatul este ca imi opreste RA0 si imi aprinde RA4.Am vrut sa verific, inainte de a schimba in "interrupt" ce valoare are PORTA, facand asa:PORTB = PORTA;insa imi vine 0x00 dinspre PORTA desi la momentul ala LEDul RA0 e aprins...nu inteleg :((... Link spre comentariu
Liviu M Postat Septembrie 5, 2011 Partajează Postat Septembrie 5, 2011 Hm, probabil chiar nu merge sa citesti o iesire (cred ca n-am incercat niciodata). Caz in care nu-ti ramane decat sa folosesti o variabila globala pe care sa o setezi cum vrei si pe care sa o "aloci" portului. unsigned char ucPortA; void main(){....... ucPortA = 0b00000001; PORTA = ucPortA; // RA0 HIGH}void interrupt(){....... ucPortA = ucPortA | 0b00010000; PORTA = ucPortA; //RA4 HIGH} Link spre comentariu
george2209 Postat Septembrie 5, 2011 Autor Partajează Postat Septembrie 5, 2011 Salut,...sa tin "statusul" intr-o variabila...Mda...exact asta nu vroiam ... insa nici nu vad nicio alta varianta. O sa mai sap putin insa cred ca pana la urma tot la asta o sa ma intorc. Link spre comentariu
Liviu M Postat Septembrie 5, 2011 Partajează Postat Septembrie 5, 2011 Nu stiu eu prea bine cu ce se mananca mikroC, da's convins ca poti sa setezi pinii independent. Parca sub forma PORTx.y=1 se poate seta pinul y al portului x, caz in care ceilalti pini raman nemodificati. Link spre comentariu
francezu Postat Septembrie 5, 2011 Partajează Postat Septembrie 5, 2011 Parca sub forma PORTx.y=1 se poate seta pinul y al portului x, caz in care ceilalti pini raman nemodificati.Corect, se mai poate si asa: Rxy_bit=1, unde x este portul(A,B, etc) iar y este bit-ul(0-7). A doua parte a frazei ceilalti pini raman nemodificatieste corecta doar in anumite conditii.Cum bine scrie in datasheet, toate operatiile de scriere asupra unui port (inafara de instructiunea movwf) sunt de tipul Read-Modify-Write, ceea ce inseamna ca mai intai portul este citit(se citesc nivelele logice la pini), se modifica bitii necesari(dictati de instructiune) si se rescrie valoarea la port. Majoritatea pinilor pot avea diverse functii( multiplexate), printre care si cea de intrarea analogica ( pentru ADC, comparator, etc). Atunci cand un pin este configurat ca intrare analogica, intrarea sa digitala nu va mai functiona, va citi intotdeauna 0. Daca spre exemplu PORTA a fost configurat ca iesire digitala, dar totodata registrul ANSELA a fost setat pt intrari analogice,nu vor putea fi citite nivelele logice de la PORTA ( incluzand si instructiunile RMW). Daca setam bit-ul RA0, iesirea va comuta in 1 logic; apoi setam RA1 - va comuta in 1 logic, dar RA0 va reveni la 0 logic . explicatia: instructiunea ce seteaza bit-ul RA1 citeste mai intai port-ul, dar pt RA0 va citi 0, pt ca bit-ul corespunzator din ANSELA a fost setat, se modifica bit-ul RA1 si se rescrie valoarea la port( b'00000010'). In concluzie, cand nu se folosesc intrarile analogice, acestea trebuiesc dezactivate, pentru a putea fi citite corct intrarile digitale. Foarte important si ce scrie aici: Read-Modify-Write, rezolvarea pt aceasta problema este intradevar folosirea unui registru shadow, sau a registrilor LATx daca procesorul ii are implementati. Link spre comentariu
Liviu M Postat Septembrie 5, 2011 Partajează Postat Septembrie 5, 2011 este corecta doar in anumite conditii... Ai dreptate, numai ca eu ma refeream la problema de fata, in conditiile in care george2209 afirma ca a configurat corect porturile ca digital I/O si a configurat corect TRISx. Link spre comentariu
francezu Postat Septembrie 5, 2011 Partajează Postat Septembrie 5, 2011 Poate ca le-a configurat corect, dar e mai bine sa ne asiguram, pt ca nu a scris nicaieri explicit cum a setat registrii ANSELA/ANSELB. Daca nu 's-a atins' de ei in cod , la reset registrii respectivi iau valoarea 0xFF si astfel se explica problema intampinata. Link spre comentariu
Liviu M Postat Septembrie 5, 2011 Partajează Postat Septembrie 5, 2011 Eu l-am intrebat/i-am zis de chestia cu analogul chiar din primul meu post de pe topicul asta. Link spre comentariu
george2209 Postat Septembrie 6, 2011 Autor Partajează Postat Septembrie 6, 2011 Am sa pun mai tarziu toate setarile aici cu copy & paste.PORTA este digital. Nimic analogic.Cu toate astea cand citesc PORTA in "interrupt" imi vine inapoi 0x00, in ciuda faptului ca LEDul pe RA0 este aprins si ma astept sa vina 0b00000001.Banuiesc ca un port OUT nu poate fi citit...ceea ce insa, mi se pare absurd.LATx nu este suportat pe 16F722. Din cate stiu eu merge numai pe 18Fxxxxx.Revin cu setarile mai tarziu. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum