Forum: Mikrocontroller und Digitale Elektronik usb 2.0 cypress


von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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

von ROFL (Gast)


Lesenswert?

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.

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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

von ROFL (Gast)


Lesenswert?

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.

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

Probier es mal so:

main()
{
    while(1)
    {
        PA7 = !PA7;
    }
}

Ralf

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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ß

von ROFL (Gast)


Lesenswert?

dann solltest du dich mit "timer interrupt routinen" beschäftigen.

von Christian R. (supachris)


Lesenswert?

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.

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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

von ROFL (Gast)


Lesenswert?

Ä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.

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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ß

von ROFL (Gast)


Lesenswert?

<pre>
sowas in der art:

PA7:
____/\______/\____/\__________/\___________________/\____/\_______/\____ 
/\
</pre>

von ROFL (Gast)


Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

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

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

hallo,
danke für dine antwort.

ich sehe am osci sowas:


____/\_/\_/\_/\___________________/\_/\_/\_/\___________________/\_/\_/\ 
_/\

danke.

von Ralf (Gast)


Lesenswert?

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

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

hallo,
ich programmiere mit keil.
über simulator keine ahnung.Für interrupt und das anderes,ich verwende 
den fw.c von cypress.

gruß

von Christian R. (supachris)


Lesenswert?

Ohne Timer wird das nix. Messen kann man nur mit äquidistanter 
Abtastung. Alles andere ist Schätzen.

von ROFL (Gast)


Lesenswert?

Auch mit timer wird das bei 4MB/s nichts.
Hardware FIFO. Nicht anders.

von Christian R. (supachris)


Lesenswert?

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.

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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 .

von Christian R. (supachris)


Lesenswert?

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.

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

hallo Christian,

danke für deine hilfe.

gruss

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

10% wovon? Mit dem GPIF erreichst du sowieso nicht die volle USB 
GEschwindigkeit, das muss ja die Steuersignale zwischendrurch noch 
erzeugen.

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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ß

von Christian R. (supachris)


Lesenswert?

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.

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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ß

von Christian R. (supachris)


Lesenswert?

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.

von Hallo H. (Firma: gast) (hamdou)


Lesenswert?

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