code:
while (TSOP_byte_transfer_counter < 300) // doing loop until 300 bytes are in.
{
_delay_us(50); // just for testing
SPI_transfer(receivedbyte); // data what you write in the ext. RAM
}
Dit gaat niet werken omdat die loop als een kip zonder kop staat te hollen zolang je "TSOP_byte_transfer_counter" < 300 is.
Dus je stuurt dus meerdere dezelfde bytes achter elkaar. (Zoals je zelf ook al gezien hebt, blijkbaar is je SPI write 6x zo snel als je uart ontvangst)
Je moet een synchronisatie maken tussen je ISR en je main loop.
Dat kan op allerlei manieren.
In jou geval wil je denk ik alleen een SPI_transfer(receivedbyte) doen als je EXACT een byte in de ISR hebt ontvangen.
Een simpele oplossing is om de vorige waarde te onthouden en dan een loopje maken die wacht tot de counter veranderd is, dan het byte versturen en de vorige waarde updaten met de huidige.
Zoiets:
code:
int counter_last = 0; // Moet ergens buiten die while loop komen
do {
// Wacht op ontvangst byte
while(counter_last != TSOP_byte_transfer_counter) {
// Burn some time
_delay_us(50);
}
SPI_transfer(receivedbyte);
} while (TSOP_byte_transfer_counter < 300);
(PS ik ga er vanuit dat je TSOP_byte_transfer_counter ook een 'int' is.)
TSOP_byte_transfer_counter en receivedbyte MOETEN volatile gedeclareerd worden!
Normaal gesproken doe je dat met semaphores (als je een O/S hebt). Of met atomic flag operaties. Maar dat gebruik je niet dus moet je het anders oplossen.
-edit- Oh ja, je even goed kijken waar je start bij de ISR, wat is je counter bij start? Is dat 0, dan moet je counter_last ook op 0 beginnen anders is je eerste byte rommel die je in de SPI RAM schrijft. Ik heb het even aangepast in het bovenstaande code block.
Ik bedenk me nu dat er nog een loop omheen moet. Ook dat aangepast.