Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 07.10.2006, 12:18 Titel: serielle schnittstelle läuft beim 2.mal nicht |
|
|
diese programm liest daten aus der gameboycamera heraus(128*128 byte). mit "los" wird der avr mit der cam gestartet.
die daten werden auch alle in den buffer eingelesen.
zur kontrolle lasse ich mir dann 100 bytes ausgeben.
wenn das programm beendet ist möchte ich es ein 2.mal starten,geht nicht, es bleibt hängen. erst wenn ich mit dem terminal probehalber auf com1 daten verschicke usw. dann kann ich mein freebasicprogramm wieder starten.
woran liegt das?
im terminal sehe ich , das die comschnittstelle richtig geschlossen wurde.
Code: |
screen 19,16
DIM test1 AS STRING * 10
dim test as ubyte
dim zaehler as integer
open com "COM1: 19200, N, 8, 1,CS0,DS0,TB17000,RB17000" As #1
sleep 500
test1="los"+chr(13)
print #1,test1
sleep 8000
for zaehler=0 to 100
test1=INPUT(1, #1)
PRINT ASC(test1)
next zaehler
close #1
sleep
|
Zuletzt bearbeitet von pebisoft am 07.10.2006, 16:39, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 07.10.2006, 15:44 Titel: |
|
|
Ich kenn jetzt das Protokoll dieser Cam nicht. Vielleicht muß man alle Daten entgegennehmen (also das komplette Bild). Will sagen womöglich hat es etwas mit dem Protokoll zu tun.
Andererseits könnte es sein das das Terminalprogramm den COM Port vor Benutzung, also bei Programmstart, resetiert und das es dadurch geht.
Jedoch wüsste ich jetzt nicht wie man von Basic aus dem COM resetieren könnte.
Sind jetzt nur Ideen. Hast du keine Protokolle von der Cam bzw. andere Sourcecodes aus denen man was erfahren könnte? _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 07.10.2006, 16:35 Titel: |
|
|
die cam schickt innerhalb von 8sec (128*128byte, ist die bildgrösse) 16384 byte.
ich warte mit sleep 8sec. die cam ist also schon fertig und sendet nicht mehr. es sind reine byte-daten mit einem wert von 0 bis 255. mit dem printbefehl werden die auch ausgegeben, bloss wenn ich noch einmal neu starte, läuft sich das programm tot.
der buffer ist 17000byte gross, wie du oben in der open siehst.
wenn ich mit dem tastkmanager das sich totlaufende programm herausnehme, dann läuft es beim wiederholten start wieder.
irgendwie muss die com noch resettet werden, wie du gesagt hast.
in purebasic läuft es, programmiert ist es dort nicht anders. |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 07.10.2006, 17:04 Titel: |
|
|
Tja, dann liegts wohl doch am Reset...
Probehalber könnte man mal die COM öffnen und im Anschluß gleich wieder schließen, vielleicht löst das ja nen Reset aus.
Ansonsten (denke ich) gibts vielleicht nen Interrupt o.ä. was einen Reset herbeiführt. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 07.10.2006, 17:12 Titel: |
|
|
habe ich gemacht, open und close ,das gleiche spielchen, nützt nichts
dsa totlaufende programm herausnehmen mit dem taskmanager und es läuft wieder.
ich habe freebasic 0.16 |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 07.10.2006, 17:59 Titel: |
|
|
Wieso
Und nicht
?
Ersteres kannst du mit einem Tastendruck abbrechen, das zweite wartet wirklich (rund) 8 Sekunden.
Ist zwar nur ein Detail aber vielleicht hilft es. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 07.10.2006, 18:29 Titel: |
|
|
Hallo
Ich habe mir einfach mal mit folgendem QB-Programm den Status der COM-Register anzeigen lassen.
Code: | CLS
DO
FOR a = &H3F8 TO &H3FF
PRINT USING "####"; INP(a);
NEXT
PRINT
OPEN "COM1: 19200, N, 8, 1,CS0,DS0,TB17000,RB17000" FOR RANDOM AS #1
CLOSE #1
DO
t$ = INKEY$
LOOP WHILE t$ = ""
LOOP UNTIL t$ = CHR$(27) 'Ende mit ESC |
Da kommen beim ersten Durchlauf im Modem-Steuer- und Statusregister andere Werte heraus, als bei den folgenden. Nach einem Neustart des Editors bzw. der .exe passiert wieder das gleiche. Vielleicht hilft es was, wenn du die Startwerte vom ersten Mal vor jedem Durchgang wieder in diese beiden Register schreibst.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 07.10.2006, 19:05 Titel: |
|
|
geht auch nicht.
irgend etwas wird nicht zurückgesetzt bei "close". aber was???
die sleep 8000 brauche ich, weil mit 19200baud ein bild etwas über 6sec dauert. werde später mal ein endestring senden zum pc, damit man weiss , das die übertragung zu ende ist.
vorerst muss ich dieses desaster der verschiedenen startwerte bei open com mal aus der welt schaffen.
vielen dank für eure forschungsarbeit. |
|
Nach oben |
|
 |
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 07.10.2006, 20:07 Titel: |
|
|
jetzt habe ich deinen vorschlag noch einmal aufgegriffen und habe mal ein leeres print #1 ,"" dazwischen gesetzt und es funktioniert. warum, weiss ich nicht????
Code: |
close #1
open com "COM1: 19200, N, 8, 1,CS0,DS0" As #1
print #1,""
close #1
|
|
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 07.10.2006, 20:38 Titel: |
|
|
Seis drum, das Resultat heiligt die Mittel...
meinen Glückwunsch. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 07.10.2006, 21:32 Titel: |
|
|
jetzt brauche ich in einem schwung 16384byte von der com-schnittstelle in den buffer.
wie ich jetzt raus gefunden habe, geht die höchste einstellung bei open com 4096byte. wenn ich mehr eingebe gibt es nur 4096byte und nicht die 17000, die ich vorher eingegeben habe.
wer weiss hier eine lösung.
die camera sendet die daten (16384byte) ohne unterbrechung. |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 07.10.2006, 21:46 Titel: |
|
|
Leider hab ich von FB jetzt nicht die Ahnung, aber:
in QB hätte ich das gar nicht über einen Buffer gemacht.
Ich hätte einfach String Variable mit der Länge definiert und die gelesen:
Pseudocode:
Code: | DIM test AS STRING * 16384
open com .....
input #1, test |
Danach kann man den String ja Zeichen für Zeichen in Bytes umwandeln.
In FB ist es vielleicht möglich direkt ein Array mit 16384 Bytes zu erzeugen und das per Input zu lesen (K.A.).
Vielleicht ein paar Denkansätze, aber nicht hauen wenns nicht geht, ich progge wie gesagt nicht in FB. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 07.10.2006, 23:18 Titel: |
|
|
in was für einer sprache proggst du denn? |
|
Nach oben |
|
 |
Kai Bareis

Anmeldungsdatum: 10.09.2004 Beiträge: 545 Wohnort: Baden Würtemberg
|
Verfasst am: 07.10.2006, 23:22 Titel: |
|
|
Oder per GET die einzelnen Bytes empfangen und diese immer an einen String anfügen.
Inetwa so:
Code: |
DIm as string a, b
...opencom dingens...
Do until eof(1)
get #1,,a
b=b+a
loop
Print b |
Das einzige was dann sein könnte das du am schlos das EOF senden muss damit die Schleife weiß wann schluss ist. _________________ MfG Kai Bareis
Es ist noch kein Meister vom Himmel gefallen! Warum einfach wens auch umständlich geht! |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 07.10.2006, 23:50 Titel: |
|
|
Hauptsächlich in BlitzBasic (alle Dialekte), nur noch sehr selten in QB, ansonsten noch PureBasic, Delphi, PHP und JavaScript. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 08.10.2006, 11:51 Titel: |
|
|
Hi,
evtl lieg ich ganz falsch... ich kenn mich mit der COM-Programmierung nicht so gut aus...
aber warum 8sek auf das Bild warten?
Die CAM sendet doch auf Anforderung durchgehend die 16384 Byte,
also warum nicht (wie E-P-S schon schrieb) häppchenweise (zB. je 1024 Byte) lesen und in ein Array packen, bis alle Daten da sind?
Gruß Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 08.10.2006, 14:55 Titel: |
|
|
die cam sendet die sogenannten spannungswerte pro pixel zum avr.
der adc-port vom avr wandelt die spannungswerte in werte zwischen 0 und 255.
wenn ich 16000byte(pro bild habe) das mal 8 nehme und wieder durch 19200baud teile, bekomme ich pro bild ungefähr auf 6,7sec und ich warte halt 8sec, damit ich die gewißheit habe das es komplett übertragen ist.
da es keine timingabstimmung zwischen übertagen und empfangen gibt, werden die daten nie genau zur abholzeit bereitstehen, darum abwarten bis eben halt die 16384byte im seriellen buffer liegen, wo ich eigentlich nur eine wirkung in der größeneinstellung habe und die ist eben nur 4096byte gross. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 08.10.2006, 15:38 Titel: |
|
|
speichert der AVR denn alle 16384Byte intern, und sendet erst dann?
Ich vermute er wandelt 8bit und sendet dann 1Byte über die RS232 zum PC..
Dies dauert doch nicht so lange?
Testweise probier mal:
Code: | Dim As Integer zeile, spalte
Dim As Byte Ptr img
Dim a As Byte
Screen 15,8
img = Imagecreate(128,128,1)
open com "COM1: 19200, N, 8, 1,CS0,DS0" As #1
Sleep 500
print #1,"los"+Chr(13)
For Zeile= 0 To 127
For spalte=0 To 127
a = INPUT(1, #1)
img[4+(zeile*128)+spalte] = a
Next
Put (10,10),img,Pset
Next
close #1
Sleep | kann aber als Falschfarbenbild ausgegeben werden...
zumindest siehst du ob überhaupt etwas ankommt. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 08.10.2006, 15:41 Titel: |
|
|
Hallo
Wenn ich das richtig verstanden habe, geht es darum, einen Roboter mit einer Bilderkennung auszustatten. Ich weiss nicht, wie der Controller mit der Kamera kommuniziert, aber besteht nicht die Möglichkeit, die Datenmenge vom AVR reduzieren zu lassen z.B. auf eine Auflösung von 64*64 indem nur jedes zweite Pixel in x- und y-Richtung ausgewertet wird? Für eine Hindernisserkennung sollte das immer noch ausreichen, die 4096 Byte des Puffers würden passen und die Übertragung zum Rechner ginge schneller. Acht Sekunden pro Bild finde ich für diese Anwendung sowieso etwas lang.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 08.10.2006, 15:59 Titel: |
|
|
ist nur zum test, werde später sowieso mit 115000baud arbeiten.
es soll halt erst einmal funktionieren. |
|
Nach oben |
|
 |
|