Problemet är att när jag försöker köra den via interrupt på negativ flank på INT1 (dvs startbiten) så blir resultatet helt annorlunda mot när jag pollar startbiten.
Jag kör med intern oscillator på 8 MHz.
Koden ser ut följande:
Interruptfunktionen
Kod: Markera allt
void interrupt isr(void)
{
if(INT1IF == 1)
{
SW_UART_RX_Int();
INT1IF = 0;
}
}
Kod: Markera allt
void SW_UART_RX_Int()
{
char i, c = 0;
if(RX_PIN == 0) // Start bit
{
UART_Delay();
HALF_DELAY(); // Hamna mitt i biten
for(i = 0; i < 8; i++)
{
c = (c >> 1) & 0x7F;
c = c | (RX_PIN << 7); // LSB först!
UART_Delay();
}
getChar = c;
}
}
Kod: Markera allt
char getChar = 0;
char SW_UART_GetChar()
{
char c;
char lastGIE = GIE;
GIE = 0;
c = getChar;
getChar = 0;
GIE = lastGIE;
return c;
}
De olika looparna
Kod: Markera allt
GIE = 0; //Stäng av interrupt
// Denna loop läser UART korrekt via pollning
while(1)
{
CLRWDT();
SW_UART_RX_Int(); //
swc = SW_UART_GetChar();
if(swc != 0)
{
SW_UART_PutString("Du tryckte: ");
SW_UART_PutChar(swc);
SW_UART_PutString("\r\n");
}
}
// Denna loop läser ut felaktiga värden via interrupt där SW_UART_RX_Int körs
GIE = 1; //Slå på interupt
while(1)
{
CLRWDT();
swc = SW_UART_GetChar();
if(swc != 0)
{
SW_UART_PutString("Du tryckte: ");
SW_UART_PutChar(swc);
SW_UART_PutString("\r\n");
}
}
Det körs inga interrupt utöver INT1.
De felaktiga värdena blir (inom parentes anges det decimala värdet)
1 (49)
Du tryckte: ó (243)
2 (50)
Du tryckte: ™ (153)
3 (51)
Du tryckte: ó (243)
4 (52)
Du tryckte: š (154)
5 (49)
Du tryckte: ÿ (255)
6 (49)
Du tryckte: › (155)
7 (49)
Du tryckte: ÿ (255)
8 (49)
Du tryckte: œ (156)
9 (49)
Du tryckte: ó (243)
0 (48)
Du tryckte: ˜ (152)
Jag kan inte förstå varför dessa loopar beter sig annorlunda. Någon som har någon ide vad som kan orsaka detta?