Forum: Mikrocontroller und Digitale Elektronik Registerinhalt wird nicht gespeichert


von Christian K. (christiankarle)


Lesenswert?

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

von Joe F. (easylife)


Lesenswert?

byte_counter ist nicht 0 (uninitialisiert)?

von Jupp (Gast)


Lesenswert?


von Christian K. (christiankarle)


Lesenswert?

Meine Variablen sind alle volatile...

Auch die Initialisierung führt nicht zum Ziel...

von (prx) A. K. (prx)


Lesenswert?

Joe F. schrieb:
> byte_counter ist nicht 0 (uninitialisiert)?

Doch, wenn global.

von Christian K. (christiankarle)


Lesenswert?

Mir ist so etwas noch nie untergekommen... Es will einfach nicht 
funktionieren, er verliert irgendwie auf dem Weg zwischen ISR und Main 
die Daten...

von (prx) A. K. (prx)


Lesenswert?

Ab dem 2. Byte wird UDR in der ISR nicht gelesen => Dauer-Interrupt.

von Max D. (max_d)


Lesenswert?

kompletten Code, oder besser ein Minimalbeispiel mit dem sich das 
reproduzieren lässt, so ist das nur ne fröhliche Raterunde...

von Christian K. (christiankarle)


Angehängte Dateien:

Lesenswert?

Hier auch mal noch der gesamte C-Code:

von Me (Gast)


Lesenswert?

Was du in der Timer0 ISR anstellst ist grausig.

von Joe F. (easylife)


Lesenswert?

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...

von Christian K. (christiankarle)


Lesenswert?

@ 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...

von Christian K. (christiankarle)


Lesenswert?

@ 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.

von Me (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.