Forum: Mikrocontroller und Digitale Elektronik Bascom- Befehle - Zeiten


von Uwe W. (uwel)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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)

von Lukas K. (carrotindustries)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Luchs (Gast)


Lesenswert?

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

von uwe (Gast)


Lesenswert?

Fluxkompressor !!!

von uwe (Gast)


Lesenswert?


von Uwe W. (uwel)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Uwe W. (uwel)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Nicht nur waitms verbraucht Zeit. Auch die restlichen Befehle haben 
einen gewissen Zeitbedarf.

von mue-c (Gast)


Lesenswert?

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.

von Klatsch (Gast)


Lesenswert?

Mue-c,

Super erkannt !!!

Das kann Uwe ja leicht nachprüfen.

von spess53 (Gast)


Lesenswert?

Hi

>Super erkannt !!!

>Das kann Uwe ja leicht nachprüfen.

Unsinn. Entweder ist Pin1 RESET oder PB5. Aber niemals beides 
gleichzeitig.

MfG Spess

von Wolfgang S. (wsm)


Lesenswert?


von Uwe W. (uwel)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Charly B. (charly)


Lesenswert?

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

von Uwe W. (uwel)


Lesenswert?

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

von Charly B. (charly)


Lesenswert?

PRESCALE ist dein freund

PRESCALE = 64 entspr. ~5.33 ms / clk entspr. ueber
13 Sek. delay

vlG
Charly  (nitt Charlie)

von MiWi (Gast)


Lesenswert?

Uwe W. schrieb:
> Jeder Gedankenanstoß willkommen.



RTFM was zu "wait" darin steht.

Grüße
MiWi

von Karl H. (kbuchegg)


Lesenswert?

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.

von Charly B. (charly)


Lesenswert?

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
Noch kein Account? Hier anmelden.