Diablokiller999
Captain
- Registriert
- Jan. 2007
- Beiträge
- 3.430
Hi Leute!
Der Cortex M3 bzw. EFM32 TG110F32 ist zwar kein Einplatinencomputer sondern µCU, aber ich denke, hier kann mir eventuell auch weiter geholfen werden
Folgende Situation:
Ich möchte Daten empfangen, während mein Controller schläft und ihn mit der Verarbeitung beginnen lassen, wenn ein Paket vollständig angekommen ist. Momentan ist die Implementierung folgendermaßen:
Ein Interrupt beim Receive an der UART weckt den Controller auf und schaufelt das empfangene Byte in ein Array. Ist das Paket vollständig ( Paketlänge wird mit übertragen ), verlässt er die While-Schleife mit dem Sleep-Befehl und startet die Verarbeitung mit einer State-Machine.
Beim Erhalt des ersten Bytes wird zusätzlich ein Timer gestartet, welcher beendet wird sobald das Paket vollständig ist. Sollte es zu einem Verbindungsabbruch kommen und das Paket ist unvollständig, setzt dieser das Array und den Zeiger auf das Array wieder zurück und ein neues Paket kann empfangen werden.
Das Paket sieht folgendermaßen aus:
2 Byte Präamble + 1 Byte Length + 1 Byte Adresse + 1 Byte Command + 1-3 Byte Parameter + 2 Byte CRC
Dennoch bin ich mit der ganzen Umsetzung nicht zufrieden, da ich schon zwei Interrupts habe die mir ins System eingreifen und sogar verschachtelt auftreten können. Habt ihr eine Idee, wie ich die Anforderung anders erfüllen kann? Ein Interrupt wird wohl nötig sein, anders bekomme ich den Controller nicht auf dem Sleep, aber der Zweite ist eine Notlösung um bei unvollständigem Paket ein zurücksetzen zu ermöglichen.
Der Cortex M3 bzw. EFM32 TG110F32 ist zwar kein Einplatinencomputer sondern µCU, aber ich denke, hier kann mir eventuell auch weiter geholfen werden
Folgende Situation:
Ich möchte Daten empfangen, während mein Controller schläft und ihn mit der Verarbeitung beginnen lassen, wenn ein Paket vollständig angekommen ist. Momentan ist die Implementierung folgendermaßen:
Ein Interrupt beim Receive an der UART weckt den Controller auf und schaufelt das empfangene Byte in ein Array. Ist das Paket vollständig ( Paketlänge wird mit übertragen ), verlässt er die While-Schleife mit dem Sleep-Befehl und startet die Verarbeitung mit einer State-Machine.
Code:
#define LENGTH 2
frame_position = 0; // points to last received frame byte
received_frame[LENGTH] = 30; // give PACKET-LENGTH a fixed value
while( frame_position != received_frame[LENGTH] ) // stays in sleep mode while not received frame length and address
{
EMU_EnterEM1();
}
Code:
#define LENGTH 2
void USART0_RX_IRQHandler(void)
{ TIMER0_stop(); // stops timer after new Byte
TIMER0_start(); // Starts Timer for incomplete packe
received_frame[frame_position++] = USART0->RXDATA; // Store Byte in Package
if(frame_position == received_frame[LENGTH]) // if full frame received deactivate timer
{
TIMER0_stop();
}
}
void TIMER0_IRQHandler(void)
{
TIMER0_intclear(); // Clear overflow flag
TIMER0_stop(); // disable timer
frame_position = 0; // error while getting frame, reset frame position to zero
received_frame[LENGTH] = 30; // give PACKET-LENGTH a fixed value
}
Das Paket sieht folgendermaßen aus:
2 Byte Präamble + 1 Byte Length + 1 Byte Adresse + 1 Byte Command + 1-3 Byte Parameter + 2 Byte CRC
Dennoch bin ich mit der ganzen Umsetzung nicht zufrieden, da ich schon zwei Interrupts habe die mir ins System eingreifen und sogar verschachtelt auftreten können. Habt ihr eine Idee, wie ich die Anforderung anders erfüllen kann? Ein Interrupt wird wohl nötig sein, anders bekomme ich den Controller nicht auf dem Sleep, aber der Zweite ist eine Notlösung um bei unvollständigem Paket ein zurücksetzen zu ermöglichen.