Hallo,
ich habe folgendes Problem, ich habe ein uint8_t Array außerhalb der
main-Methode deklariert, um es global zu machen. Außerdem benutze ich
einen USART um serielle Daten zu empfangen.
Nun möchte ich in einer ISR die empfangenen Daten in genau dieses Array
schreiben.
C-Code:
volatile uint8_t byte_counter;
volatile uint8_t Data_12 [ 36 ];
.... main ( ) ....
ISR ( USART_RXC_vect ) // USART Rx interrupt function
{
if ( byte_counter == 0 )
{
Data_12 [ 0 ] = UDR;
byte_counter ++;
}
}
schicke ich nun also seriell eine 255 an den uC, so wird diese erkannt.
Sobald jedoch der uC die ISR verlässt, scheint die 255 wieder gelöscht
zu werden! Im gesamten Programm finden jedoch keine weiteren
schreibzugriffe auf dieses Array statt...
Bitte um Erklärung
LG Christian
Meine Variablen sind alle volatile... Auch die Initialisierung führt nicht zum Ziel...
Mir ist so etwas noch nie untergekommen... Es will einfach nicht funktionieren, er verliert irgendwie auf dem Weg zwischen ISR und Main die Daten...
Ab dem 2. Byte wird UDR in der ISR nicht gelesen => Dauer-Interrupt.
kompletten Code, oder besser ein Minimalbeispiel mit dem sich das reproduzieren lässt, so ist das nur ne fröhliche Raterunde...
Und woher weisst du, dass der UART Interrupt überhaupt funktioniert? a) denke ich, dass der Timer-Interrupt ihn ständig blockiert b) denke ich, dass du eigentlich sowas hier im UART-Interrupt machen möchtest:
1 | ISR ( USART_RXC_vect ) // USART Rx interrupt function |
2 | {
|
3 | if ( byte_counter < 35 ) |
4 | {
|
5 | Data_12 [ byte_counter ] = UDR; |
6 | byte_counter ++; |
7 | }
|
8 | |
9 | }
|
c) die Funktion Update_Data() rufst du nicht zufällig doch irgendwo auf? d) Whitespaces kosten zwar nichts, machen den Code aber auch nicht immer lesbarer...
@ Me War nur zum Testen, falls das Problem dort liegt. Der USART Interrupt funktioniert! Habe ihn gerade mittels Oszi und Pin getestet. Meine Daten werden immer noch nicht gespeichert...
@ Joe. F. Ja, wollte ich machen, hab ich auch so programmiert, um das Problem jedoch zu isolieren, habe ich versucht im hier geposteten Code nur das Erste Byte zu betrachten.
Christian K. schrieb: > @ Me War nur zum Testen, falls das Problem dort liegt. > > Der USART Interrupt funktioniert! Habe ihn gerade mittels Oszi und Pin > getestet. > > Meine Daten werden immer noch nicht gespeichert... Versuch mal alles was nichts mit dem USART zu tun hat abzuschalten: SPI, TIMER, usw. Damit kannst du ausschliessen, dass ein evtl. falsch konfigurierter Funktionsblock fuer den boesen Zauber verantwortlich ist (hab' sowas schon erlebt).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.