Men då skall jag alltså försöka skriva ut till LCD:n utan att använda den färdiga funktionen " LongToStr()"? För det är väl den som förstör allt antar jag?
För att lösa detta tänkte jag att det kanske går att använda en pekare för att göra en egen omvandling från long till char. Men problemet kanske kvarstår. Eller du kanske har någon bättre idé för att lösa detta?
Jag är väldigt tacksam för att du har tagit dig tid till att svara och förklara alla mina frågor.
Jag har lärt mig oerhört mycket på dina inlägg
Kod: Markera allt
#define false 0
#define true 1
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
unsigned long hastighet=0;
char svar[12];
typedef union
{
word Word;
byte Byte[2];
} T_W_AND_B;
typedef union
{
dword DW;
word WO[2];
byte BY[4];
} T_ALL_ACCESS;
T_ALL_ACCESS Pulse_Now;
T_ALL_ACCESS Pulse_Previous;
byte Overflow;dword Difference;
struct
{
byte Running : 1;
byte Update : 1;
byte Timeout : 1;
} Flag;
void interrupt(void)
{
if(PIR1.TMR1IF)
{
PIR1.TMR1IF = false;
Overflow++;
if(Overflow > 20) Flag.Timeout = true;
}
if(PIR1.CCP1IF)
{ // Pulse came on Capture
if(!Flag.Update)
{
Pulse_Now.BY[0] = CCPR1L;
Pulse_Now.BY[1] = CCPR1H;
Pulse_Now.BY[2] = Overflow;
Overflow = 0;
Flag.Update = true;
}
PIR1.CCP1IF = false;
}
}
void main(void)
{
CCP1CON = 0x04;
PIE1 = 0x05;
PIR1 = 0x00;
INTCON = 0xC0;
T1CON = 0x31;
Flag.Running = false;
Flag.Update = false;
ANSEL = 0;
ANSELH = 0;
PORTB = 0;
TRISC=0x20;
Lcd_Custom_Config(&PORTB,7,6,5,4,&PORTC,2,0,3);
Lcd_Custom_Cmd(LCD_CLEAR);
Lcd_Custom_Cmd(LCD_CURSOR_OFF);
delay_ms(1000);
while(true)
{
if(Flag.Update)
{
Pulse_Now.BY[3] = 0; // If a 16 bit overflow counter is not needed
Difference = Pulse_Now.DW - Pulse_Previous.DW;
Pulse_Previous.DW = Pulse_Now.DW;
Flag.Update = false;
hastighet = (0.65/Difference)*1000000;
LongToStr(hastighet,svar);
Lcd_Custom_Out(1, 1, "Hastighet: ");
Lcd_Custom_Out(2,1, svar );
}
if(Flag.Timeout)
{
Lcd_Custom_Out(1, 1, "Hastighet: ");
Lcd_Custom_Out(2,1, "0 " );
Flag.Timeout = false;
}
}
}
