Bit banging open drain

OP #3317069
Lesenswert?

Liebe Leute,

ich betreibe mit einem Atmega Bit Banging auf vier Open Drain Ausgängen 
und beobachte eine seltsame Kapazität.

Hintergrund: Ich möchte ein 5110 LCD mit einem 5V-Arduino betreiben. Das 
Datenblatt des 5110 LCD (oder vielmehr des PCD8544-Controllers, 
http://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf) sieht 
eine maximale Versorgungs- und IO-Spannung von 3.3V vor. Der Arduino hat 
einen 3.3V-Ausgang. Für die IO-Pins (CLK, DIN, D/C, RST) möchte ich 
einen Level-Shifter vermeiden. Meine Idee war also, die IO-Pins über 
einen Pullup zu den 3.3V zu ziehen, und auf dem Atmega über DDR zwischen 
Input-Hochohmig und Output-Low hin-und-herzuschalten.

Das funktioniert mit dem LCD-Display aber nur bei einem Pullup von 
4.7kΩ. Schon ein 10kΩ-Pullup verschmiert die 250kHz-CLK-Signale bis zur 
Unkenntlichkeit.

Was ich beobachte ist folgendes: Schalte ich auf Output-Low, so fällt 
die Spannung sehr schnell auf 0V ab. Schalte ich aber auf 
Input-Hochohmig um, so braucht die Spannung bei 4.7kΩ ganze 2μs um auf 
die 3.3V anzusteigen! Dasselbe passiert wenn das LCD gar nicht 
angeschlossen ist, und auch bei Pullup zu 5V!

Wie kommt das? Wo ist diese Kapazität von so etwa 100pf versteckt?

LG, Sebastian
OP #3317916
Lesenswert?

Anja schrieb:
> 1:1 Tastkopf verwendet?

Ja. Kann das bei 250kHz schon so viel ausmachen?

besupreme schrieb:
> Gaanz dumme Querfrage - Wie lange braucht denn der Pin allein, um
> von Aktiv auf Passiv zu schalten? Das hat ja nichts mit einer von außen
> messbaren Kapazität zu tun.

Es scheint, als würde der Pin nicht sofort hochohmig, sondern würde erst 
noch ein wenig Strom aufnehmen um eine innere Kapazität zu laden.

Ich habe mal einen minimalen Aufbau versucht und Pin PB1 eines 
Atmega328P bei 8MHz mit 2μs Output-Low 2μs Input-Hochohmig gepulst und 
mit 10kΩ zu VCC 5V gezogen:
1
#include <avr/io.h>
2

3
int main(void) {  
4
    while(1) {
5
        DDRB |= 1<<DDB1; 
6
        __asm__("NOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP");
7
        __asm__("NOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP");
8
        DDRB &= ~(1<<DDB1);
9
        __asm__("NOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP");
10
        __asm__("NOP\n\tNOP\n\tNOP\n\tNOP\n\tNOP");
11
    }
12
}

Das Oszilloskop ist das DS1052E, laut Datenblatt "Input Impedance 
1MΩ±2%, the input capacity is 18pF±3pF". Der Tastkopf steht jetzt auf 
10:1 und ist neu kompensiert.

Im Anhang ein Bild des Versuchsaufbau und die Wellenform. Kein schönes 
Rechteck, wirklich nicht. Nach meiner Schätzung werden 2.5V nach 1.9μs 
erreicht, die Zeitkonstante ist also 2.75μs und bei 10kΩ damit die 
Kapazität sogar 275pF!

Was geht hier vor ???

LG, Sebastian
Angehängte Dateien:

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