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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.