Sari la conținut
ELFORUM - Forumul electronistilor

pic to pic USART, folosind C18


kit

Postări Recomandate

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 = HSPLL
iar 2550 are:

#pragma config PLLDIV = 5		//20MHz#pragma config FOSC = HSPLL_HS   //20 MHz#pragma config CPUDIV = OSC1_PLL2
Mai 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
  • 1 an mai târziu...
  • Răspunsuri 14
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • mircang9

    7

  • Liviu M

    5

  • kit

    2

  • picolo

    1

Top autori în acest subiect

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

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

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? :nas:
Link spre comentariu

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

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

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

Link spre comentariu

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

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

@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

@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

@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 = "#". :da

Link spre comentariu

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări