Sari la conținut
ELFORUM - Forumul electronistilor

MikroC: read RS232 Write LCD


george2209

Postări Recomandate

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
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • izua

    2

  • george2209

    2

Top autori în acest subiect

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

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

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

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