www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom & Zeit


Autor: xeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer Interupt ( OVF )?
Wenn ein Überlauf passiert springe zur Routine.

Autor: Ratber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: xeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

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

Autor: xeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, erstmal danke, und wie realisiere ich in bascom einen solchen
timeout?

Autor: Ratber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ratber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: xeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ratber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: xeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ratber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: xeus (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: xeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie sieht den ein solches interrupt in bascom aus?

Autor: crazy horse (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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$

...

Autor: Ratber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Amaleicker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: xeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Togger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: xeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Togger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: pebisoft (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: xeus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ pepisoft

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

gruß

xeus

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: oberschlau (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.