mircang9 Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Simulez cu doua PIC18F4455 trimiterea unui cod serial care nu este la fel cu RS232. O secventa contine 16 biti de 1 urmati de trei octeti care incep fiecare cu un bit de start si se termina cu un bit de paritate si un bit de stop dupa care se reia: alti 16 biti de unu si asa mai departe. Problema este ca nu intra in rutina de servire a intreruperii. Semnalul receptionat la INT0 are 560 mV pentru 1 logic si nu 5 V sau minim 2 V ca sa fie recunoscuta tranzitia din 0 in 1 cand se detecteaza inceputul unei secvente. Iata si subrutina: void comanda_rb0( void ) // intreruperea externa RB0/INT este folosita pentru tratarea comenzilor.{ if( INTCONbits.INT0IF == 1 ) // daca a aparut o intrerupere externa ( o trecere din 0 in 1 la // pinul RB0/INT ). { // detectie secventa semnal de sincronizare. tempo(1); // se pozitioneaza pe jumatatea primului bit de sincronizare. if( PORTBbits.RB0 == 0 ) // daca NU este bine adica 0. { goto end; // iesire din subrutina de intrerupere daca codul receptionat este eronat. } tempo(2); // se pozitioneaza pe jumatatea celui de al doilea bit de sincronizare. if( PORTBbits.RB0 == 0 ) // daca NU este bine adica 0. { goto end; // daca codul receptionat este eronat. } // detectie secventa semnal de start. tempo(2); // se pozitioneaza pe jumatatea primului bit din semnalul de start. if( PORTBbits.RB0 == 1 ) // daca NU este bine adica 1. { goto end; // daca codul receptionat este eronat. } tempo(2); // se pozitioneaza pe jumatatea celui de al doilea bit din semnalul de start. if( PORTBbits.RB0 == 0 ) // daca NU este bine adica 0. { goto end; // daca codul receptionat este eronat. } tempo(2); // se pozitioneaza pe jumatatea celui de al treilea bit din semnalul de start. if( PORTBbits.RB0 == 1 ) // daca NU este bine adica 1. { goto end; // daca codul receptionat este eronat. } // detectie adresa comenzii receptionate. tempo(2); // se pozitioneaza pe jumatatea bitului 1 de adresa. S1XSSbits.S1XSS7 = PORTBbits.RB0; // citeste si memoreaza bitul. tempo(2); // se pozitioneaza pe jumatatea bitului 2 de adresa. S1XSSbits.S1XSS6 = PORTBbits.RB0; // citeste si memoreaza bitul. tempo(2); // se pozitioneaza pe jumatatea bitului 3 de adresa. S1XSSbits.S1XSS5 = PORTBbits.RB0; // citeste si memoreaza bitul. tempo(2); // se pozitioneaza pe jumatatea bitului 4 de adresa. S1XSSbits.S1XSS4 = PORTBbits.RB0; // citeste si memoreaza bitul. tempo(2); // se pozitioneaza pe jumatatea bitului "de mijloc" de adresa. if( PORTBbits.RB0 = 1 ) // daca NU este bine adica 1. { goto end; // daca codul receptionat este eronat. } tempo(2); // se pozitioneaza pe jumatatea bitului 5 de adresa. S1XSSbits.S1XSS3 = PORTBbits.RB0; // citeste si memoreaza bitul. tempo(2); // se pozitioneaza pe jumatatea bitului 6 de adresa. S1XSSbits.S1XSS2 = PORTBbits.RB0; // citeste si memoreaza bitul. tempo(2); // se pozitioneaza pe jumatatea bitului 7 de adresa. S1XSSbits.S1XSS1 = PORTBbits.RB0; // citeste si memoreaza bitul. tempo(2); // se pozitioneaza pe jumatatea bitului 8 de adresa. S1XSSbits.S1XSS0 = PORTBbits.RB0; // citeste si memoreaza bitul. // in registrul S1XSS se afla adresa comenzii. // detectie semnal de actionare tempo(2); // se pozitioneaza la jumatatea primului bit din semnalul de actionare. osecunda = 97; // pentru temporizare 970 ms ( aproximativ 1 secunda ). while(( PORTBbits.RB0 == 1 ) && ( osecunda != 0 )) // Daca se receptioneaza corect // semnalul de actionare. { tempo(1); // temporizare 10 ms ( durata unei jumatati de bit. 1 bit = 20 ms ). osecunda = osecunda - 1; } if( osecunda != 0 ) // daca pe parcursul celor 970 ms semnalul de actionare a trecut eronat // in 0. { goto end; // nu se va ignora prezentul cod receptionat eronat si se va trece la detectia // urmatorului cod de telecomanda. } switch(S1XSS) { case 0x3C: PORTBbits.RB3 = 1; // trimite comanda de deschidere pentru separator 1XSS. tempo(100); // mentine comanda activa pe durata de 1 secunda. PORTBbits.RB3 = 0; // dezactiveaza comanda de deschidere pentru separator // 1XSS. break; // pentru a nu se executa doua comenzi in acelasi timp si pentru a astepta // o noua comanda. case 0x5A: PORTBbits.RB4 = 1; // trimite comanda de inchidere pentru separator 1XSS. tempo(100); // mentine comanda activa pe durata de 1 secunda. PORTBbits.RB4 = 0; // dezactiveaza comanda de inchidere pentru separator 1XSS. break; // pentru a nu se executa doua comenzi in acelasi timp si pentru a astepta // o noua comanda. } end: ClrWdt(); INTCONbits.INT0IF = 0; // se valideaza o noua intrerupere externa pentru urmatoarea // secventa. } } Link spre comentariu
puiu Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 1. Desi nu sunt cunoscator al limbajului C i-mi dau cu parerea: Comanda END nu trebuie sa fie ultima comanda ca la limbajul de asamblare? Link spre comentariu
mircang9 Postat Septembrie 9, 2010 Autor Partajează Postat Septembrie 9, 2010 Aici am folosit "end" ca o eticheta de salt in program. End-ul de care zici este undeva pe la sfarsitul lui main dar asta cred ca vezi in codul in asamblare pentru PIC18F4455 generat de compilator. Link spre comentariu
Liviu M Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 Nu m-am prins de ce te astepti sa mearga in conditiile in care dpdv electric nu indeplinesti conditiile minime - respectiv nivelurile logice.Nu-ti ramane, dupa parerea mea, decat sa modifici hardul in asa fel incit sa ai nivelurile care trebuie la intrare.Pe de alta parte, lumea zice ca la programarea in C e bine sa eviti comanda GOTO. Link spre comentariu
puiu Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 1.Nu cumva exagerezi? End este o comanda care spune ca este sfirsitul programului.2.Care este programul in asm? Link spre comentariu
Liviu M Postat Septembrie 9, 2010 Partajează Postat Septembrie 9, 2010 In C nu exista comanda/functia end. In programul anterior, end este o eticheta la care sare cu GOTO in cazul in care if() nu da cum vrea el. Personal nu am avut pana acum motive sa folosesc GOTO. Nu zic ca nu se poate folosi, nu zic sa nu-l foloseasca. Ii atrag numai atentia ca lumea zice ca in codul C nu-i bine sa folosesti GOTO. Cred ca motivatia poate fi gasita usor cu gogule. LE Oricum, despre cod discutam degeaba atata timp cat hardware nu are cum sa functioneze. Link spre comentariu
mircang9 Postat Octombrie 29, 2010 Autor Partajează Postat Octombrie 29, 2010 Am modificat partea hardware incluzand intre cele doua PIC-uri un amplificator operational LM339 cu semnal pe intrarea neinversoare si rezistenta de pull-up la iesirea din amplificator. Programul functioneaza dar cu eliminarea liniilor de cod unde testez acel bit de "mijloc" adica merge dar fara sa testez daca acel bit de mijloc este zero asa cum ar trebui sa fie conform tipului de mesaj: 11010 ( secventa de sincronizare ) b1 b2 b3 b4 ( biti de adresa ) b0 ( bitul de mijloc ) /b1 /b2 /b3 /b4 ( codul reflectat ) urmat de "1" logic timp de o secunda dupa care trece linia in zero dupa care urmeaza alt mesaj. 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