Forum: Compiler & IDEs Subtraktion auf Mega 128


von Stefan (Gast)


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
1
#include "rtc.h"
2
#include "uart_printf.h"
3
#include <stdlib.h>
4
5
#define UsedTimer  TCNT0
6
7
//*********************************************************
8
// Init Routine zum Timer anwerfen und Teiler einstellen
9
//
10
11
volatile uint8_t sekunde;
12
13
14
void InitRtc(void)
15
{
16
  sbi(ASSR,AS0); //Assyncron mit uhrenquartz
17
  TCCR0 |= Timer0Teiler; //Teiler 32
18
  TIMSK |= _BV(TOIE0);
19
};
20
21
ISR(TIMER0_OVF_vect)
22
{
23
  sekunde++;
24
};
25
26
27
uint8_t delay1_4(uint8_t Command, uint16_t *Data, uint16_t Value)
28
{
29
  uint8_t RetVal=0;
30
  uint16_t Diff;
31
  //nicht blockierende Zeitverzögerung
32
  switch (Command)
33
  {
34
    case StartNeuTime:
35
    {
36
      (*Data) = ((uint16_t)(sekunde*256)+UsedTimer);
37
      
38
    };//case
39
    break;
40
    case GetTime:
41
    {
42
      
43
  NOP();
44
      Diff = (((sekunde*256)+UsedTimer))-(*Data); //- (*Data);
45
      printf("%d\n",Diff);  
46
      Diff = Diff;
47
      if(Diff >= Value)
48
      {
49
        RetVal = TimeReady;
50
      }
51
      else
52
      {
53
        RetVal = TimeIsRunning;
54
      };
55
    };//case
56
  };//Command
57
  return RetVal;
58
};


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

von Stefan (Gast)


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

von Peter D. (peda)


Lesenswert?


von Oliver (Gast)


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

von Karl H. (kbuchegg)


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.

von Peter D. (peda)


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

von Karl H. (kbuchegg)


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.

von Stefan (Gast)


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

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.