hallo zusammen, kann mir bitte jemand ein tipp für folgende problem geben? ich verwende den usb 2.0 von cypress .Ich möchte ein port ein und danach auschalten: PA7=1; PA7=0; ich sehe das signal am osci ich sehe nicht ein ständige signalwechsel sondern jede 7.5ms kommt ein signalwechsel mit einer dauer von ca 2ms ich habe die funktion fw.c von hersteller benutzt. kann den usb irgendwie schlaffen? Danke für die Hilfe
Dieses Posting kein Sinn. Bitte kompletten Code posten und bitte nochmal verständlich beschreiben was mit dem Pin passieren soll und was zur Zeit mit dem Pin passiert.
hallo, ich habe eine funktion geschrieben die,den port PA7 ständig ein und ausschaltet. void converst(void) { PA7=1; PA7=0; } wenn ich das signal am port PA7 mittels osci betrachte,ich sehe nicht dass diese port ständig einmal high ,einmal low ist sonderen sehe ich für eine bestimmte zeit(2ms) dise port einmal high einmal low,und dann dise port Low für 5,5ms und dann wider einmal high einmal low. mit andren worten ich sehe für 5ms lowsignal (nix)dann flankenwechsel ud so weiter,dass heisst der microcontroller funktionniert in eine bestimmte zeit(signal wechsel am port PA7) dann funktionniert er nicht dann wider funktionniert und so weiter. die frage ist wieso sehe ich nicht die ganzezeit das signalam port einmal high einmal low? danke für die schnelle antwort
Ich nehme mal an deine main Funktion sieht in etwa so aus: main() { while(1) { converst(); } } Der Funktionsaufruf converst() braucht natürlich mehr Taktzyklen (=Zeit) als zwischen deinen 2 Portzugriffen PA7=1; und PA7=0; vergeht. Darum ist das gemessene Signal unsymmetrisch. Das bedeutet aber noch lange nicht, dass der Prozessor schläft oder nichts tut. Guck dir mal das Assemblerlisting an, das aus deinem C-Code generiert wird. Dann wird's dir vielleicht klar.
Hallo, Danke Rofl für deine Antwort.In main steht wie du geschrieben hast. ich habe noch leider den assembler code nicht gesehen aber ich muss später gucken.Die Frage ist , wenn die sache wie du gesagt hast ,wie wird den port nicht nur einmal toggelt ?. Danke nochmal
hallo, so geht ,aber ich möchte nicht den port einfach toggelen sonderen ich möchte für eine bestimmte zeit(mittels timer zum beispiel) ein high signal und dann für eine bestimmte zeit ein low signal. gruß
Warum nimmst du nicht den GPIF-Designer? Da kannst du doch gerade für ADCs usw. das Timing zusammenstellen, und der FX2 spielt das dann ab und lädt die ADC-Daten in die Endpoint-Buffer.
Hallo, für den tipp von Rofl: ich habe mit timer interrupt und mit der flag von timer gearbeitet aber wie ich geschriben habe ich habe nicht verstanden wieso die converst funktion funktionniert nicht richtig. für den tipp von christian: ich habe davor mit GPIF designer gearbeitet, und deswegen möchte ich jetzt die daten seriell übertragen zu probieren ,weil mittels GPIF ich kriege sehr wenig daten (obwohl eigentlich paralelle übetragung iat schnelle als seriell) .Auch bei GPIF ich sehe Mittels Labview das die digitaliesierte daten kommen manchmall richtig und dann gibt es wie ein schlaff zeit oder so danke
Die volle USB-Geschwindigkeit von knapp 42 MByte/s schafft man mit dem Chip nur, wenn man die Daten parallel in die Slave FIFOs lädt. Dazu braucht man aber eine externe Logik, einen FPGA oder CPLD. Dann kann man mit 16 Bit breitem Slave FIFO den Chip ausreizen. Alles andere ist meist wesentlich langsamer.
Hallo Christian, ich brauche nur 4MB/s, aber ich habe villeicht nict ein zentel davon gekriegt.und das ist jetzt eine andre sache. was ich nicht verstehe ist:manchmal kommt signal(sinusförmig mit richtige abtast punkte und dann kommt ein ubelappende signal dazu(keine aliasing probleme))wenn ich interpretiere ich sehe dass der cpu in eine bestimmte zeit schlaffen.kann das passieren? und noch wenn ich nur ein port umschalte wie gesagt wird dise port umgeschaltet vielmal dann nix dann nochmal gibt es dise umschaltung.und dise kommt periodisch. die frage nun ist: wenn es irgend eine taktzyklen für die mc für einige funktionen ZB gebraucht wird ist klar,aber wieso wird nicht nur einmal umgechaltet? danke für deine hilfe
Äh, sorry. Kannst du eine andere Sprache vielleicht besser als deutsch. Englisch eventuell? Ich kann dein Problem so nicht verstehen. Port umschalten, nochmal diese Umschaltung? Kommt periodisch? Grundsätzlich: Du kannst nicht davon ausgehen, dass die CPU einem strikten timing folgt. Die USB kommunikation, I2C etc erzeugen Interrupts, die deine beobachteten "Pausen" in der Abarbeitung deines codes erklären können. Wenn du in immer gleichen Abständen Daten verarbeiten musst, dann geht es nur über einen Timer-Interrupt oder über einen externen Takt am GPIF Interface (=schneller). 4MB/s ist über einen Timer-Interrupt nicht zu machen. 2000 Interrupts/s geht vielleicht gerade noch so aber nicht mehr. Also -> Kapitel im Handbuch über das FIFO Interface studieren.
hallo, ich erkläre dir nochmal das problem. wenn du das folgende quellcode hast ,was siehst du normaleweise am osci main() { while(1) { PA7 = 1; PA7=0; } } gruß
<pre> sowas in der art: PA7: ____/\______/\____/\__________/\___________________/\____/\_______/\____ /\ </pre>
die Abstände sind mit Absicht unterschiedlich lang. Denn: Du kannst nicht davon ausgehen, dass deine While-Schleife immer das gleiche Timing hat, da sie durch Interrupts unterbrochen werden kann.
Und selbst wenn keine Interrupt freigeschalten sind, wird es mit obigem Code kürzere Ein- als Aus-Phasen geben. Deswegen hab ich in meinem Code-Beispiel den Zustand invertiert, damit es wenigstens einigermaßen konstant ist... Ralf
hallo, danke für dine antwort. ich sehe am osci sowas: ____/\_/\_/\_/\___________________/\_/\_/\_/\___________________/\_/\_/\ _/\ danke.
Dann musst du jetzt noch mehr und genaue Informationen liefern. Poste deinen Code, wenn es mehr ist, dann als Anhang. - Interrupts aktiviert? - Hat das Teil einen Watchdog, der ständig einen Reset macht? - Läuft der Stack über? - Mit welcher Software programmierst du? Falls es KEIL ist, was sagt der Simulator dazu? Ralf
hallo, ich programmiere mit keil. über simulator keine ahnung.Für interrupt und das anderes,ich verwende den fw.c von cypress. gruß
Ohne Timer wird das nix. Messen kann man nur mit äquidistanter Abtastung. Alles andere ist Schätzen.
Stimmt auch wieder. Ich hatte ein kleines b gelesen, 4 Mbit/s wären ja sicher machbar. Aber 4MB/s mit der 8051-Gurke, die maximal mit 48Mhz läuft, naja.
morgen, ihr meint jetzt dass,ich die GPIF interface benutzen muss oder habe ich falch verstanden? eigentlich habe ich gedacht dass,man kann auch 4MB/s bekommen auch wenn die abgetastete daten vom ADU seriell bekommen und die voraussetzung dafür ist nur eine hohe abtastfrequenz(bis maximal 40Mhz)umd die daten zu übertragen. ich habe so überlegt: die daten kommen vom ADU seriell(16 bits), werden mit eine frequenz von ZB 24MHz abgetastet und dann werden bitweise in einer variable gespeichert und dann wird diese variable im endpunkt buffer geschrieben bis 512 byte und dann zum pc gechickt. bitte wenn ich denkfehler gemacht habe ,gibt ihr mir eure tipp. danke .
Ich schreib mal in englisch, ich glaube, dass versteht er besser. With the maximum CPU clock of only 48MHz you cannot sample 24MHz serial data. As far as i know the old 8051 core in the FX2 takes at least 4 clock cycles per instruction. You have to use either the GPIF for direct connecting to the ADC or (the better way) an external hardware like CPLD oder FPGA, which fills the slave FIFOs with the ADC data. Only in this way you can reach this data rates.
morgen, ich habe mit dem GPIF interface gearbeitet,ich kriege zwar das signal ,aber die datenmenge ist sehr wenig: ich kriege ungefähr nur 10% davon. kann jemand bitte mir sagen wie kann das passieren? danke nochmal
10% wovon? Mit dem GPIF erreichst du sowieso nicht die volle USB GEschwindigkeit, das muss ja die Steuersignale zwischendrurch noch erzeugen.
hallo Christian: ich krige nur 10% von datenmenge, dass heisst: ich muss eine übertragungs rate von 4MB/s haben:das bedeutet dass ich jede sekunde 4 mega bytes erhalten kann , aber leider ich erhalte nur ungefähr 0,4 mega bytes pro sekunde. gruß
Miss doch mal mit dem Oszilloskop, wie schnell dein GPIF arbeitet. 2 MHz Abtastrate und 16 Bit müsste doch zu schaffen sein, denke ich mal. Hab mich selbst aber nicht so genau mit dem Ding beschäftigt, weil wir 40MB/s brauchen. Und die kriegen wir auch, mit Slave FIFO.
hallo, mit dem Oszilloskop habe ich den converst signal(abtastfrequenz so zusagen) und busy signal(von Adu) gemessen,sind ziemlich ok.aber das problem ist,dass es eine sehr risiege datenverlust gibt. kann man davon ausgehen,dass wenn der usb controller die 512 bytes sendet,in diese zeit nimmt er keine daten an,aber eigentlich er sendet sehr schnell, und kann das nicht ein grund dafür. weisst du welche maximale übertragungs rate ,die der gpif leisten kann. gruß
Hm, dann musst du den Endpunkt mal doppelt oder vierfach puffern. Das geht ja einzustellen. Allerdings können dann immer noch Daten verloren gehn. Wie schnell der GPIF ist, weiß ich nicht, das war mir alles zu kompliziert, ich lasse das von einer externen Logik machen. Somt hat man 40MB/s ohne Datenverlust.
hallo, ich habe eigentlich 4 fach gepuffert. jetzt ist die frage so: diese fx2 ist ein internal master,das bedeutet dass mit GPIF kann man daten übertragen so ungefähr wie mittels einem fpga zum beipiel. und wenn mittels FPGA bis 40MB/s muss diese fx2 locker 4MB/s hinkriegen. gruß
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.