Forum: Mikrocontroller und Digitale Elektronik Portpin auf "low ziehen"


von Peter (Gast)


Lesenswert?

Hallo,
Ich würde gerne den Pin (PortB Pin PB2) für ein paar ns "ausschalten" 
oder anhalten. Also der Pin soll für die paar ns keine Spannung 
ausgeben. Kann mir jemand sagen wie das gemacht wird?

Muss dies mit _delay_ns() erfolgen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:
> Muss dies mit _delay_ns() erfolgen?
Wenn dein UNBEKANNTER uC so schnell rechnen kann...

von Peter (Gast)


Lesenswert?

Achso, ist ein Xmega128

von Chris (Gast)


Lesenswert?

Die Taktfrequenz wäre auch noch hilfreich....

von Peter (Gast)


Lesenswert?

32Mhz

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:
> für ein paar ns
Was bedeutet "ein paar"?

von Martin (Gast)


Lesenswert?

Peter schrieb:
> Muss dies mit _delay_ns() erfolgen?

Kannst du probieren, wenn du so eine Funktion hast. Dann müßte der 
Prozessor allerdings auch entsprechend schnell laufen.

von Matthias L. (Gast)


Lesenswert?

>Also der Pin soll für die paar ns keine Spannung ausgeben

Was soll denn das werden? Keine Spannung gibt es nicht. Es könnte 
höchstens Null Volt sein, oder der Ausgangstreiber des Pins könnte 
abgeschaltet werden...

von Timmo H. (masterfx)


Lesenswert?

... und man sich dann selbst eine _delay_ns() schreibt... denn AVRGCC 
gibts nicht her.
"delay_loop_1(1)" braucht zumindest 3 Takte. Bei 32 MHz also zumindest 
9,37ns

von Jens G. (jensig)


Lesenswert?

>32Mhz

Wie willst Du bei diesem Takt den Port für wenige ns umschalten wollen? 
Minimum wäre hier wohl 32ns oder so ähnlich, die der Port mindestens in 
einem Zustand programmgesteuert verharren müsste.

von Peter (Gast)


Lesenswert?

while(1)
  {
  int data[] = {0,1,0....};

    for (int i = 0; i< sizeof(data); i++){

      _delay_ms(10);


      if(data[i]==1) {
                       methode();

          }
      else {
                      methode();
Also ich habe ein array mit "einsen" und "nullen". Wenn eine 1 kommt, 
bekomme ich für 10ms ein Sinussignal. Nach dieser Zeit soll für einen 
kurzen Moment 0 Volt ausgegeben werden, damit ich zwischen den zwei 
verschiedenen Signalen einen Pause bekomme. Momentan gehen die einfach 
in einander über.

von friedrich (Gast)


Lesenswert?

32MHz entspricht ca. 31ns pro Takt.
Sind bei drei Takten dann schon 93ns.

Grüße

von AVR-Fan (Gast)


Lesenswert?

Mit den ASM-Befehlen "CBI" und "SBI" sind es beim XMEGA
zwei Zyklen, einer pro Befehl. (Lt. ASM-Help vom Studio 4.18)

Immer noch 62ns, schneller geht es nicht mit dieser HW.

von Peter (Gast)


Lesenswert?

Schonmal danke für eurer hilfe.
Könnt ihr mir denn sagen wo genau ich das in der for-schleife 
hinschreiben muss, dass ich zb nach jeder 1 oder 0 200 µs 0 Volt 
bekommen?

von Peter (Gast)


Lesenswert?

Besser nehmen wir erstmal eine Zeit , die Ich auch auf dem Oska sehen 
kann.

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Schonmal danke für eurer hilfe.
> Könnt ihr mir denn sagen wo genau ich das in der for-schleife
> hinschreiben muss, dass ich zb nach jeder 1 oder 0 200 µs 0 Volt
> bekommen?

Ähm.
Nachdem du ausgegeben hast:
   den Portpin auf 0 schalten
   etwas warten


So schwer sollte das doch nicht zu integrieren sein.
Wo machst du denn die Ausgabe? Gleich dahinter fügst du das ein.

von Peter (Gast)


Lesenswert?

PORTA.OUTCLR = 0x02 wird so der Pin PA2 auf null gesetzt oder
PORTA.OUT &= ~(1<<PIN2) ?

von Timmo H. (masterfx)


Lesenswert?

Was genau willst du eigentlich machen? Falls du einfach nur 
Rechtecksignal generieren willst, würde ich das über PWM machen, da du 
dann keine Rechenzeit verschwendest. Das würde dann völlig unabhängig 
von deiner Applikation laufen.

von Peter (Gast)


Lesenswert?

Ich habe ein FSK moduliertes Signal mit zwei Frequenzen und möchte 
zwischen jeder 1 und jeder 0 eine "kleine" pause haben , an dem keine 
Spannung also 0 volt am pin anliegt.

von Daniel S. (ds1982)


Lesenswert?

Peter schrieb:
> Ich habe ein FSK moduliertes Signal mit zwei Frequenzen und möchte
> zwischen jeder 1 und jeder 0 eine "kleine" pause haben , an dem keine
> Spannung also 0 volt am pin anliegt.

Wozu die Pause? Diese hat ja theoretisch auch ne Frequenz, nämlich 0, 
wäre also schon die dritte Frequenz!?

von Peter (Gast)


Lesenswert?

Die Pause brauche ich deswegen, weil der Frequenzwechsel nicht im 
Nulldurchgang erfolgt. Momentan habe ich immer so ein "knacken" bei 
jedem Frequenzwechsel.

von Dietrich L. (dietrichl)


Lesenswert?

Peter schrieb:
> Die Pause brauche ich deswegen, weil der Frequenzwechsel nicht im
> Nulldurchgang erfolgt. Momentan habe ich immer so ein "knacken" bei
> jedem Frequenzwechsel.

Die Pause knackt aber genauso. Also solltest Du den Frequenzwechsel mit 
dem0-Durchgang synchronisieren.

Gruß Dietrich

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.