PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : compiler warnung



ich bins
13.11.2005, 19:03
hallo

kann mir vielleicht jemand sagen was das bedeutet und wo der fehler ist:

*** WARNING L22: CLASS RANGE NOT GIVEN IN INVOCATION LINE
CLASS: NCODE
*** WARNING L5: SECTION LOCATED OUTSIDE CLASS AREA
SECTION: ?C_USERSTACK
CLASS: NDATA
"segment" - 0 Error(s), 2 Warning(s).



void main(void)
{
DP2= 0x003F;
DP8= 0x00FF;

IEN= 1;

T2CON= 0x00C7;
T2= 0x0013;
T2IC= 0x0045;

while(1)
{
_idle_();
}
}


void segment(void) interrupt 34
{
P8= 0xC0;
P2=0x000F;
}

danke
mfg

linux_80
13.11.2005, 19:43
Hallo,

Ist das das ganze Programm ?
Mit welchem Compiler übersetzt ?
Was ist welche Zeilennummer ?
Für welchen µC soll das gehören ?
Macht das Prgramm das was du willst ?
Was sollte das Programm machen ?

SprinterSB
13.11.2005, 19:43
*Etwas* genauer wäre nett...

-- welcher Compiler ist das?
-- wo ist Zeile 22?
-- ist das die ganze Quelle?
-- ist das C-Quelle oder schon präprozessed?

Davon an sieht das interrupt 34 nicht sonderlich C-mässig aus.
Check mal die Syntax, evtl fehlen die irgendwelche Header oder cmd-line Options

ich bins
13.11.2005, 20:28
das programm schreibe ich mit keil für den infineon 167

dass das l22 und l5 etwas mit der zeilennummer zu tun hat bezweifle ich da da ich das programm erweitert habe, die warnung auch in einem anderen programm steht und trotzdem immer derselbe text steht

in diesem programm habe ich nur nicht die include dateien hinzugefügt sonst ist das das ganz programm.

das programm ruft über timer einen interrupt auf und in diesem interrupt sollen nur die ports gesetzt werden.

SprinterSB
13.11.2005, 20:38
also von kein weiß ich nur, daß so was existiert...

*Glaskugel-auspack*

Für mich sieht das eher nach einer Warnung vom Linker/Locator (ndata, segment, section...) aus und nicht vom Compiler.
Irgendwo ist bestimmt das mem-layout des c167 beschrieben, vielleicht stimmt da was nicht?
Oder beim Linker-Aufruf, (wegen ...invocation line...)

Ist "segment" vielleicht ein Schlüsselwort, das da stehen muss/nicht stehen darf?

bluebrother
14.11.2005, 00:30
Ich kenn das "segment" von einem Analog Devices DSP-Compiler. Da kann ich mit segment("foo") angeben wo eine Funktion im Speicher abgelegt wird. Allerdings muss ich da auch meine Speicherblöcke selber definieren ;-)
Was ist das denn für ein Prozessor den du benutzt? Hat der eine feste Speicheraufteilung oder muss du dich mit Linker Description Files rumschlagen? Wenn ja vermute ich dass es eine Speicherzuweisung ist an der irgendwas faul ist.

SprinterSB
14.11.2005, 10:15
Der C167 hat ne recht zersäbelte Architektur, mit segmentiertem Speicherlayout.

ich bins
17.11.2005, 11:00
hallo

ich habe hier eine 6 stellige multiplex anzeige mit ca. 1khz programmiert. wie könnte ich das programm umändern dass sie ca mit 0,5 sek. scrollt.
das problem ist ja dass sie schon gemultiplexed wird.jetzt mußte ich sie aber nocheinmal multiplexen, wenn ich mich nicht täusche


#include <reg167.h>
#include <intrins.h>

char hex[]= { 0xC0, //0
0xF9, //1
0xA4, //2
0xB0, //3
0x99, //4
0x92, //5
0x82, //6
0xF8, //7
0x80, //8
0x90, //9
0x88, //A-10
0x83, //b-11
0xC6, //C-12
0xA1, //d-13
0x86, //E-14
0x8E //F-15
};


void main(void)
{
DP2= 0x003F;
DP8= 0x00FF;

IEN= 1;

T3CON= 0x00C0;
T3= 0x09C4;
T3IC= 0x0045;

T2CON= 0x00E0;
T2= 0x09C4;
T2IC= 0x0045;

while(1)
{
_idle_();
}
}


void segment(void) interrupt 35
{
static int i;

for(i=1; i<=6; i++)
{
P2=0x0003F;

switch(i)
{
case 1:
P8= hex[0];
P2=0x003E;
break;
case 2:
P8= hex[1];
P2=0x003D;
break;
case 3:
P8= hex[2];
P2=0x003B;
break;
case 4:
P8= hex[3];
P2=0x0037;
break;
case 5:
P8= hex[4];
P2=0x002F;
break;
case 6:
P8= hex[5];
P2=0x001F;
break;
default:
P8=0x00;
P2=0x00;
break;
}
if (i==6)
i=1;
}
}

danke

mfg

SprinterSB
17.11.2005, 23:22
Nö. Die Ausgabe mach die Ausgabe (MUX von mir aus) und die Scroll-Routine scrollt. Schreib's einfach hin, es ist einfacher als du denkst.

Ein Feld data[6] das du scrollst und in der ISR

Px = hex[data[i]];

ich bins
18.11.2005, 13:57
hallo

irgendwie ist mir unklar was du meinst.

ich brauch ja auch noch einen timer der alle 0,5sek die werte auf das nächste segment verschiebt.

SprinterSB
19.11.2005, 00:18
Jau. Du brauchst zwei Zeitbasen.
Eine für den MUX zur Displayansteuerung.
Eine für den Shift (oder was auch immer).
Am einfachsten ist es , wenn du 2 Timer hast: einer macht die Ausgabe (via MUX) und der ander shiftet. Voneinander wissen müssen die beiden Routinen eigentlich nix, ausser wo die Daten liegen. Evtl muss man auf Konsistenz achten (MUX-ISR schlägt zu währen man in der Shift-Loop ist).
Falls nur 1 Timer da ist, muss man die Zeitbasen aben selber machen mit hochzählen.