Ratlosigkeit beim Senden von Array Inhalt

OP #2656640
Lesenswert?

Hallo Leute,
ich bin schon wider mit meinem Latein am Ende.
Etwas in meinen Augen Idioten sicheres Programm will einfach nicht 
klappen.
Ich Sende über die Uart mit einer for Schleife einmal denn 
Schleifenzähler und einmal denn Array  Inhalt.
Der Schleifenzähler kommt jedes mal richtig an hingegen der Array 
Inhalt nur bis Position 5, der Rest Zufall Zahlen.
Ich verstehe einfach nicht was ich falsch mache.

Danke für Eure Unterstützung

Peter
Angehängte Dateien:
Gast #2657218
Lesenswert?

SUART.c:

>static u8 srx_in;
>static u8 srx_out;
>...
>void uputchar( u8 c )        // transmit byte
>{
>  u8 i = stx_in;
>
>  ROLLOVER( i, STX_SIZE );
>  stx_buff[stx_in] = ~c;     // complement for stop bit after data
>  while( i == vu8(stx_out)); // until at least one byte free
>                             // stx_out modified by interrupt !
>  stx_in = i;
>}

Ich würde zuerst den Abschnitt Interruptfeste Programmierung im 
Artikel Interrupt im Code implementieren. Moderne AVR-GCC sind 
optimierfreudiger als ältere Versionen und was früher ging, kann heute 
haken.

Konkret: Die gemeinsam von IRQ-Code und IRQ-Code benutzten Variablen 
srx_in und srx_out volatile kennzeichnen und den nicht 
unterbrechbaren Block (quasi die komplette Funktion) atomar.

Wenn es dann immer noch hakt, dann hilft's nix und man muss sich in die 
Fremdlibrary "Software UART with FIFO, using T1" von Peter Dannegger 
reinfuxen.
Moderator Persönliche Seite #2657504
Lesenswert?

Pier S. schrieb:
> Ja eigentlich bin ich sicher nach dem copillieren mein das Avr Studio
> Folgendes
>
> Device: attiny26
>     Program:    1684 bytes (82.2% Full)
>     (.text + .data + .bootloader)
>     Data:        109 bytes (85.2% Full)
>     (.data + .bss + .noinit)
>
> Sollte also passen?

Nein, passt höchstwahrscheinlich nicht, denn da bleiben nur 19 Bytes für 
den Stack übrig. Allein schon, wenn Du eine Funktion mit mehreren 
Argumenten aufrufst oder eine Funktion mehrere lokale Variablen 
verwendet, wirds sofort krachen.
Gast #2657508
Lesenswert?

Hmm, 128 Bytes...

Der Sendepuffer der Library hat 20, der Empfangspuffer 15, static Vars 
8,... abzüglich .data und .bss sind noch mickrige 19 Bytes RAM frei. Das 
ist ein heisser Tipp von hp-freund!

>Autor: hp-freund
>ATTiny26?
>Bist Du sicher das das alles in 128 Byte RAM passt?
>Vielleicht sind deine Zufallszahlen schon der Stackinhalt...

#if defined(_AVR_ATtiny26_)
//#warning "Attiny26"
#endif

:-)
Gast #2657516
Lesenswert?

> Wie viel muß frei bleiben um auf Nummer sicher zu gehen?

Mindestens so viel, dass alle PUSH register in den ISRs (13-15! Bytes) 
plus die lokalen Variablen plus Rücksprungadressen (2 Bytes pro 
Tiefenschritt) Platz auf dem Stack haben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren