Forum: Compiler & IDEs Berechnung von intager variablen mit 8Bit Controller


von michichecker (Gast)


Lesenswert?

Hallo Zusammen

Da das meine ersten schritte sind bitte ich schon mal um verständnis.
Zur Erklärung meines Programmes
Die erste Funktion wird vom eine 8Bit Timmer aus gelöst genau nach 100µS
die dann immer 8Bit variablen hochzählen lässt.

Die zweite funktion wir vom Interrapt 0 ausgelöst und setzt alle Zähler 
vom Timmer0 auf Null zurück

Die Dritte Funktion wir vom Interrapt 1 ausgelöst und die nimmt die 
Zählerstände und stellt ein paar rechenoperationen auf.

Die erste frage kann ich mit eine 8 Bit controller (ATMEGA 32) mit 
Integer Variablen arbeiten?

Nächste frage: Kann ich die Berechnung so stehen lassen mit zaheln im 
Tausenderbereich weil ich hab ja nur 8Bit also 0....255?

Zur gesammten funktion möchte ich eigendlich nur Geschwindigkeitmessen 
messen der erste Interrapt löst die zeit aus und der 2 Interrapt stopt 
die zeit.
Die Großen Zahlen möchte ich verwenden weil ich keine kommerstellen 
haben möchte die ja abgeschnitten werden.

Ach ja ich verwende das AVR studio mit Winavr compailer.

Das Programm ist im Anhang

Danke schon mal

von Floh (Gast)


Lesenswert?

michichecker schrieb:
> Die erste frage kann ich mit eine 8 Bit controller (ATMEGA 32) mit
> Integer Variablen arbeiten?
ja.
> Nächste frage: Kann ich die Berechnung so stehen lassen mit zaheln im
> Tausenderbereich weil ich hab ja nur 8Bit also 0....255?
Seh nix...
> Das Programm ist im Anhang
nope.

von michichecker (Gast)


Lesenswert?

Dann mach ich es so


uint8_t uS100;
 uint8_t mS1;
 uint8_t mS10;
 uint8_t mS100;
 uint8_t S;
 int Hilfe;



ISR(TIMER0_OVF_vect)  // Überlauf funktion vom Timmer 0 nach 100µS
  {
    TCNT0 =-25;
    uS100++;

    if(uS100 == 10)  // Bei 1000µS wird die millisekunde um eins erhöht 
und die 100µS auf null gesetzt
    {

      uS100 = 0;
      mS1++;

    }

    if(mS1 == 10)  // Das gleiche mit 10 millisekunden
    {

      mS1=0;
      mS10++;

    }

    if(mS10 == 10)
    {

      mS10=0;
      mS100++;

    }
    if(mS100==10)
    {

      mS100=0;
      S++;

    }

  }

ISR(INT0_vect)      //Funktionskopf Interrapt 0
  {
    TCNT0 =-25;    // Setzt alle zeiten auf Null vom Timmer überlauf
    uS100=0;
    mS1=0;
    mS10=0;
    mS100=0;
    S=0;

  }

ISR(INT1_vect)      //Funktionskopf Interrapt 1
  {



    if(S>0)      // Wenn Sekunde größer alls null dann diese berechnung
    {

      Hilfe = (S*10000)+(mS100*1000)+(mS10*100)+(mS1*10)+uS100;
      Hilfe = Hilfe/10000;
      Hilfe = Hilfe*36;
      Hilfe = Hilfe/10;

    }

    if(S <=0)    // Ist sekunde kleiner gleich null diese berechnung
    {
      Hilfe = (mS100*1000)+(mS10*100)+(mS1*10)+uS100;
      Hilfe = Hilfe / 1000;
      Hilfe = Hilfe*36;
      Hilfe = Hilfe/10;
    }

  }

von Karl H. (kbuchegg)


Lesenswert?

Welche Idee steckt hinter dieser Berechnung

      Hilfe = (mS100*1000)+(mS10*100)+(mS1*10)+uS100;
      Hilfe = Hilfe / 1000;
      Hilfe = Hilfe*36;
      Hilfe = Hilfe/10;

Welchen Wert willst du letzten Endes in Hilfe haben? 
(Zahlenbereichsmässig) Durch die Divisionen schmeisst du da ja eine 
ganze Menge weg, die du vorher mühselig zusammenmultiplizert bzw. im 
Interrupt gezählt hast.

Das ist deswegen wichtig, weil du den ganzen pallawatsch rauswerfen 
kannst, indem du ganz einfach von den vielen uint8_t Variablen weggehst 
und einen uint16_t oder vielleicht gar einen uint32_t benutzt und den in 
der Interrupt Routine entsprechend hochzählst.


PS: Es heisst Interrupt (mit u) und nicht Interrapt.
Das a kommt nur in der gesprochenen Version vor, weil es ein engliches 
Wort (mit lateinischen Wurzeln) ist.


> Die erste frage kann ich mit eine 8 Bit controller (ATMEGA 32) mit
> Integer Variablen arbeiten?

Natürlich.
Das der Mega in einem Rutsch nur 8 Bit bearbeiten kann, ist das Problem 
des Compilers und nicht deines.
Du machst eine uint32_t Variable und hast damit eine Variable mit 32 
Bit. Wie der Compiler das mit den zur Verfügung stehenden Mitteln löst, 
ist sein Bier.

von Floh (Gast)


Lesenswert?

Variablen, die du sowohl im Interrupt als auch woanders verwendest, als 
volatile deklarieren.

michichecker schrieb:
> if(S <=0)    // Ist sekunde kleiner gleich null diese berechnung

S ist unsigned, kann also höchstens gleich und nicht kleiner 0 sein.

Wofür brauchst du eigentlich so hoch aufgelöste Zeiten?

von michichecker (Gast)


Lesenswert?

@kbuchegg

in Hilfe möchet ich eine zeit mit Millisekunden haben ohne kommer
also die erste zifer ist zB 5 also 500 Millisekunden die zweite sagt mit 
die 10 millisekunden und so weiter

da hast du recht das geteilt durch 1000 muss weg sonst schneide ich mir 
alles hinter der hundert milli weg
danke das hab ich noch nicht bedacht

Ich hätte gemeind wenn ich ein 8BitController hab dann darf ich auch nur 
8Bit variablen verwenden

Die Zahl in Hilfe wird nicht über 30 Tausend kommen
also würde mit eine uint16_t voll ausreichen

Die zaheln durch 5000 kann ich verwenden da gibt es auch keine probleme?

Aber dadurch das ich uint16_t verwende wird mein program um einiges 
langsammer oder?

@Floh

Stimmt das kann nur gleich sein da hast recht mein fehler

die hohe auf lösung brauch ich weil ich mit lichtschranken die die 
Interrupt aus lösen und die licht schranken nur einen Meter auseinander 
stehen und ich fahr mit RC Autos durch die bis eine geschwindigkeit von 
150 KM/h erreichen
also durch fahren sie die lichtschranken in 200 Mill Sekunden

von Floh (Gast)


Lesenswert?

So als Denkansatz für ne "elegantere" Lösung:


- Lichtschranke 1 startet den 16bit-Timer und resettet den Zählwert
- Lichtschranke 2 stoppte den 16bit-Timer

Im Zählwert des Timers steht die Zeit in z.B. 100us Schritten.
Im Hauptprogramm kannst du dann bequem den Wert auslesen und 
anzeigen/übermitteln.
:-)

von Karl H. (kbuchegg)


Lesenswert?

michichecker schrieb:

> Ich hätte gemeind wenn ich ein 8BitController hab dann darf ich auch nur
> 8Bit variablen verwenden

Das ist das Problem des Compilers und nicht deines.
Deswegen programmierst du ja in C, damit du dich um solche Kleinigkeiten 
nicht kümmern musst.

> Aber dadurch das ich uint16_t verwende wird mein program um einiges
> langsammer oder?

Nicht unbedingt.

> stehen und ich fahr mit RC Autos durch die bis eine geschwindigkeit von
> 150 KM/h erreichen

Mach dir mal da keine Sorgen.
Im Vergleich zu deinem µC ist dein Auto schnarchlangsam. Selbst wenn es 
500 km/h fahren würde.

> also durch fahren sie die lichtschranken in 200 Mill Sekunden
Das ist für deinen µC eine halbe Ewigkeit. Da kann er zwischendruch noch 
ein paar teuflisch schwierige quadratische Gleichungen(tm) lösen, damit 
ihm nicht fad wird.

von michichecker (Gast)


Lesenswert?

Super

also danke für die Hilfe
habt mir sehr stark geholfen

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.