När jag kör igång det hela så skrivs det ut "rätt information" lite då och då, men mestadels bara en massa skräp. Jag undrar om det är tänkbart att den interna oscillatorn är för onogrann för en sån här applikation? För ibland så dyker det upp relevant data på displayen men som sagt för det mesta inte..
Sen undrar jag om det räcker att stänga av mottagningen på USART:en (CREN = 0;) när jag är klar med lagringen av mina 16 tecken och vill skriva dem till LCD:n? Eller måste jag stänga av interrupts också medans jag behandlar datan?
Jag skulle uppskatta om jag kunde få lite tips på hur jag gör detta på bästa sätt!
mvh / Christian
här är koden jag använder:
Kod: Markera allt
#include <pic.h>
#include <htc.h>
#include "lcd.h"
#include "delay.h"
__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
char buffer[52]; //Databuffer
int index = 0;
void usart(void){
TRISB = 0XFF;
TRISC = 0X00; //Just for debug
PORTC = 0; //-||-
ANSELH = 0x00; //All pins digital
SPBRG = 52; //4800 bps
BRGH = 1;
TXEN = 1; //Allows sending
SYNC = 0; //The SYNC bit should be cleared to select asynchronous operation.
SPEN = 1; //SPEN bit is used to enable the entire serial port
CREN = 0;
CREN = 1; //Allows receiving
GIE = 1; //*Interrupts
PEIE = 1;
TXIE = 0; //Disable transmit interrupt
RCIE = 1; //Enable receive interrupt
}
static void interrupt isr(void){
if((RCIE)&&(RCIF)){
if(OERR){ // If overun-error has occured
CREN=0; // Re-enable receiving
CREN=1;
}
char r = RCREG;
buffer[index] = r; //Place received byte in buffer
index++; //Increment index
}
}
void main(void){
lcd_init();
lcd_clear();
lcd_posyx(0,0);
usart(); //Initialize USART
while(1){ //Do forever
if(index>=15){
CREN = 0; //Stop receiving
for(int i = 0; i <= index-1; i++){ //Print buffer
lcd_data(buffer[i]);
}
DelayMs(1000);
lcd_clear();
lcd_posyx(0,0);
index = 0;
CREN = 1; //Start receiving again
}
}
}