www.mikrocontroller.net

Forum: Compiler & IDEs Subtraktion auf Mega 128


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!


Ich habe mir für meine Mega 128 eine Funktion geschrieben über die ich 
verzögerungen Starten und Abfragen kann. Sie nutzt einen 8 bit Timer 
Timer0 der assynchron mit einem Uhrenquartz läuft.

hier der Quellcode

#include "rtc.h"
#include "uart_printf.h"
#include <stdlib.h>

#define UsedTimer  TCNT0

//*********************************************************
// Init Routine zum Timer anwerfen und Teiler einstellen
//

volatile uint8_t sekunde;


void InitRtc(void)
{
  sbi(ASSR,AS0); //Assyncron mit uhrenquartz
  TCCR0 |= Timer0Teiler; //Teiler 32
  TIMSK |= _BV(TOIE0);
};

ISR(TIMER0_OVF_vect)
{
  sekunde++;
};


uint8_t delay1_4(uint8_t Command, uint16_t *Data, uint16_t Value)
{
  uint8_t RetVal=0;
  uint16_t Diff;
  //nicht blockierende Zeitverzögerung
  switch (Command)
  {
    case StartNeuTime:
    {
      (*Data) = ((uint16_t)(sekunde*256)+UsedTimer);
      
    };//case
    break;
    case GetTime:
    {
      
  NOP();
      Diff = (((sekunde*256)+UsedTimer))-(*Data); //- (*Data);
      printf("%d\n",Diff);  
      Diff = Diff;
      if(Diff >= Value)
      {
        RetVal = TimeReady;
      }
      else
      {
        RetVal = TimeIsRunning;
      };
    };//case
  };//Command
  return RetVal;
};



Nun habe ich das Problem, das die Funktion nur mit dem printf 
funktioniert, wenn ich es herrausnehme dann macht er es im ca. 1/4 
sekunden takt.

die aufrufe für die Funktion sind einmal

delay1_4(StartNeuTime,&TimeBig,0);

zum Starten und

if((delay1_4(GetTime,&TimeBig,5000)) == TimeReady)
{
....
};

zum abfragen.

Kann mir keinen reim drauf machen, einer von euche eine Idee???


Gruß Stefan

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Nochmal zur erklärung, mit dem printf rechnet er die Differenz zwichen 
dem gespeichertem wert von *Data und dem aktuellen wert richtig aus, und 
ohne dem printf verrechnet er sich. habe mittlerweile festgestellt, das 
ein

printf(printf("%d\n",sekunde);

zu dem gleichen ergebniss fürt. ohne wird die "Zeit" falsch berechnet 
und er gibt "TimeReady" aus obwohl dies noch nicht so ist und das 
Programm läuft weiter, mit dem printf funktioniert es wie gewollt....


WEiß nicht was das sein könnte.


Gruß Stefan

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>hier der Quellcode

Das ist ein Extrakt aus dem Auszug eines Teils eines Moduls des 
Quellcodes. Der Fehler ist mit Sicherheit entweder da drin, oder auch 
woanders...


Oliver

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

Bewertung
0 lesenswert
nicht lesenswert
> Nochmal zur erklärung, mit dem printf rechnet er die Differenz zwichen
> dem gespeichertem wert von *Data und dem aktuellen wert richtig aus
> ohne dem printf verrechnet er sich.

Daran glaub ich nicht.
Dein Problem wird was anderes sein. Eventuell irgendeine
Timing Sache oder eine Race Condition.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
>> ohne dem printf verrechnet er sich.
>
> Daran glaub ich nicht.


Kannst Du ruhig glauben.

Ohne das printf wird ständig nur ausgelesen, so daß der in meinem Link 
beschriebene Fall mit Sicherheit eintritt.

Das printf ist einfach nur ein Zeitverbraucher und damit wird der Fall 
seltener.


In meinem Codebeispiel wird er korrigiert, hier aber nicht.


Peter

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

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:
> Karl heinz Buchegger wrote:
>>> ohne dem printf verrechnet er sich.
>>
>> Daran glaub ich nicht.
>
>
> Kannst Du ruhig glauben.

:-)
Ich glaub trotzdem nicht dran, dass sich der µC verrechnet.
                                                ----------

Ich bin einverstanden damit, dass die Subtraktion nicht
mit den Operanden durchgeführt wird, die der OP glaubt.

Ich bin einverstanden damit, dass es irgendwelche Race
Conditions gibt. (zb. einen Overflow, der mitten
in die Berechnung hineinplatzt)

Ich bin aber nicht einverstanden damit, dass sein µC
plötzlich 3 - 2 nicht mehr rechnen kann (sprich: sich
verrechnet), nur weil kein printf() mehr im Programm ist.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Vielen Dank für die Hilfe!!!

Di Funktion von Peter habe ich auf 16 bit reduziert und bei mir 
eingebunden, jetzt funktioniert ...

habe mir das durch den kopf gehen lassen, zu zeit macht der µc nix 
anderes als darauf zu warten, das diese Zeit abgelaufen ist(wird später 
mehr werden).
Habe mir nochmal das Assamblerlisting der Alten Funtion angeschaut

156 00c0 8091 0000     lds r24,sekunde
157 00c4 22B7          in r18,82-0x20 //TCNT0

also muss ab und zu der interrupt zwischen den beiden befehlen 
dazwischen gefunkt haben sodas TCNT0 auf 0 war, sekunde jedoch noch 
nicht erhöht wurde, somit habe ich bei meiner Subtraktion ein Ergebniss 
bekommen, welches nicht korrekt war.

Gruß Stefan

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.