george2209 Postat Iulie 10, 2010 Partajează Postat Iulie 10, 2010 Salut, Am facut un programel simplu in MikroC care sa citeasca de pe serial si sa afiseze pe LCD (4bits LCD, 2linii): sbit LCD_RS at LATD2_bit;sbit LCD_EN at LATD3_bit;sbit LCD_D4 at LATD4_bit;sbit LCD_D5 at LATD5_bit;sbit LCD_D6 at LATD6_bit;sbit LCD_D7 at LATD7_bit;sbit LCD_RS_Direction at TRISD2_bit;sbit LCD_EN_Direction at TRISD3_bit;sbit LCD_D4_Direction at TRISD4_bit;sbit LCD_D5_Direction at TRISD5_bit;sbit LCD_D6_Direction at TRISD6_bit;sbit LCD_D7_Direction at TRISD7_bit;char uart_rd[]=" ";void initializeLCD(){Lcd_Init();Lcd_Cmd(_LCD_CLEAR); // Clear displayLcd_Cmd(_LCD_CURSOR_OFF); // Cursor offLcd_Out( 1, 1, "STARTING" );Delay_ms(1000);}void main() {ADCON1 |= 0x0F; // Configure AN pins as digitalCMCON |= 7; // Turn off comparatorsUART1_Init(9600); // Initialize UART module at 9600 bpsDelay_ms(100); // Wait for UART module to stabilizeinitializeLCD();UART1_Write_Text("Start");UART1_Write(10);UART1_Write(13);while (1) { // Endless loopif (UART1_Data_Ready()) { // If data is received,uart_rd[0] = UART1_Read(); // read the received data,Lcd_Out( 1, 1, uart_rd );Delay_ms(100);}}} PIC: 18LF4520 QZ: 8,000MHz Serial cable to PC COM1 (fara chestii de genul USB to Serial convertor) Problema e ca imi citeste dintr-un string de genul: 123456789 numai 1 apoi 2 apoi 3 si apoi nu mai citeste nimica... Vre-o idee? Merci mult! Link spre comentariu
izua Postat Iulie 10, 2010 Partajează Postat Iulie 10, 2010 Faci citirea de date seriale prost. Bufferul PIC-ului are 3 bytes. Dacă nu citești în RAM datele care vin, atunci al 4lea byte blochează scrierea în bufferul (de intrare) hardware, până execuți o citire.Se vede că n-ai citit fișa tehnică. Vezi pe site la microchip, au documentație bună, doar că ai vreo 400 de pagini de citit.. Link spre comentariu
george2209 Postat Iulie 11, 2010 Autor Partajează Postat Iulie 11, 2010 Salut, Merci fain de raspuns. Problema era de fapt alta, insa ai dreptate cu bufferul: Cand se citeste de pe serial nu trebuie sa fie (sau sa existe cat mai putine) alte instructiuni intre secventele/pasii de citire. Ideea e ca trebuie citit cat mai repede in RAM. Deoarece am un program mai complex (LCD-SDCARD alt bus catre un alt microcontoler) singura solutie ramasa a fost sa folosesc intreruperile si sa citesc serialul in RAM pe intrerupere : main.....PIE1.RCIE = 1; //enable RX INTERRUPT (ma intereseaza numai RX)PIR1.RCIF = 0; //reseteaza FLAG (in mod normal e default resetat)......Oricum merci de raspuns..cat priveste cele 412 pagini ale lui 4520..clar ca nu le-am citit pe toate... Link spre comentariu
izua Postat Iulie 11, 2010 Partajează Postat Iulie 11, 2010 Mda, de obicei așa se face transmisia seriala corectă. Tu ai un buffer circular de transmisie, bagi în el, și întreruperea de final de transmisie al caracterului precedent îl va lua pe următorul. Idem și la recepție, întreruperea scrie în buffer, tu citești de acolo, și îl poți dimensiona automat, din soft, după necesități. 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