Forum: Mikrocontroller und Digitale Elektronik Arduino ausgang hochohmig - Ich seh eine Ladekurve statt direktes Schalten


von Ra S. (mcfloppy)


Lesenswert?

Hallo Leute,

ich hab hier ein komisches Phänomen...
Hier liegen einige selbstgefertigte Moteinos (AVR Mini Pro mit RFM69 
Modul) welche sich alle gleich verhalten: Schalte ich einen Pin in 
Software ein folgt das signal relativ zügig - schalte ich diesen wieder 
aus(selbst ohne Last) sehe ich eine Entladekurve. Ich dachte erst an 
eine fliegende Masse, aber dem ist nicht so - alle GND/AGND Pins sind 
nierderohmig angebunden. Das habe ich von oben auf die Pins gegen GND 
des Stützkondensators gemessen.
Nun hab ich keinen Rat mehr...
Der Pin geht in paar µs von 0 auf 3,3V und fällt jedoch 500µs lang von 
3,3V auf 0V ab.
Gibts da Fuses die Klemmen?
Die Software ist mitlerweile auf direkte kommandos ohne Arduino Lib 
geschrumpft - sprich ich steure Mit PORTB|=... an. Alle anderen Module 
sind mitlerweile auskommentiert.
Die Ports sind auch als Ausgang gesetzt und ich habe einige Pins 
durchprobiert.

Ich hoffe ihr habt ne Idee.

von Thomas E. (thomase)


Lesenswert?

Ra S. schrieb:
> ich hab hier ein komisches Phänomen...

Sitzt meistens vor der Schaltung.

Ra S. schrieb:
> Ich hoffe ihr habt ne Idee.

Poste deinen Schaltplan und deine Software.

von Stefan S. (chiefeinherjar)


Lesenswert?

Ra S. schrieb:
> geschrumpft - sprich ich steure Mit PORTB|=... an. Alle anderen Module
> sind mitlerweile auskommentiert.

Hast du beachtet, dass du den Pin erstmal per DDRB auf Ausgang schalten 
musst?! - ansonsten schaltest du nur die PullUps ein bzw. wieder aus, 
was das genannte Verhalten erklären KÖNNTE.

von Ra S. (mcfloppy)


Angehängte Dateien:

Lesenswert?

So ich bin "weiter"...
Zum Schaltplan: 
https://lowpowerlab.com/wp-content/uploads/2016/09/R6_schematic.png

Das Board liegt so vor mir und ich habe ein Picoscope mit Tastkopf 
welchen ich dann entsprechend umklemme. Am Board steckt ein RS232 
Wandler um es zu programmieren.

void setup() {
  // put your setup code here, to run once:
  DDRB |= (1<<PB2);

}

void loop() {
    PORTB &= ~(1 << PB2);
   delayMicroseconds(500);
    PORTB |= (1 << PB2);
    delayMicroseconds(500);

}

Damit teste ich gerade alles.
Die Messungen im Anhang sind bei beiden Boards ähnlich - was mich nun 
total verwundert.

von Georg G. (df2au)


Lesenswert?

Kann es sein, dass da Reste der Arduino Software dir in die Suppe 
spucken? IIRC will der Arduino seine Ports mit eigenen Befehlen setzen.
Entweder ganz auf Arduino verzichten oder am Anfang von loop() nochmals 
das DDR setzen.

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


Lesenswert?

Ra S. schrieb:
> Zum Schaltplan:
> https://lowpowerlab.com/wp-content/uploads/2016/09/R6_schematic.png
Und bei den Messungen ist sonst nichts beteiligt? Nur das, was auf dem 
Schaltplan zu sehen ist?

Auf welche Pins am µC beziehen sich die Pinnummern der Bilder?

> PORTB |= (1 << PB2);
Funkt dir da das Funkmodul und der möglicherweise initialisierte SPI 
rein?

: Bearbeitet durch Moderator
von Einer K. (Gast)


Lesenswert?

Georg G. schrieb:
> Kann es sein, dass da Reste der Arduino Software dir in die Suppe
> spucken?
Im Beispiel Code nicht.

Georg G. schrieb:
> IIRC will der Arduino seine Ports mit eigenen Befehlen setzen.
Wieso sollte es?
Es hat keinen "Willen".

Georg G. schrieb:
> Entweder ganz auf Arduino verzichten
Das kann man natürlich tun.
Hat aber keine Auswirkungen auf das Beispiel.

Georg G. schrieb:
> oder am Anfang von loop() nochmals
> das DDR setzen.
Das ist Unfug!
setup() wurde schließlich genau dafür erfunden, um solche Dinge zu tun.

----------

Die Messung an Pin9..
Falscher Pegel. Kann laut Schaltplan nicht sein!
Im Code ist davon nichts zu sehen....


----------
Dein Code liefert auf meinem ATMega328P ein gestochen scharfes Rechteck.
Und im Schaltplan kann ich keinen Fehler entdecken, welcher das 
verursachen könnte.
Das Problem liegt also wohl woanders.

von Georg M. (g_m)


Lesenswert?

Ra S. schrieb:
>   DDRB |= (1<<PB2);

Ja, Pin 10 (PB2) ist ein Ausgang und sein Oszillogramm sieht doch gut 
aus, oder?

von Einer K. (Gast)


Lesenswert?

Georg M. schrieb:
> Ja, Pin 10 (PB2) ist ein Ausgang und sein Oszillogramm sieht doch gut
> aus, oder?
Natürlich!
Aber das Bild von Pin9 sieht dämlich aus!
Es hat nicht nur die vermeintliche "Ladekennlinie", sondern auch den 
falschen Pegel.


Was ich eigentlich nicht sagen wollte:
Es ist irgendwie eine dumme Idee, genau den Programmteil zu posten, 
welcher KEINE Probleme macht, und das andere, was Fehler produziert, 
geheim zu halten.
Unfug ist das!
Um auf eine solche Idee zu kommen, muss man schon ordentliche 
Scheuklappen entwickelt haben.

von Stefan F. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Es ist irgendwie eine dumme Idee, genau den Programmteil zu posten,
> welcher KEINE Probleme macht, und das andere, was Fehler produziert,
> geheim zu halten.

Erstmal muss er zu der Erkenntnis kommen, das sein gezeigter Code nicht 
die Ursache sein kann. Soweit war er ja bis gerade eben noch nicht.

Danach kommt er mit seiner Fehlersuche weiter.

von Jim M. (turboj)


Lesenswert?

An den Oszi Bilder sieht man deutlich dass der OP schlicht vergessen hat 
die Pins im entsprechenden DDR Register auf Ausgang zu setzen.

Denn bei PB2 sieht man deutlich die hochfrequenten Überschwinger. Die 
kommen durch einen nicht-idealen Aufbau, z.B. bei der Masseverbindung zu 
Oszi.

In den anderen Bildern fehlen die - weil nur die viel schwächeren 
Pullups aktiv sind. So erklären sich auch die geringeren Spannungspegel 
und die Entladekurve bei PORTx.y = LOW. Denn dann sind die Pins schlicht 
hochohmig.

von Ra S. (mcfloppy)


Lesenswert?

Hallo Leute,

vielen Dank für die Infos.
Jim hatte recht - mein code oben wurde erst aktiv als ich ein Make clean 
gemacht hab. Danach ging auch alles. Irgendwie ist die Arduino IDE 
Strange.

Das "make clean" fehlt eh in der IDE - dazu muss man erst für ein 
anderes Board kompilieren. Alles schon eine starke Bastelbude - aber 
wenn es geht ist man sehr schnell.

Gibt es alternativen zur IDE? Aber mit Bibliotheksmanager für Arduinos.

LG

von Einer K. (Gast)


Lesenswert?

Make gibts sowieso nicht in der IDE.

In den Einstellungen gibt es einen Menuepunkt zu "aggressivem 
zwischenspeichern". Vielleicht möchtest du den ja deaktivieren.


Und nein, üblicherweise funktioniert das!
Probleme kann es geben, wenn Anwendung und Temp Ordner auf 
unterschiedlichen Rechnern, mit unterschiedlichen SystemZeiten, liegen.

Übrigens das Build Verzeichniss kannst du jederzeit händisch leeren.
(oder gar eine Lösch Automatic in die IDE einbauen ungetestet)

von Stefan F. (Gast)


Lesenswert?

Ra S. schrieb:
> Gibt es alternativen zur (Arduino) IDE? Aber mit Bibliotheksmanager für 
Arduinos.

Es soll entsprechende Plugins für Eclipse, Atmel Studio und Visual 
Studio geben.

Ich benutze die Arduino IDE zum compilieren und flaschen in Kombination 
mit einem externen Editor meiner Wahl (derzeit QT Creator).

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.