kit Postat Septembrie 25, 2009 Partajează Postat Septembrie 25, 2009 am un proiect in care in 18f4520 trebuie sa comunice pe serial asincron cu 18f2550. am legat direct TX(4520) - RX (2550) si RX(4520) - TX(2550). Amandoua picurile sunt la 20MHz, fiecare cu oscilatorul sau. 4520 are: #pragma config OSC = HSPLLiar 2550 are: #pragma config PLLDIV = 5 //20MHz#pragma config FOSC = HSPLL_HS //20 MHz#pragma config CPUDIV = OSC1_PLL2Mai departe, initializarea USART: 4520: OpenUSART(USART_TX_INT_OFF&USART_RX_INT_ON&USART_ASYNCH_MODE& USART_EIGHT_BIT&USART_CONT_RX&USART_BRGH_LOW,49);2550: OpenUSART(USART_TX_INT_OFF&USART_RX_INT_ON&USART_ASYNCH_MODE& USART_EIGHT_BIT&USART_CONT_RX&USART_BRGH_LOW,49);Din 4520 trimit apoi un caracter: while(BusyUSART());putcUSART(0xcc);iar receptia o fac in 2550, pe intrerupere: if (PIR1bits.RCIF){ REC=RCREG; PIR1bits.RCIF = 0;}ulterior, la cerere, trimit caracterul pe USB: if(len=getsUSBUSART(input_buffer, CDC_BULK_OUT_EP_SIZE)){ i=9; //pregatit pt usart //... if(mUSBUSARTIsTxTrfReady()) { if(i==9){ raspuns[0]='u'; raspuns[1]=REC; mUSBUSARTTxRam((byte*)raspuns,3); } }}//end ifCDCTxService();PC-ul primeste insa in loc de 0xcc, cat am trimis, balarii (0xf6, 0xce si alte treburi din astea). Stiu inca ca partea de comunicatie 2550 - PC merge bine. De asemenea, pe osciloscop, transmisia (TX-4520) pare sa fie ok. Cerinta: ajutooor! habar-n-am ce sa-i mai fac. Poate hiba-i pe partea de hard, poate pe partea de soft, poate amandoua, nu stiu. Multumesc. Link spre comentariu
mircang9 Postat Noiembrie 2, 2010 Partajează Postat Noiembrie 2, 2010 Nu conteaza daca frecventele celor doua PIC-uri sunt diferite conteaza sa aiba EUSART-urile setate pe aceeasi rata baud.Eu nu lucrez cu functiile din biblioteca pentru EUSART ci direct cu registriisi asa este mult mai simplu: de exemplu: BRG16 = 1; // pentru 8 bit-Asynchronous. SPBRGH = SPBRG = ; // dupa formula (Fosc/rata/16) - 1 trecut in hexa. SYNC = 0; BRG = 0; TXIE = 1; RCIE = 1; GIE = 1; si GATA ! bineinteles cu sintaxa pentru structuri INTCONbits.GIE = 1; etc. Link spre comentariu
mircang9 Postat Noiembrie 2, 2010 Partajează Postat Noiembrie 2, 2010 Tu acolo ai pus if( RCIF == 0 ) in loc de while( INTCONbits.RCIF == 0 ) { Nop(); } a = RCREG.Daca ratele baud la cele doua picuri nu sunt la fel apar erori. Si inca cevaintre cele doua picuri vine un LM339 cu intrarea pe + si pe - un divizorcu doua rezistente la fel de cate 10 K sa zicem legate la +5V si la masa.Sau cu un optocuplor rapid. Link spre comentariu
Liviu M Postat Noiembrie 2, 2010 Partajează Postat Noiembrie 2, 2010 Si inca cevaintre cele doua picuri vine un LM339 cu intrarea pe + si pe - un divizorcu doua rezistente la fel de cate 10 K sa zicem legate la +5V si la masa.Sau cu un optocuplor rapid.De ce? Link spre comentariu
mircang9 Postat Noiembrie 3, 2010 Partajează Postat Noiembrie 3, 2010 Vezi subiectul Adaptare semnale la PIC. Eu am legat direct cele doua pic-urisi pe osciloscop semnalul avea amplitudinea in jur de 0.6 V ( 600 mV ).Pentru detectia corecta a semnalului trebuie sa aiba peste ViL ( 2 V ).Cel mai bine se poate face cu optocuplor. Cu amplif operational merge cam defectuos. Link spre comentariu
Liviu M Postat Noiembrie 3, 2010 Partajează Postat Noiembrie 3, 2010 Eu cred ca aici vorbim de 2 picuri care functioneaza la aceeasi tensiune si care dau semnale de 0/5V ferme. Translatiile de nivel in cazul asta nu sunt necesare. Link spre comentariu
mircang9 Postat Noiembrie 3, 2010 Partajează Postat Noiembrie 3, 2010 Da, exact asa am incercat cu legare directa dar n-a mers. Daca ai facut sau a facut cineva o incercare asemanatoare sa zica. Legate direct, pe osciloscop apare la felsemnalul digital cu amplitudine de 0.6 V. Eu am experimentat asta. Daca ai facut citire seriala soft la un pin de intrare normal ( nu la pinul INT0 ) prin legare directa chiar ma intereseaza. Link spre comentariu
Liviu M Postat Noiembrie 3, 2010 Partajează Postat Noiembrie 3, 2010 PIC-PIC n-am facut, am facut in schimb PIC-FT232 (convertor serial-usb de la FTDI) si a mers fara probleme.Daca nu-ti merge, suspectez o eroare de programare (pinii PIC-urilor nu sunt corect configurati ca intrari/iesiri). Link spre comentariu
mircang9 Postat Noiembrie 3, 2010 Partajează Postat Noiembrie 3, 2010 Se poate sa ai dreptate pentru ca daca imi amintesc mai bine cele doua pic-urierau pe placi separate alimentate din regulatoare 7805 diferite sau separate pentru fiecare pic si cu masele in comun. Cand voi mai fi pus in situatia sa incerc voi alimenta cele doua microcontrollere din acelasi regulator 7805 ca sa nu mai am nevoie de translatare de semnal. Link spre comentariu
Liviu M Postat Noiembrie 3, 2010 Partajează Postat Noiembrie 3, 2010 @kit: Ai vreun motiv special pentru care folosesti USART_BRGH_LOW si nu HIGH? uChip recomanda BRGH high. It may be advantageous to use the high baud rate (BRGH = 1), or the 16-bit BRG to reduce the baud rate error, or achieve a slow baud rate for a fast oscillator frequency.@mircang9: prin aceeasi tensiune intelegeam "ambele PICURI sunt alimentate la 5V", nu "ambele PICuri sunt alimentate din aceeasi sursa". Link spre comentariu
picolo Postat Noiembrie 3, 2010 Partajează Postat Noiembrie 3, 2010 @kit: dupa ce citesti RCREG, vezi ce valoare are RCSTA pe bit 2 si 1 (FERR/OERR)mircang9:while( INTCONbits.RCIF == 0 ){Nop();}a = RCREG.eu cred ca nu este bine sa desenam asa ceva pe forumuri sunt si incepatori pe aici... sofian, ce zici? Link spre comentariu
mircang9 Postat Noiembrie 4, 2010 Partajează Postat Noiembrie 4, 2010 @Liviu M: "ce desene ?!" nu cred ca am scris prostii in afara de faptul ca sintaxa pentru structuri while( PIR1bits.RCIF == 0 ) este pentru PIC18FXXXX si while( RCIF == 0 ) pentru PIC16FXXXX. Eu lucrez acum cu PIC16F887 la Fosc = 18.432 MHz la rata de 75 bps. Pentru setarile si calculele facute cu: SYNC = 0; BRG16 = 0; BRGH = 0; X = (Fosc/rata/64) - 1 --- n-a mers. SYNC = 0; BRG16 = 0; BRGH = 1; X = (Fosc/rata/16) - 1 --- n-am incercat. SYNC = 0; BRG16 = 1; BRGH = 0; X = (Fosc/rata/16) - 1 --- a mers in sensulca citind cu Debugger in Watch variable am vazut ca ce am trimis din laptop a receptionat acelasi caracter. Ce n-am facut ca dupa char a; while( PIR1bits.RCIF == 0 ) // asteapta caracterul { Nop(); } a = RCREG; // dupa ce a receptionat caracterul il citeste si-l pune in // registrul a; // n-am testat bitii pentru overrun si frame error de care ai zis lucru care cred ca-l voi face de acum. Oricum caracterul receptionat il testam daca este bun cu o instructiune de comparare testare: if(a==0x23) // daca a = "#". Link spre comentariu
Liviu M Postat Noiembrie 4, 2010 Partajează Postat Noiembrie 4, 2010 Vezi ca ai incurcat citatele. Link spre comentariu
kit Postat Noiembrie 4, 2010 Autor Partajează Postat Noiembrie 4, 2010 ceva nu se prea leaga aici... intrebarea mea a fost pusa cu multa vreme in urma. cam tot pe vremea aia am si rezolvat-o. era BAUD rate, cu picurile legate intre ele pe direct. da' parca e o ruptura de logica in topic, nu vi se pare? Tu acolo ai pus if( RCIF == 0 ) in loc de while( INTCONbits.RCIF == 0 ){Nop();}a = RCREG.aici mi se pare ca-i aiurea... imi scapa mie ceva? Link spre comentariu
mircang9 Postat Noiembrie 4, 2010 Partajează Postat Noiembrie 4, 2010 Scuze Liviu. Citatul era al lui picolo. 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