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
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.
> srx_in und /srx_out/
Es sind natürlich stx_in und stx_out gemeint, sorry.
Danke für deine Antwort was ich aber nicht verstehe warum kommt die Variable i immer richtig an und der Array Inhalt nicht ?
1 | for ( i=0;i<15;i++) |
2 | {
|
3 | uputchar(i); |
4 | uputchar(arraytest[i]); |
5 | }
|
Gruß Peter
Auch Strings kann ich problemlos 100mal hintereinander senden ohne denn kleinsten Fehler. Ich bin einfach ratlos! Ich hoffe es kann mir jemand helfen. Gruß Peter
ATTiny26? Bist Du sicher das das alles in 128 Byte RAM passt? Vielleicht sind deine Zufallszahlen schon der Stackinhalt...
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?
Gruß
Peter
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.
Wie viel muß frei bleiben um auf Nummer sicher zu gehen? Gruß Peter
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 :-)
> 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.
Das finde ich jetzt SCHADE um nicht BESCHEIDEN zu sagen!!! Leider war ich der Meinung das ich die Anzeige des Speichers voll ausnutzen kann. Dummheit schützt vor Strafe nicht!!!! Da werde ich meinen Plan nochmal überarbeiten müssen! Danke und Gruß Peter
Gib's da keine Möglichkeit das einen der Compiler oder sowas drauf hinweisst. Mich würde nich wundern wenn ich alles nächstes in diese Falle tappe. Gruß Jörg
Jackfritt schrieb: > Gib's da keine Möglichkeit das einen der Compiler oder sowas drauf > hinweisst. Tut das System doch im Rahmen seiner Möglichkeiten. 82% bei 128 Bytes Speicher insgesamt ist nun mal schon sehr hoch. > Mich würde nich wundern wenn ich alles nächstes in diese > Falle tappe. Das Mitdenken auf Maschinen abzuwälzen hat noch nie funktioniert.
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.