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
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.
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; } }
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.
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?
@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
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. :-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.