Hallo zusammen,
ich habe das Projekt von Simon
Beitrag "Datenrekorder auf SD-Karte mit mega88" nachgebaut und auf eigene
Bedürfnisse angepasst. (nur die Main-Routine)
Jetzt gibt es aber in meiner Main-Routine das Problem, dass ich eine
Variable "sichern" (u08) brauche um einen Zustand zu "merken".
Deklarieren ok, aber sobald ich diese beschreibe (Wert zuweisen oder
incrementieren) läuft mein Programm amok, d.h. die gespeicherten Daten
auf SD haben nichts mehr mit der Realität zu tun!
Ich weiß, das sind dürftige Infos, aber kann man dazu eine
Fehlerdiagnose geben? Da ich erst seit kurzem mich mit C beschäftige
gibt es sicher was, dass ich einfach nur übersehen habe.
Der entsprechende Auszug
Schau dir im C-Lehrbuch deiner Wahl das Kapitel an, in dem die
Sichtbarkeit/Gültigkeit von Variablen besprochen wird. Also wo es um
globale und lokale Variablen (static oder auto) geht.
Die Position der Definition (u08 sichern=0;) deutet (#) auf eine auto
lokale Variable hin. Die Verwendung (sichern++;) und deine Beschreibung
(um einen Zustand zu "merken) deuten darauf hin, dass du einen
dauerhaften Speicherplatz willst. Beides beisst sich derzeit.
(#) Tipp: bei Codeausschnitten mindestens die komplette Funktion posten
Hallo Stefan,
Den Status brauche ich nur in der unmittelbar nachfolgenden if-Abfrage,
daher ist eine kurze Lebensdauer (nur innerhalb des Main-Blocks) sicher
angebracht.
Mir scheint es eher so, als ob irgend etwas in Speicher oder Zeiger
darauf hin verbogen werden - aber das ist mangels ausreichender Kenntnis
nur eine Deutung....
Timo
> ...tx_buf[tx_rdp_Copy]+256*tx_buf[tx_rdp_Copy+1]...
ist tx_buf[] ein char-Array?
Falls ja: dann solltest du das auf short casten. Ich bin nicht sicher,
ob der Compiler das macht (sollte er zwar mit der Konstante 256, aber
wer weiß)?
> ...tx_buf[tx_rdp_Copy] + 256*(unsigned short)tx_buf[tx_rdp_Copy+1]...
Den Rest macht dann der Compiler...
Hallo zusammen,
der Code sollte eigentlich identisch sein - sollte....
Im Anhang wirklich die aktuelle Version.
Nach wie vor gilt der folgende Codeschnipsel als problematisch. Sobald
die beiden Zeilen auskommentiert sind, läuft das Programm wie vom
Ursprungsautor gewollt.
Nicht verwirren lassen. Ich meinte natürlich, diese beiden Zeilen
auskommentieren
u08 sichern=0;
sichern++;
Danach kommt in meiner Antwort dann der Codeauszug.
@ Timo
Etwas OT, aber statt deiner selbstgebauten Funktion
write_number_u32();
könntest du doch
ltoa(); // long to ascii verwenden
>Sobald die beiden Zeilen auskommentiert sind> u08 sichern=0;
Welchen Compiler hast du? Kann der inline Variablendeklarationen
handhaben? Das ist kein Standard C-Syntax.
@Lothar: ich habe das Programm größtenteils von Simon
übernommen(Beitrag "Datenrekorder auf SD-Karte mit mega88") und bin noch
nicht in der Lage, den Code zu optimieren. Ich kämpfe noch (oder schon)
mit den Erweiterungen. Trotzdem danke für den Hinweis.
Ich nutze das AVR Studio 4.13 SP2 Build 571 mit WinAVR 20080610
Timo wrote:
> Nicht verwirren lassen. Ich meinte natürlich, diese beiden Zeilen> auskommentieren>> u08 sichern=0;> sichern++;>> Danach kommt in meiner Antwort dann der Codeauszug.
Kannst du vom Compiler die LSS Dateien mit/ohne obige Zeilen erzeugen
lassen und posten?
LSS Dateien sind gemischter ASM und C Quellcode. Die Einstellung zur
Erzeugung der LSS Dateien findest du bei den Projektoptionen von AVR
Studio.
Timo wrote:
> Hier die LSS-Files. Ich bin mal gespannt, was Du da rauslesen kannst
Leider nichts, weil die beiden Dateien nahezu identisch sind.
Unterschiede befinden sich lediglich im Bereich der Debugsymbole aber
nicht im Bereich des Quellcodes.
Für mich sieht es so aus, als ob beide Male eine Source übersetzt wurde,
die die untenstehenden Zeilen überhaupt nicht enthält!
Zeilen 524-566 aus main.c:
PORT_LED&=~PIN_LED;// kurzer Peak zum "REC"-rausmessen
43
PORT_LED&=~PIN_LED;
Zeilen 3868-3900 aus ...nicht auskommentiert....lss
1
elseif(channels&&sample==channels){
2
157c:80915601ldsr24,0x0156
3
1580:90916101ldsr25,0x0161
4
1584:8823andr24,r24
5
1586:09f4brne.+2;0x158a<main+0x438>
6
1588:45c0rjmp.+138;0x1614<main+0x4c2>
7
158a:9817cpr25,r24
8
158c:09f0breq.+2;0x1590<main+0x43e>
9
158e:5dc0rjmp.+186;0x164a<main+0x4f8>
10
adcflag=0;
11
1590:1092b104sts0x04B1,r1
12
sample=0;
13
1594:10926101sts0x0161,r1
14
if(linebrkneeded){
15
1598:2223andr18,r18
16
159a:21f0breq.+8;0x15a4<main+0x452>
17
linebrkneeded=0;
18
mmc_write_byte(0x0d);
19
159c:8de0ldir24,0x0D;13
20
159e:7cd2rcall.+1272;0x1a98<mmc_write_byte>
21
mmc_write_byte(0x0a);
22
15a0:8ae0ldir24,0x0A;10
23
15a2:7ad2rcall.+1268;0x1a98<mmc_write_byte>
24
}*/
25
26
// Schreibe Datenblock
27
//if (sichern>0)
28
//{
29
PORT_LED&=~PIN_LED;// kurzer Peak zum "REC"-rausmessen
30
15a4:2898cbi0x05,0;5
31
PORT_LED&=~PIN_LED;
32
15a6:2898cbi0x05,0;5
33
15a8:2ec0rjmp.+92;0x1606<main+0x4b4>
In Zeile 3892 (vor // Schreibe Datenblock) fehlt der komplette
Anweisungsblock zwischen den beiden // *** oben.
Hast du zum Übersetzen die Optimierung eingeschaltet? tx_rdp_Copy und
sichern wird ja nur in diesem Block benutzt und der Compiler kann die,
da hier funktionslos, ersatzlos streichen!