Forum: Mikrocontroller und Digitale Elektronik PIC16F877A globale variablen übergabe interrupt


von Marcel (Gast)


Lesenswert?

Hallo,
ich möchte gerne einen Wert aus einem Interrupt an meine "main()" 
übergeben,
also habe ich eine globale Variable angelegt "unsigned int coutn=0;". In 
dem interrupt wird einfach "++count;" ausgeführt aber wenn ich count 
dann im main benutzen will ist sie immer 0. ich habs auch schon mit 
"volatile unsigned int count=0;" versucht aber hat sich auch nichts 
geändert.

Ich hoffe ihr könnt mir Helfen!

1
volatile unsigned int count=0;
2
3
int interrupt ISR (void)
4
{
5
    if(TMR1IF==1)
6
    {
7
      count++;
8
9
      TMR1IF= 0;        
10
      TMR1H = 0x00;
11
      TMR1L = 0x00;
12
      return;
13
    }
14
}
15
16
17
//-------------------------------------------------------------------------
18
//Main
19
//-------------------------------------------------------------------------
20
main()
21
{
22
    init();
23
    lcd_init();
24
    ADCON0=0;
25
    GIE=1;
26
    TMR1IE=1;
27
    TMR1IF=0;
28
    TMR1H=0;
29
    TMR1L=0;
30
    T1CON=0x01;
31
    INTCON=0xC0;
32
    int x;
33
    char text[]="";
34
    while(1)
35
    {
36
        x=keyscan();
37
        
38
        if(x!=0)
39
        {
40
            lcd_clear();
41
        }
42
        sprintf(text,"%i",count);
43
        lcd_goto(0);
44
        lcd_puts(text);
45
    }
46
}

: Bearbeitet durch User
von Carsten (Gast)


Lesenswert?

Hallo Marcel,
kommst du in die interrupt Routine rein um das count++; auszuführen?
Ich glaube nein. Der Timer1 Interrupt hat 3 Enable Bits.
TMRIE, PEIE, GIE

Carsten

von Max H. (hartl192)


Lesenswert?

Versuch mal das Ganze mit dem Debugger oder MPLAB Sim anzusehen...
Oder lass in der ISR eine LED blinken damit du siehst, ob die ISR 
ausgeführt wird.

Carsten schrieb:
> PEIE, GIE
Die werden beide mit INTCON=0xC0; gesetzt.

: Bearbeitet durch User
von Marcel (Gast)


Lesenswert?

Also eine LED blinken zu lassen ist kein probelm.
Ich habe festgestellt das ich die Variable nur in der main() nicht 
benutzen kann. hab mir jetzt einfach mit na kleinen Funktion beholfen.

unsigned int test(void)
{
    char ret;
    ret=count;
    return ret;
}

und in der main() dann einfach

unsigned int y;
y=test();
sprintf(text,"%i",y);

über diesen Umweg ist es halt echt nervig.

aber mit:
unsigned int test(unsigned int ret)
{
    return ret;
}

und im main():

y=test(count);

geht es auch nicht.

von Karl H. (kbuchegg)


Lesenswert?

Marcel schrieb:
> Also eine LED blinken zu lassen ist kein probelm.
> Ich habe festgestellt das ich die Variable nur in der main() nicht
> benutzen kann.

Hast du das volatile wieder entfernt? Deine jetzige Symptombeschreibung 
würde genau in diese Richtung führen.
Das volatile brauchst du!

FAQ: Was hat es mit volatile auf sich

von Marcel (Gast)


Lesenswert?

Also das volatile ist nach wie vor da.

von Carsten (Gast)


Lesenswert?

An welcher Adresse liegt denn deine Variable count?
Macht dein Compiler automatische die Bankwechsel?

von Marcel (Gast)


Lesenswert?

Hmm das kann ich nicht so genau sagen.. also ich benutze MPLAB X IDE 
v1.90
und den MPLAB XC 8 Compiler v1.30 Free Version.. vielleicht helfen die 
Angaben ja weite

von Marcel (Gast)


Lesenswert?

Ich hab mal nachgeguckt und kann mit "bank0-3 volatile unsigned int 
count=0;" die Bank wechseln. Aber es ist egal auf welche Bank ich die 
Variable erstelle der Fehler ist immer der Gleiche.

von Klaus (Gast)


Lesenswert?

Marcel schrieb:
>char text[]="";
>.
>.
>sprintf(text,"%i",count);

Na klar, kaputter Compiler, falsche Bank, ...

MfG Klaus

von Marcel (Gast)


Lesenswert?

Ah ok ich glaub ich weiss was du meinst.. wenn ich z.B.
"char text[8]="";" schreibe vergibt er direkt den passenden Speicher und 
kommt nicht durcheinander?

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.