mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ISR-Routine, Global Variable / Counter Erhöhen


Autor: GreenHorn_ISR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo uC-Freunde,

leider habe ich im Forum keine Antwort gefunden :-( Daher auf diesem 
Wege.

Ich erhöhe in einer ISR(sie springt auch beim Event an!) immer eine 
globale Variable nach:
volatile unsigned int temp=0;

void main()
{
//richte ISR ein --> OK
while(1);
}

ISR(INT0_vect)
{
  if (SPI_get_Return_Code_LCD() == MINUS)
    {
    temp = temp -10;  //Erhöhe
                    ausgabe();    //Gebe Wert aus
    }  
  else
    {
    temp = temp + 10; //erniedrige
                    ausgabe();
    }
}


Manchmal addiert er bei der Addition, aber manchmal erscheint dann nen 
ganz anderer Wert.. Also z.B. von 230 auf 074 oder so.. Dasselbige bei 
der Subtraktion :-(

volatile will auch nix helfen. Könnt ihr mir helfen, warum der Kollege 
beim AVR-GCC nicht "richtig" summieren und subtrahieren will ? Die 
Ausgabe ist richtig auf der "ausgabe()"

gruß

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was löst den INT0 aus? Doch nicht etwa ein Taster?

Autor: GreenHorn_ISR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne,

mit INT0 wird einfach nur erkannt, dass eine Eingabe auf einem Touch 
erfolgte...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GreenHorn_ISR wrote:
> mit INT0 wird einfach nur erkannt, dass eine Eingabe auf einem Touch
> erfolgte...
Wat isn Touch? Sicher, dass es da absolut kein Prellen gibt?

Wie wäre es denn mal mit einer etwas präziseren Ausdrucksweise?

Autor: GreenHorn_ISR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Johannes,

ok..entschuldige.Ich versuche mich zu bessern :-)

Habe ein Touchpanel EDIP320-BWLTP am SPI-Port dran hängen. Das generiert 
mir einen LOW-Pegel, wenn Daten (wie z.B. Touchtastendruck!) erzeugt 
wurde. Also ruft er bei "Daten zum abholen" die ISR "auf". Low-Pegel = 
ISR. Habe auf dem Touchpanel eine plus und eine Minustaste. Je nach 
drücken wird dann der Counter temp erhöht oder erniedrigt. Aufffallend 
ist, dass der den bei größer 250 (Var.Wert) erniedrigt. Habe gerade ein 
Oscar dran gehangen, an den INT0. Das sieht sauber aus. Wenn der Pegel 
auf Low geht. War aber ne gute Idee :-)

Ich vermute nen Programmierfehler ?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ausgabefunktionen jedweder Art haben normalerweise nichts in Interrupt 
Handlern verloren.

Autor: GreenHorn_ISR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hast recht. so klein wie möglich halten :-) In der Endsoftware werde ich 
dort nur nen BIt toggeln(StatusBit!).

gruß

Autor: GreenHorn_ISR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

habe das nun in die main erstmal verbannt. In dieser ändert sich auch 
nix an dem Verhalten. Was ja auffällig ist, dass ab 250 + 10 = 260 der 
Sprung nach Null kommt. Also hieße das ja das temp als kein Integer 
compiliert wird. Sondern als Character(also max d255). Nur das ist ja 
nicht so....

Hmm...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immer diese Codefetzen...

Ich biete dir mal zwei Antwortfetzen

Wo stellst im Code du die Probleme fest?
Wird dort vielleicht nur auf das niederwertige Byte geachtet?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ALso entweder wird deine ISR öfter angesprungen als du denkst, oder du 
hast irgendwo einen bösen Tippfehler im Programm. Aber ohne Originalcode 
wird man das nicht sagen können. Variablennamen ala i, j, temp, temp2 
sind jedenfalls immer wieder heiße Kandidaten für Scopeprobleme, die man 
gerne übersieht. Soll heißen: es gibt eine globale Variable namens temp 
aber auch eine lokale. Der Programmierer meint eigentlich die globale 
Variable, der Compiler hat aber zuerst die lokale Variable im Scope, etc 
...

Autor: GreenHorn_ISR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jungs und Helfer :-)

eig. darf ich das ja nit hier reinstellen, aber es dient ja der Bildung 
:-)
while(1)
  {

    a = (unsigned char)  temp / 10000;          
    b = ((unsigned char) temp / 1000) - (a*10000);    
    c = ((unsigned char) temp / 100 ) - (a*1000) -(b*10);  
    d = ((unsigned char) temp / 10 ) - (a*100) -(b*100)-(c*10);  
    e = ((unsigned char) temp / 1 ) - (a*10) -(b*1000)-(c*100);  
    show_content(80,50,(a+0x30));
    show_content(120,50,(b+0x30));
    show_content(160,50,(c+0x30));  
    show_content(200,50,(d+0x30));  
    show_content(240,50,(e+0x30));  
    
    
  if (STATE_LCD == 1)
    {
    STATE_LCD=0;
    if(SPI_get_Return_Code_LCD() == MINUS)
      {
      temp = temp -10;
      show_content(150,150,(0x2D));
      set_Output_I(temp);
      }  
    else
      {
      temp = temp + 10;
      show_content(150,150,(0x2B));
      set_Output_I(temp);    
      }
    }
  }
}

ISR(INT0_vect)
{
  STATE_LCD ^=1;                    

}

Autor: GreenHorn_ISR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, das war absenden anstatt vorschau... schäm
Also: show_content(..); gibt mir an Stelle X und Y den ASCII Code raus
die a-f filtern mir die einzelnen Dezimalstellen raus.
SPI_get_Return_Code_LCD() liefert mir einen Rückgabewert des Touchpanels

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    a = (unsigned char)  temp / 10000;
>    b = ((unsigned char) temp / 1000) - (a*10000);
>    c = ((unsigned char) temp / 100 ) - (a*1000) -(b*10);
>    d = ((unsigned char) temp / 10 ) - (a*100) -(b*100)-(c*10);
>    e = ((unsigned char) temp / 1 ) - (a*10) -(b*1000)-(c*100);



und das du hier temp erst mal nach unsigned char castest, beunruhigt 
dich nicht weiter :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese ganze Sequenz
    a = (unsigned char)  temp / 10000;          
    b = ((unsigned char) temp / 1000) - (a*10000);    
    c = ((unsigned char) temp / 100 ) - (a*1000) -(b*10);  
    d = ((unsigned char) temp / 10 ) - (a*100) -(b*100)-(c*10);  
    e = ((unsigned char) temp / 1 ) - (a*10) -(b*1000)-(c*100);  
    show_content(80,50,(a+0x30));
    show_content(120,50,(b+0x30));
    show_content(160,50,(c+0x30));  
    show_content(200,50,(d+0x30));  
    show_content(240,50,(e+0x30));  

kannst du ersetzen durch
  uint8_t i;
  uint16_t outnr;
...

  outnr = temp;
  for( i = 0; i < 5; ++i ) {
    show_content( 240 - i * 40, 50, outnr % 10 + '0' );
    outnr = outnr / 10;
  }

Autor: GreenHorn_ISR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jungs,

vielen Dank! So manchmal sieht man den Wald vor lauter Bäumen nicht. 
Dann habe ich mal wieder was dazugelernt. ( C-missstände von mir :-( ) 
Dachte, dass ich dann temp nicht ändere, sondern nur das für z.B a = 
Caste (wollte damit halt die nachkommastellen löschen!)#

Hmm, dann nehme ich wohl doch Modulo ( %). Davon bin ich nie so nen 
Freund...

Danke euch allen und besonders dir, KH Buchenegger!

gruß

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>volatile unsigned int temp=0;
>temp = temp -10;

Quizfrage: Was steht in einer unsigned variable der man(n) Werte < 0 
zuweist (oder genauer: wie wird dieser Wert interpretiert?

Autor: GreenHorn_ISR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist ja schon signed int... :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.