Forum: Mikrocontroller und Digitale Elektronik Bascom & Zeit


von xeus (Gast)


Lesenswert?

hallo,
gibt es in bascom irgendwie die möglichkeit zu sagen, dass wenn ich auf
ein byte vom uart warte dass in der zeit x aber nicht eintrift.Das das
programm wenn die zeit x verstrichen ist, etwas anderes macht?

ich hoffe man versteht was ich mein.

gruß

xeus

von Dirk (Gast)


Lesenswert?

Timer Interupt ( OVF )?
Wenn ein Überlauf passiert springe zur Routine.

von Ratber (Gast)


Lesenswert?

Mehr Informationen.

So kann ich ein halbes Dutzend mögliche Problemszenarien annehmen.

Was soll genau gemacht werden.
Ist es ein Problem des Ablaufes oder eines der Sprache.(ggf.
Codeausschnitt)
Welcher Controller (Mit oder ohne Hardware-Uart ist von Interesse)


So wie es da steht kann ich nur sagen:

Zeit merken und bei Differenz X (Dein gewünschter Zeitraum) die
UART-Abfrage einstellen.

von xeus (Gast)


Lesenswert?

soryy also hier die fakten,

ich verwende einen ATmega16 mit einem max232.
dieser sendet an einen pc eine anfrage mit printbin x
daraufhin antwortet der pc.dermc liest dieses paket mit inputbin wieder
ein und verarbeitet diese infos. nun ist es aber so, dass es mal sein
kann, dass der pc auf eine anfrage des mc nicht reagiert. das bedeutet
dass der mc solange auf eine antwort wartet bis  er eine vom pc
bekommt.

nun meine frage:

ist es nicht moglich dem mc zu sagen wenn die input routine nicht
inerhalb  von 5 s erfolgreich ist, abzubrechen oder eine andere sub
aufzurufen.

ich hoffe jetzt wirds deutlicher

von crazy horse (Gast)


Lesenswert?

das entsprechende Verfahren heisst timeout und sollte sowieso zu jeder
seriellen Kommunikation gehören.

von xeus (Gast)


Lesenswert?

ok, erstmal danke, und wie realisiere ich in bascom einen solchen
timeout?

von Ratber (Gast)


Lesenswert?

Yo,jetzt hab ich mehr Infos und kann mir auch nen Bild machen.


Wenn ich richtig verstehe schickst du Daten an den PC und erwartest
eine Antwort in einer bestimmten Zeit.
Bleibt die aus dann wird die Aktion Abgebrochen und normal
weitergemacht.

Eigentlich ist das einfach zu lösen.

Lass die Komunikation doch einfach über den Inteupt laufen (Wenigatens
den Empfang).
so kann ds Programm erstmal weiterlaufen und man verschwendet keine
Zeit mit Abfragen.
Den Timeout kannste dann über den Timer laufen lassen wie Crazy Horse
schon angedeutet hat.

So ist die Komunikation (fast) völlig losgelöst vom Rest.
Das wichtigste ist das du nicht mehr hängenbleiben kannst weil
irgendein Input auf ein Zeichen wartet das nie kommt.

von Ratber (Gast)


Lesenswert?

>ok, erstmal danke, und wie realisiere ich in bascom einen solchen
>timeout?

Schau mal in die Samples rein da ist es etrklärt

"Timer0/1" geben die Grundlagen als Beispiel und in "Timeout" gibt
es dann noch den etwas einfachen Weg mittels Befehl (Kostet Zeit weil
hier nur die Eingabe abgebrochen wird)

von xeus (Gast)


Lesenswert?

Also ich glaub nicht, dass das mit timeout funzt:

'$timeout Does Not Work With Buffered Serial Input


ich habe gepuffert.

gibts nicht irgendeine andre lösung, dass der mc eine bestimmte zeit
auf den input wartet wenn keiner in dieser zeit kommt, soll er die
anfrage wieder stellen, solange bis er input kriegt.

wär schon wenn mir jemand dazu einen bascom codeschnipsl geben könnte

gruß

xeus

von Ratber (Gast)


Lesenswert?

>Also ich glaub nicht, dass das mit timeout funzt:
>
>'$timeout Does Not Work With Buffered Serial Input


Sicher funktioniert der nicht mit Puffer.
Es geht ja darum wie du auf deine Daten wartest.
Darüber hast du ja noch nix gesagt.

von xeus (Gast)


Lesenswert?

Wie wie ich auf meine daten wart?

das ist meine ganze sub zum empfangen

sub empf
Inputbin Packete(1) , 8
end sub

nun will ich dass er z.b vom aufruf der sub 10 s zählt, wenn die zeit
abgelaufen ist soll er gosub sende ausführen und vielleicht in einer
variablen einen wert hinterlegen kann dass ich das missglückte
empfangen regestriere.

das ist alles

von Ratber (Gast)


Lesenswert?

>das ist meine ganze sub zum empfangen

Ja und genau da bleibste hängen wenn die Übertragung nicht kommt oder
Verstümmelt ist und sie deswegen nicht empfangen wird (8 Zeichen).

Mit abschalten des Puffers und $Timeout (und "Err" für die
abbrucherkennung.) kannste das schnell und einfach lösen.

Da du ja sofort nach Senden der Daten auf antwort wartest ist das nicht
Zeitkritisch.



Wie gesagt,eleganter wäre es den Puffer zu nutzen und ihn abzufragen
also in der Form:

Schleife
Abfrage ob Puffer 8 Zeichen hat,wenn ja dann Eingabe
Zeitnahme mit abbruchbedingung,Flag für Fehlererkennung
Schleifenende

So kannste das Universell einsetzen ungeachtet des Datenformates.

von xeus (Gast)


Lesenswert?

müßte ich dazu nicht erst aus der empfangsrotine raus?

von crazy horse (Gast)


Lesenswert?

da solltest du gar nicht erst rein :-)
Dazu gibts die segensreiche Erfindung des Interrupts. Erst wenn
wirklich ein Zeichen empfangen wurde, wird was aus der UART gelesen.

von xeus (Gast)


Lesenswert?

wie sieht den ein solches interrupt in bascom aus?

von crazy horse (Gast)


Lesenswert?

da fragst du mich zuviel, ich habe keine Ahnung. Allzuviele sind es hier
sowieso nicht. Die Bascom-Hilfe sollte aber einiges hergeben.

von Hannes L. (hannes)


Lesenswert?

Komplexe Aufgaben, wie das Empfangen eines Strings definierter Länge,
kann man nicht "mal so" mit einem Interrupt erschlagen.
Du musst also diese komplexe Aufgabe in kleine Einzeljobs zerlegen und
diese dann selbst verwalten.

Dies wäre z.B. in der UART-RX-ISR:

- das Empfangen eines Bytes im UART-Interrupt,
- das Anhängen dieses Bytes an den bisher bestehenden String,
- das Prüfen der Stringlänge,
- das schnellste Verlassen der ISR bei zu kurzem String,
- das Übergeben des Strings bei korrekter Länge an das Hauptprogramm
  (ein Flag setzen, das dem Hauptprogramm mitteilt, dass der String
  im SRAM gültig ist),
- das Setzen der Stringlänge (für neuen Empfang) auf 0,
- schnellstes Verlassen der ISR

Als Vorbereitung im Hauptprogramm muss mann dann eigentlich nur die
UART mit Int vorbereiten und die bereits vorhandene Stringlänge auf 0
setzen. Wenn die UART dann irgendwann mal n Bytes empfangen hat,
erkennt das Hauptprogramm das am gesetzten Flag.

Dies erfordert allerdings einen etwas anderen Programmierstiel als
 input a$
 b$=irgendwas(a$)
 print b$

...

von Ratber (Gast)


Lesenswert?

@Xeus

>wie sieht den ein solches interrupt in bascom aus?

Ist auch in der Hilfe und bei den Samples mit Beispielen erklärt.

Einfach mal laden und anschauen.
Dazu empfehle ich die Hilfe durchzustöbern.

von Amaleicker (Gast)


Lesenswert?

Wie oft will er denn noch nachfragen ?

Offensichtlich will er hier durch beharrliches nachfragen einen
passenden Codeschnipsel ohne Eigenarbeit abgreifen.

Pisa läst grüßen
Hehe

von xeus (Gast)


Lesenswert?

vielen dank für eure hilfe!

@amaleicker

hab mich schon die letzten 3 tage mit dem problem beschäftigt, es
erweckt einen falschen eindruck!

gruß

xeus

von ralf (Gast)


Lesenswert?

hallo,

schau dir mal dir bascom hilfe zu ischarwaiting() und inkey() an.
damit kannst du dir in einer schleife leicht das timeout basteln.

gruss ralf

von Togger (Gast)


Lesenswert?

Hi Zeus,
mein Namensvetter kam mir zuvor ;-)
Mit Ischarwaiting geht es am elegantesten.
Geht aber auch nur gepuffert (wichtig sonst funzt es nicht).
Du sendest ein Startbyte zum PC und fragst dann im Polling z.b. in der
Hauptschleife mit Ischarwaiting, ob eine Antwort vom PC vorliegt.
Über Interrupt wird es schwieriger, weil dann die UART Routinen
eigenhändig programmieren darfst.

lg Ralf

von xeus (Gast)


Lesenswert?

hab nun ischarwaiting eingebaut, und er erhöt nun immer wenn kein byte
vom pc vorliegt die geräte adresse +1
und sendet das paket an die neue adresse. wenn er aber nun einmal etwas
empfangen hat wars das, und bleibt bei einem erneutem nicht empfang
einfach stehen und wartet wieder so lange bis er was kriegt.

muss ich vielleicht den buffer nach dem erfolgreichen empfangen
löschen, damit er das ischarwaiting wieder von neuem richtig abfragen
kann.

gruß

xeus

von Togger (Gast)


Lesenswert?

Hi Zeus,
nö eigentlich nicht.
Es könnte mit der Syntax von Bascom zusammenhängen.
Wenn die nicht peinlich genau einhälst, dann kann Mist bei rauskommen.
Denke die haben ein paar Compilerfehlermeldungen vergessen ;-)
Hier ein kleiner Auszug der so funktioniert:

Config Serialin = Buffered , Size = 20

Dim B as Byte        ' z.b.

Do                   ' z.b. Mainloop
  B = Ischarwaiting()
  If B = 1 Then      ' ist was im Puffer?
    Inputbin B       ' Byte einlesen und auswerten
  end if

Loop

Der Puffer wird beim Einlesen geleert, brauchst also nix löschen.
Hoffe, es klappt jetzt.

lg Ralf

von pebisoft (Gast)


Lesenswert?

entwerfe ein softwareuart in bascom und hänge den an int0 oder int1 und
schon geht die post ab.
oder mach so etwas:
Dim I As Byte

Do
  If Usr.rxc = 1 Then
    I = Udr
    Select Case I
    Case "H"
      Print "Hallo AVR"
    Case "h"
      Print "hallo avr"
    Case Else
      Print "Unbekannter Befehl"
    End Select
  End If
Loop
End

mfg pebisoft

von xeus (Gast)


Lesenswert?

@ pepisoft

deine methode mit case wird wohl nicht funktionieren, da ich ein
datenpaket von 8 bytes empfange.

gruß

xeus

von Hannes L. (hannes)


Lesenswert?

> ...da ich ein datenpaket von 8 bytes empfange.

Das ist ja dein Problem. Denn du weißt ja vorher nicht, ob du ein
Datenpacket empfangen kannst oder ob überhaupt kein Datenpacket mehr
kommt.

Du musst die Bytes also einzeln empfangen (falls welche ankommen) und
selbst zum Packet (String oder Array) zusammensetzen. Denn wie willst
du sonst bei nicht vorhandenem Zeichen die Einleseroutine verlassen und
zur "Tagesordnung" übergehen?

Also:
- schaun ob Zeichen da ist
- wenn ja, dann an String anhängen
- wenn nicht, dann andere Arbeit erledigen

- wenn Stringlänge korrekt ist, dann Daten auswerten und Stringlänge
  für nächsten Empfang auf 0 setzen.

Da ein Hauptprogramm üblicherweise in einer Schleife läuft, kann das
auch in dieser Schleife erledigt werden. Besser und sicherer ist der
Empfang allerdings im Interrupt der UART.

...

von oberschlau (Gast)


Lesenswert?

Paket schreibt man nicht mit "c".
Sieht ja grausam aus !

P.S.: Kann mit mal bitte einer erklären, wie der Schnürsenkel gebunden
wird ?

von Hannes L. (hannes)


Lesenswert?

@Opährschllau:

Jou, schtümpth, tannkä vür tehn Hinnweiß.

Ta hape isch woll ti (halphärzije) Rächtschreiprepform üperpewerded.
Tenn da haißt eß, tass ti Worrde fom Schtamm appjeleided wärten. Tanach
mus eß endweter "paken" unnt "Paket" haissen, oter awwer "packen"
unnt "Packet". Schate, taß tih Räpform soo halphärzich turchjevührd
wurrte.

...

von Simon K. (simon) Benutzerseite


Lesenswert?

jo!

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.