Kein Rechteck am Ausgang

Gast #136901
Lesenswert?

Hallo,

ich bin leider etwas schwach auf dem Gebiet der Analogelektronik. Ich
hoffe, ihr könnt mir weiterhelfen. Ich verwende einen ATMega88 und
möchte dort zu Testzwecken am Portpin PC2 ein Rechteck ausgeben
(Laufzeitmessung). Die steigende Flanke des Signal sieht gut aus, aber
die fallende Flanke ähnelt einer Entladekurve eines Kondensators. Ich
habe den Port als Ausgang definiert, interner Pullup ist vorhanden.
Mein Oszi hat eine Eingangsimpedanz von 1MOhm paralle zu 20pF. Die Zeit
der "Entladekurve" beträgt ca. 800us.

Ich bin für jede Hilfe dankbar!

Gruß
ewigerstudent74
Gast #136904
Lesenswert?

Wenn Du den Port-Pin als Ausgang definiert hast, hast Du keinen Pull-Up.
Pull-Ups gibt's nur bei Eingängen.

Sicher, dass Dein Porgramm korrekt ist? Also DDRx setzen und PORTx
abwechselnd 0 und 1?
Gast #136907
Lesenswert?

Hallo Michael,

...
DDRC = 0x00;   // Alles Ausgänge
PORTC = 0x00;  // Erst mal alles auf log "0" ziehen
...
PORTC &= ~0x02;   // log "0"
PORTC |= 0x02;    // log "1"
...

Ich denke, dass müsste passen, oder?

Gruß
Ralf
Gast #136908
Lesenswert?

Hallo,

der Tastkopf ist abgeglichen und das Oszi müsste das auch schaffen,
denn mit dem selben Oszi messe ich normalerweise noch hochfrequentere
Signale. Außerdem wird die steigende Flanke ja korrekt dargestellt.

Gruß
Ralf
Gast #136914
Lesenswert?

Hallo Michael,

das Programm besteht aus 7 Modulen, also doch etwas zu umfangreich für
Copy&Paste. Aber das wesentlich habe ich bereits gepostet. Noch einmal
in Kurzform:

//Initialisierung:
// ...
DDRC = 0x00;   // Alles Ausgänge
PORTC = 0x00;  // Erst mal alles auf log "0" ziehen
// ...


// Irgendeine Funktion
void f(void)
{
  // Flanke am Anfang der Funktion
  PORTC |= 0x02;    // log "1"
  PORTC &= ~0x02;   // log "0"

  //... Hier geschieht etwas

  // Flanke am Ende der Funktion
  PORTC |= 0x02;    // log "1"
  PORTC &= ~0x02;   // log "0"
}

Gruß
Ralf
Gast #136915
Lesenswert?

...
//Initialisierung:
// ...
DDRC = 0x00;   // Alles Ausgänge
...
Schon wieder!

DDRC muss mit 0xFF geladen werden, damit das Ausgänge werden, sonst
schaltest Du nur den PullUp an und aus.
Axel
Gast #136916
Lesenswert?

Verdammt schon wieder einen Copy&Paste-Fehler gemacht. Ich sollte halt
nicht den fehlerhaften Code aus dem obigen Post verwenden. Ich weiß, es
muss DDRC=0xFF heißen. Habe ich auch so im Quelltext stehen.

Gruß
Ralf
Gast #136921
Lesenswert?

hi,
wenn deine flanken steil ansteigen und gedämpft abfallen könntest du
den ausgang ein wenig belasten, so dass er ein paar mA liefern müsste,
um die spannung aufrecht zu halten. ich würden einfach mal 1-5kohm vom
output gegen masse legen, dann sollte der pegel zackig
'runtergezogen' werden.
gruss, harry
Gast #136922
Lesenswert?

@ewigerstudent74:

So wird das nichts...

Mach ein Testprogramm, das nichts anderes macht als in einer Schleife
den Port umschalten. Dieses Testprogramm lädst Du in Deinen Controller
und dann machst Du eine neue Messung und berichtest.

Und bitte genau dieses Testprogramm posten. Ich wette immer noch auf
Programmierfehler!!!
Gast #136923
Lesenswert?

Also ich würde den Ausgang auch erstmal mit nem 10 k Widerstand oder so
belasten, dass dürfte es verbessern. Wenn es nicht geht, nimm halt
einen schnellen Schmitt Trigger, der dürfte dann ein sauberes Rechteck
liefern.

Viele Grüße,
Micha
Gast #136924
Lesenswert?

@Michael Lippert:

Das ist doch Blödsinn, mit dem Belasten des Ausgangs!

Die AVR-Microkontroller haben Push/Pull-Ausgänge. D.h. wenn am Ausgang
eine '0' ausgegeben wird, schaltet ein interner Mosfet den Pin nach
Masse, und wenn eine '1' ausgegeben wird, schaltet ein anderer Mosfet
den Pin nach VCC.

"ewigerstudent74" hat noch immer nicht erklärt, wo sein "interner
Pullup" beim Ausgang herkommen soll, und hat noch kein korrektes
Testprogramm geschrieben und gepostet.

Es gibt für sein Problem genau zwei Möglichkeiten: Softwarefehler oder
Hardwaredefekt. Ich wette immer noch auf Softwarefehler!
Gast #136927
Lesenswert?

Dann ist mit Sicherheit der untere FET der Ausgangsstufe durchgebrannt.
(durch einen Kurzschluss gegen Vcc)
Leg den Pin mal per Software auf Low und häng einen 1k Pullup dran.
Normalerweise müssten dann trotzdem nahezu 0V anliegen.
Hier vermute ich aber 5V.
Gast #136930
Lesenswert?

Jetzt macht euch mal locker. Ihr habt ja recht, dass da was nicht
stimmt. Ich werde dem ganzen auch noch auf den Grund gehen, aber für
einen kleinen Testpin tut's erst mal die 10kOhm-Variante.

@ Michael (ein anderer): Ich glaube ein Testprog, welches einen Pin
invertiert bekomme ich gerade noch hin. Und mehr als DDRC und PORTC
braucht man dafür auch nicht.

Trotzallem danke für die Hilfe.

Gruß
Ralf
Gast #136931
Lesenswert?

Schalte mal mehr als ein Pin des selben Ports um, dann kannst Du
vergleichen.
Sonst kann ich mich nur dem anderen Michael und Benedikt anschließen:

Entweder unterer Fet defekt oder SW falsch (statt des Ports auf Low
wird das Direction-Register auf Eingang geschaltet.
Effektiv das Gegenteil von Open Collector / Open Drain, also Open
Source (diesmal nicht SW-OpenSource, sondern HW-OpenSource)).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren