laStudiu Postat Iunie 14, 2007 Autor Partajează Postat Iunie 14, 2007 Deci nu-si da nimeni parerea ce sa fac? ... sa schimb PICul sau sa incerc sa-i pun cuart si asa sa incerc USARTul?. :smt001 ... A folosit careva USART-ul pe oscilatorul intern ? Link spre comentariu
sofian Postat Iunie 15, 2007 Partajează Postat Iunie 15, 2007 Eu propun sa faci in felul urmator :1.Programezi PIC16F871 si faci scurt in soclu la PIC16F627 la Rx/Tx si ar trebui sa primesti acelasi date2.Acelasi lucru cu PIC16F627USART merge pe orice oscilator (intern,extern)871 si 627 trebuie programate cu aceeasi baud rate(ex.9600) Link spre comentariu
laStudiu Postat Iunie 16, 2007 Autor Partajează Postat Iunie 16, 2007 1.Programezi PIC16F871 si faci scurt in soclu la PIC16F627 la Rx/Tx si ar trebui sa primesti acelasi date1. Am programat F871 si ~ 3s dupa pornire trimit 9 caractere. Am facut scurt in soclu la F627 (care l-am tinut oprit) si am primit aceleasi date.2. Am programat F627 si la ~ 3s trimit 9 caractere. Am facut scurt in soclu la F871 (care l-am tinut oprit) si am primit alte date si framing error -- am verificat daca trimit 9 x 0xaf primesc 9 x 0xab si framing error ; daca trimit 9 x 0x33 primesc 9 x 0x00 si framing error. :smt001 ... Am obosit deja de cand tot verific. 3. .... Si ca sa fie si mai nasol se mai intampla urmatoarea anomalie: la pornire initializez USARTul:void InitUSART(void){ di(); SPBRG = 25; //129; //9600 bps (20MHz)// TXSTA = 0x24; TX9 = 0; TXEN = 1; SYNC = 0; BRGH = 1; //1// RCSTA = 0x90; SPEN = 1; RX9 = 0; CREN = 1; ADEN = 0; TXIE = 0; RCIE = 1; // receive interrupt ei();}apoi am o variabila globala "totalcount" care ~ la fiecare s se incrementeaza si am in main codul pt F627:// PIC16F627#include <htc.h>#include "init.h"#include "afisFunction.h"unsigned char timeid = 1;unsigned char totalcount = 0;unsigned char transmit = 0;unsigned char received = 0;unsigned char value = 0;unsigned char error = 0;voidmain(void){ unsigned char receptionat[16] = ""; unsigned char id = 0, write = 0, i; init(); // configureaza PICul InitPortAB(); // InitPortACED(); pentru F871 InitTimer0(); InitUSART(); while(1) { AfisTemperatura(); // pe 3cifre (afisaj cu 8 segmente) // Afisez continutul EEPROM la adr 0, 1, 2 if((totalcount == 3) & (transmit == 0)) TXIE = 1; if(received == 1) { received = 0; receptionat[id] = value; ++id; } if((totalcount == 5) & (write == 0)) { write = 1; T0IE = 0; for( i = 0; i < id; i++) EEPROM_WRITE(16 + i, receptionat[i]); if(error) EEPROM_WRITE(40, 40); else EEPROM_WRITE(40, 0); EEPROM_WRITE(41, id); T0IE = 1; } }} am acelasi cod pentru ambele PICuri. ( difera InitPort() si putin main-ul )... apoi rutina de intrerupere:// Interrupt service routines PIC16F627#include <htc.h>extern unsigned char timeid;extern unsigned char totalcount;extern unsigned char transmit;extern unsigned char received;extern unsigned char value;extern unsigned char error;void interrupt my_isr(void){ static unsigned char count = 0; unsigned char framingError = 0; unsigned char overrunError = 0; di(); if(RCIE & RCIF) { framingError = FERR; overrunError = OERR; value = RCREG; if((framingError == 0) & (overrunError == 0)) { received = 1; } else if(framingError) error = 1; } if(TXIE & TXIF) { if(transmit < 9) //corect 4 { if(transmit == 0) TXREG = 0x33; else { // value = EEPROM_READ(transmit - 1); TXREG = 0x33; } } else TXIE = 0; ++transmit; } if(T0IE & T0IF) { ++count; if(count > 35) { count = 0; ++totalcount; // variabia din if(timeid == 1) timeid = 2; else timeid = 1; } TMR0 = 0; T0IF = 0; } ei();} si acum anomalia care i-mi apare: daca pornesc ambele PICuri in loc sa primeasca fiecare 9 caractere primesc 18 caractere, adica F871 primeste de la 627 9 caractere(gresite) si apoi 9 caractere care le trimite el (le primeste inapoi).Nu stiu ce sa ma mai fac. :smt001 Link spre comentariu
laStudiu Postat Iunie 16, 2007 Autor Partajează Postat Iunie 16, 2007 Oricum cu F627 nu am reusit sa fac nimic asa ca am de gand sa-l schimb sa vad daca altu va fi mai bun. Link spre comentariu
Liviu M Postat Iunie 18, 2007 Partajează Postat Iunie 18, 2007 Da' minunea iar 627 cu oscilator intern 20 MHz. ai rezolvat-o?Ca s-ar putea sa nu mearga nimic cum trebuie, nu doar comunicatia seriala. Link spre comentariu
laStudiu Postat Iunie 18, 2007 Autor Partajează Postat Iunie 18, 2007 Da' minunea iar 627 cu oscilator intern 20 MHz. ai rezolvat-o?Ca s-ar putea sa nu mearga nimic cum trebuie, nu doar comunicatia seriala.Acum am luat un cuart de 4MHz sa vad daca cu el va merge USARTul ca restul merge bine (TIMER0 si porturile - astea le-am folosit) :smt001 . Link spre comentariu
laStudiu Postat Iunie 18, 2007 Autor Partajează Postat Iunie 18, 2007 1. Cea mai mare greseala : am legat cele doua PICuri cu 2 fire (Rx, Tx) fara referinta, abia dupa ce am conectat cuartul si am vazut ca nu merge bine USARTul am legat si al treilea fir masa la masa si functioneaza USARTul la 627 doar la transmisie, adica receptionez cu 871 datele bune, insa la receptie nu merge 627.2. Ca urmare a obsevatiei facute m-am apucat din nou pe teste cu 3 fire pe oscilatorul intern si am transmis (71h, 72h, 73h, 74h, ... ,79h) cu 627 si am observat ca daca SPBRG = 129 (9600 bps la 20MHz) primesc ceva date aiurea, insa daca setez SPBRG = 25 (9600 bps la 4Mhz) primesc la 871 datele: 71h, 72h, 57h, ... deci primele doua caractere le primesc corect => cred ca oscilatorul intern este de 4MHz care nu merge prea bine.3. Cu XT=4MHz conectat la 627 merge bine transmisia, insa receptia nu merge. Deci pot sa schimb PICul 627. Link spre comentariu
bld Postat Iunie 18, 2007 Partajează Postat Iunie 18, 2007 In rutina aia de intrerupere, resetezi pe undeva RCIF-ul? Link spre comentariu
bld Postat Iunie 18, 2007 Partajează Postat Iunie 18, 2007 Nici TXIF-ul nu vad sa-l resetezi pe undeva.Acu' nu zic ca asta-i buba, poate n-ai pus tu aici codul complet... Link spre comentariu
Liviu M Postat Iunie 19, 2007 Partajează Postat Iunie 19, 2007 => cred ca oscilatorul intern este de 4MHz care nu merge prea bine.Daca ai fi citit atent raspunsurile care ti s-au dat pana acum, ai fi descoperit chestia de mai sus ceva mai devreme si ai fi scutit ceva timp. Ca sa nu mai zic ca in foaia de catalog a lu' 627 scrie:14.2.6 INTERNAL 4 MHZ OSCILLATORThe internal RC oscillator provides a fixed 4 MHz(nominal) system clock at VDD = 5V and 25°C, see?Electrical Specifications? section for information onvariation over voltage and temperature. Link spre comentariu
laStudiu Postat Iunie 19, 2007 Autor Partajează Postat Iunie 19, 2007 In rutina aia de intrerupere, resetezi pe undeva RCIF-ul?1. Daca citesc RCREG nu se sterge RCIF ? ... Cum sa resetez TXIF ?2. Asta-i tot codul. Link spre comentariu
bld Postat Iunie 19, 2007 Partajează Postat Iunie 19, 2007 Da, ai dreptate, m-am inselat eu. Scuze. Link spre comentariu
Liviu M Postat Iunie 19, 2007 Partajează Postat Iunie 19, 2007 adica receptionez cu 871 datele bune, insa la receptie nu merge 627.Rx la 627 e sigur facut intrare? Link spre comentariu
laStudiu Postat Iunie 19, 2007 Autor Partajează Postat Iunie 19, 2007 adica receptionez cu 871 datele bune, insa la receptie nu merge 627.Rx la 627 e sigur facut intrare?Era iesire, acum l-am facut intrare si merge BINE.... :smt001 Link spre comentariu
Abram Burel Postat Iunie 19, 2007 Partajează Postat Iunie 19, 2007 Fara comentarii :axe: 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