Hilfe gesucht Schalte nach dem Muster die einzelnen Ports (ATTiny 13) Do PortB=&B11111111 waitms 1000 PortB=&B11110100 Waitms 500 . . ect. loop Dabei werden alle 5 Ports nach einem Zeitschema geschaltet. Bei der genaueren Messung stellte sich allerdings heraus, dass die Zeiten nicht stimmen. Es sieht so aus, dass der Befehl "Loop" zusätzliche Zeit verbraucht. Läßt sich diese Zeit bestimmen ? Ist hierfür BASCOM ungeeignet ? Jeder Gedankenanstoß willkommen. Gruß Uwe
Uwe W. schrieb: > Läßt sich diese Zeit bestimmen ? ja, messen oder dem Assembler code anschauen und mit hilfe vom Datenblatt rechnen. > Ist hierfür BASCOM ungeeignet ? ja, so wie auch jeder andere Hochsprache. Zeiten kann man nur exakt mit ASM hinbekommen (oder mit timern)
Uwe W. schrieb: > Läßt sich diese Zeit bestimmen ? Messen mit dem Skop/LA > Ist hierfür BASCOM ungeeignet ? Nein, das Prinzip 'Warteschleife' Timer sind die Lösung.
Uwe W. schrieb: > Jeder Gedankenanstoß willkommen. Wenn die Zeiten auf wenige µs genau sein sollen, dann ist jede wait- oder delay-Lösung der falsche Weg. Das Zauberwort heißt Timer.
benötigst Du denn genau waitms 500 ?? Oder ginge auch waitms450 oder 550 ? Wenn ja, dann lass es so, oder erkläre einmal genauer Deine Anforderungen. Fluxskompensator
Ja die Zeiten sollten schon stimmen . Kann ich hier im Forum das Programm einmal zur Ansicht einstellen oder wie könnte eine genaue Analyse vorgenommen werden ? Natürlich kann ich mit einem Scope die Zeiten messen
Uwe W. schrieb: > Ja die Zeiten sollten schon stimmen . > Kann ich hier im Forum das Programm einmal zur Ansicht einstellen oder > wie könnte eine genaue Analyse vorgenommen werden ? Da braucht man gar nicht lange analysieren. Wenn du Zeiten auf ein paar µs genau sein müssen (und es nicht sind) und du keine Timer benutzt, dann hast du die Ursache für dein Problem. Um das zu beheben, muss aber der komplette Programmaufbau geändert werden.
Hier zur Erklärung: Das Programm $regfile = "attiny13.dat" $crystal = 1200000 Config Portb = Output $hwstack = 16 $swstack = 5 $framesize = 16 'Südlich IC2 Do Portb = &B11111111 'Alle Ausgänge auf H Waitms 1000 Portb = &B00011011 'nach 1000ms schalte Ports PB0,PB1 auf H, PB3 auf L und PB4 und PB5 auf H Waitms 500 Portb = &B00011001 Waitms 500 Portb = &B00011000 Waitms 500 Portb = &B00001010 Waitms 500 Portb = &B00001011 Waitms 1000 Portb = &B00001001 Waitms 1000 Portb = &B00010110 Waitms 1000 Portb = &B00010011 Waitms 500 Portb = &B00010001 Waitms 1000 Portb = &B00000001 Waitms 500 Portb = &B00000000 Waitms 2000 Portb = &B00011110 Waitms 1000 Portb = &B00011010 Waitms 500 Portb = &B00011000 Waitms 1000 Portb = &B00001010 Waitms 1500 Portb = &B00010000 Waitms 1000 Portb = &B00010100 Waitms 500 Portb = &B00010110 Waitms 500 Portb = &B00010010 Waitms 1000 Portb = &B00010000 Waitms 500 Portb = &B00000000 Waitms 2500 Loop Die Zeiten innerhalb des ersten Loopdurchgangs stimmen. Beim 2. und den folgenden Durchläufen entstehen am Ende des jeweiligen loops Verzögerungen. Was passiert hier fragt Uwe
Nicht nur waitms verbraucht Zeit. Auch die restlichen Befehle haben einen gewissen Zeitbedarf.
Uwe W. schrieb: > > Portb = &B00011011 'nach 1000ms schalte Ports PB0,PB1 auf H, PB3 auf L > und PB4 und PB5 auf H Der Kommentar stimmt aber nicht nicht mit dem Befehl überein. Ich könnte mir vorstellen, dass der kleine resettet, da du den Pegel von PB5 (RESET) änderst. Evtl. sieht das aus wie die Verzögerung.
Hi >Super erkannt !!! >Das kann Uwe ja leicht nachprüfen. Unsinn. Entweder ist Pin1 RESET oder PB5. Aber niemals beides gleichzeitig. MfG Spess
Dann will ich einmal berichtigen. Der Kommentar ist so richtig 'nach 1000ms schalte Ports PB0,PB1 auf H, PB3 auf L und PB4 auf H. Klar Pin 1 = Reset Wenn ich wüsste "wie" würde ich das Programm ändern. Das mit den Timern leuchtet mir ein- doch wie macht man das ? Der prinzipielle Verlauf soll sein, dass in bestimmten Zeitintervallen die Ausgänge der Ports schalten sollen. Wäre es richtig, wenn die Zeitintervalle in eine Subroutine zu stecken als wie bisher die Zeit mit "Waitms" zu erreichen ? Gruß Uwe
Uwe W. schrieb: > Dann will ich einmal berichtigen. > Der Kommentar ist so richtig > 'nach 1000ms schalte Ports PB0,PB1 auf H, PB3 auf L > und PB4 auf H. > > Klar Pin 1 = Reset > > Wenn ich wüsste "wie" würde ich das Programm ändern. > Das mit den Timern leuchtet mir ein- doch wie macht man das ? Such dir um Himmels willen im Web ein paar BASCOM Tutorien. Timer sind deine Arbeitspferde. Ohne Timer zu arbeiten ist wie Autofahren und nur im 1. Gang zu fahren. Irgendein Tut wirst du schon finden, in dem die Grundlagen über Timer vermittelt werden. Und wenn nicht, die BASCOM Hilfe ist sehr ausführlich. Bei der CONFIG TIMER Beschreibung findet sich sicher was, was man mal studieren kann. Für eine Kurzbeschreibung was ein Timer eigentlich macht http://www.mikrocontroller.net/articles/FAQ#Timer Das ist allerdings wirklich sehr kurz und sehr knapp. Ausser dem Verständnis, wie das Zeug arbeitet wirst du nicht viel mitnehmen können. Es gibt auch (dem Vernehmen nach) ganz gute Bücher zum Thema "AVR mit BASCOM". Du solltest ernsthaft in Erwägung ziehen, dir eines zu kaufen. > Wäre es richtig, wenn die Zeitintervalle in eine Subroutine zu stecken > als wie bisher die Zeit mit "Waitms" zu erreichen ? Nein. Zum mitschreiben: Waitms ist übel, böse, pfui, bäh, igit. Solange du dich nicht von diesen wir-warten Ansätzen loslöst, wirst du keine vernünftigen Timings hinkriegen. Zumindest nicht in der Genauigkeit, die dir vorschwebt.
in bascom ist die wait routine mit allen Ihren "unterarten" nur ein schaetzeisen, treten zb. Interrupts auf verlaengert sie sich tip: timerX waehlen & mit interrupt arbeiten in der ISR wird ein bit gesetzt auf das du in deinem Programm wartest Do Portb = &B11111111 'Alle Ausgänge auf H 'Waitms 1000 brauch ma nimi do loop until timerxbit = 1 timerx = neuer_wert 'timer wieder laden timerxbit = 0 Portb = &B00011011 'nach 1000ms schalte Ports PB0,PB1 auf H, PB3 auf L und PB4 und PB5 auf H . . . . . . Loop ps. f. die langen Zeiten ein 16bit Timer verwenden, i hoffe der AT13 hat einen, hab nicht nachgesehen gugg dir die versch. sachen in der Bascom Hilfe & im Tiny Datenblatt an, das hilft dir schon viel weiter, viel erfolg! @mue-c @Klatsch ich koennte mir vorstellen: http://www.youtube.com/watch?v=vNc6mIwH9lI
Hallo Charlie und Mitleser, ja ich habe verstanden- weg von Delay und Wait, hin zum Timer Für mein Projekt sind Schaltzeiten zwischen 250ms(!) und 4000ms erforderlich. Bei einem 8 Bit- Timer, wie im Attiny13, komme ich allerdings bei einem Takt von 1200Khz auf ein maximales Delay von 216ms. Zu meinem Verständnis wären zusätzliche Interrups erforderlich z.B für eine Verzögerungszeit von 4000ms (4000/216ms= 18,5 (255+18) erforderlich . Frage, wie macht man das, das ich längere Zeiten erhalte ? Gruß Uwe
PRESCALE ist dein freund PRESCALE = 64 entspr. ~5.33 ms / clk entspr. ueber 13 Sek. delay vlG Charly (nitt Charlie)
Uwe W. schrieb: > Hallo Charlie und Mitleser, > ja ich habe verstanden- weg von Delay und Wait, hin zum Timer > Für mein Projekt sind Schaltzeiten zwischen 250ms(!) und 4000ms > erforderlich. > Bei einem 8 Bit- Timer, wie im Attiny13, komme ich allerdings bei einem > Takt von 1200Khz auf ein maximales Delay von 216ms. > Zu meinem Verständnis wären zusätzliche Interrups erforderlich z.B für > eine Verzögerungszeit von 4000ms (4000/216ms= 18,5 (255+18) erforderlich Warum sollen da zusätlziche Interrupts notwendig sein? Auf einer ganz banalen Uhr hast du auch nur 1 Sekundenzeiger, der regelmässig jede eine Sekunde tickt. Und trotzdem kannst du damit problemlos Minuten, Stunden ja sogar Tage sekundengenau abmessen. Wie machst du das? Du zählst mit, wieviele Sekunden bereits vergangen sind und für 1 Minuten 15 Sekunden zählst du eben 75 Sekunden ab.
MiWi schrieb: > RTFM was zu "wait" darin steht. Herzlichen Glueckwunsch zum Blitzmerker des Jahres !
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.