www.mikrocontroller.net

Forum: Compiler & IDEs Anfängerproblem: Eingang auf Ausgang legen


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute,
ihr könnt mir mit Sicherheit bei meinem Problem helfen.

Ich möchte einfach einen Eingangszustand auf einen Ausgang ausgeben. 
Problem an der Sache ist, dass das Rücksetzten nicht wirklich gut 
funktioniert. Das Einschalten geht ohne Zeitverlust von statten. Das 
Abschalten geht meistens überhaupt nicht oder nur nach langer Zeit.

Hier das Programm:
#include <avr/io.h>
#define F_CPU 1000000UL



int main () {

 DDRB &= ~(1<<PB0); //PBO auf 0 -> als Eingang
 DDRB |=  (1<<PB2); //PB1 auf 1 -> als Ausgang

 //PB0 und PB1 sicherheitshalber auf 0 zurücksetzen
 PORTB &= ~(1<<PB0);
 PORTB &= ~(1<<PB1);

  while(1) {
    if (PINB & (1<<PB0)) { 
      PORTB |= (1<<PB2); //Ausgang PB1 auf 1 setzen
    }
    else {
      PORTB &= ~(1<<PB2); //Sonst: PortB aus!
    }
  }

return 0;
}

Wäre echt super wenn ihr nen Fehler findet!! Ich weiß im Moment nämlich 
nicht wirklich weiter:(
An der Schaltung sollte es nicht liegen. Die meisten Teile sind gekauft 
und haben vorher ohne Probleme funktioniert.

Markus

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:

> Ich möchte einfach einen Eingangszustand auf einen Ausgang ausgeben.
> Problem an der Sache ist, dass das Rücksetzten nicht wirklich gut
> funktioniert. Das Einschalten geht ohne Zeitverlust von statten. Das
> Abschalten geht meistens überhaupt nicht oder nur nach langer Zeit.

Was hängt an deinem Eingang?
Und wie genau ist es verschaltet?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:

> An der Schaltung sollte es nicht liegen.

Mit einiger Sicherheit doch.

> Die meisten Teile sind gekauft
> und haben vorher ohne Probleme funktioniert.

Das heißt noch lange nicht, dass sie auch zuammenpassen.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus

Deine Kommentare stimmen nicht mit dem Quellcode überein
PORTB |= (1<<PB2); //Ausgang PB1 auf 1 setzen
Soll jetzt PortB.2 auf 1 gesetzt werden oder PorbB.1? Eventuell liegt es 
eben daran, dass Du PortB.1 prüfst, obwohl PortB.2 geschaltet wird.

MfG Mark

Autor: Magnus M. (magnetus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Wäre echt super wenn ihr nen Fehler findet!!

Guck dir mal deinen Code genau an und entscheide dich endlich ob du mit 
PB1 oder PB2 arbeiten willst.

Gruß,
Magnetus

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Willst Du auf PB2 oder PB1 ausgeben? Eventuell schaust Du nur am 
falschen Port. Du schreibst jedenfalls auf beide.

Gruß, Bernd

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wetten das jetzt kommt:
zuerst hatte ich es auf PB1 aber da hat es nicht funktioniert, drum hab 
ich PB2 ausprobiert. Die Kommentare sind noch von vorher :-)


Ich denke mal, dass sein Eingang PB0 nicht aktiv auf 0 runtergezogen 
wird. Auf 1 geht er problemlos und 'beim Loslassen' floatet der Eingang 
nur noch vor sich hin. Ein 10k Pulldown Widerstand an PB0 sollte dem 
schnell abhelfen, wennn die angeschlossene Schaltung da mitspielt. Aber 
da die keiner kennt ....

(Kann aber auch sein, dass alles genau anders rum ist, und das 
Einschalten des Pullup Widerstandes am Pin PB0 schon völlig ausreicht. 
Wer weiß das schon)

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> nach langer Zeit.

Was heisst das eigentlich genau?

Ich weiss gerade nicht, ob der Optimierer das nicht ohnehin so macht, 
aber schneller geht es theoretisch so:
   PORTB = ((PINB & (1<<PB0))<<PB2)|(~(1<<PB2);

Mit (PINB & (1<<PB0) wird das Bit 0 maskiert,
anschliessen mit <<PB2 and die Position von Bit 2 geschoben,
dann noch mit dem invertierten Wert verodert, damit alle anderen Bits 
gleich bleiben.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei diese Lösung trotzdem noch eine Verzögerung bewirken kann, wenn 
das Latch am Eingang nicht rechtzeitig zuschlägt.
Na mal sehen, ob "zu lange" nun Sekunden oder Mikrosekunden bedeutet.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, das ging ja schnell!

Die Kommentare stimmen nicht- mein Fehler!! Aber daran lieg es nicht.

Als Boars verwende ich das AVR Starterkit (inkl. USBprog, Netzteil und 
ATMega8)

Ich habe einfach den Ausgang des µC mit Vorwiderstand an eine LED 
geschaltet. Das ganze auf einem neuen Stechbrett (Kontake sind OK).

Ich verwende zum verdrahten Jumperkabel. Wie sieht es denn mit der 
entprellung aus die kann beim Ausschalten nicht das Problem sein, oder??


@ Karl heinz Buchegger:

Ich weiß nicht genau warum ich einen zusätzlichen Pulldown benötige. 
Warum sollte der interne denn nicht reichen?

Gruß Klaus

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich mir erlauben darf:

Markus schrieb:
> Ich weiß nicht genau warum ich einen zusätzlichen Pulldown benötige.
> Warum sollte der interne denn nicht reichen?

Karl heinz Buchegger schrieb:
> Ich denke mal, dass sein Eingang PB0 nicht aktiv auf 0 runtergezogen
> wird.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, nur damit niemand verwirrt ist. Ich habe gerade für meinen Bruder 
Geschrieben (Markus ist mein Bruder, der ist aber gerade außer Haus).

Der Ausschaltvorgang dauert Minutenlang also sehr lange!!

Klaus

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Grrr,
ich weiß was er geschrieben hat:) Wie man sich denken kann möchte ich 
gerne wissen warum ein weiterer Pulldown notwendig ist. Eigentlich 
dachte ich das der interne Pulldown ausreichen würde.

Markus und Klaus

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Oh, nur damit niemand verwirrt ist. Ich habe gerade für meinen Bruder
> Geschrieben (Markus ist mein Bruder, der ist aber gerade außer Haus).

Na toll. Stille Post. Das wird ja dann ganz einfach. :-}
(Here it comes, here it comes, here comes your nineteenth nervous 
breakdown...)

Schnelle Weitergabe des Wechsel von Low nach High aber langsame 
(Minuten) Weitergabe des Wechsel von High nach Low? Ist das richtig so?

Dann liegt es an was anderem. Nicht an der Software.
Vermutlich eher an einer der Umgebungsbedingungen, wie Bedienung der 
Software oder Hardware.

Frag mal Deinen Bruder nach einem Schaltplan und poste den hier.

Nimm mal ein Stück Draht und lege jeweils einen definierten High- bzw. 
Low Pegel an den Portpin. Dann wissen wir schonmal ob es die sonstige 
Hardware ist.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Hey Grrr,
> ich weiß was er geschrieben hat:)

Hmm. Na das nehme ich mal mit einer gewissen Skepsis zur Kenntnis. ;-)

> Wie man sich denken kann möchte ich
> gerne wissen warum ein weiterer Pulldown notwendig ist.

Es hat niemand geschrieben, das ein "weiterer" Pulldown nötig ist. Wenn 
Du selbst keinen in die Schaltung einfügst, gibt es überhaupt keinen 
Pulldown Widerstand. In der CPU ist nämlich ein schaltbarer 
PullUp-Widerstand integriert.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Eigentlich
> dachte ich das der interne Pulldown ausreichen würde.

AVRs haben keine internen Pulldowns, nur Pullups.

MfG Mark

Edit: zu spät...

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, super!! Bei definierten Zuständen funzt das ganze. Das es sich 
ausschließlich um Pullups handelt wusste ich bis jetzt nicht.

DANKE AN ALLE!! (sorry noch mal wegen den verwirenden Beiträgen:)

Aber eine kurze Frage noch: Ich würde dann in Zukunft immer die 
Pulldowns bei den Eingängen anschließen (wenn nicht intern auf Pullup 
geschaltet ist), um solch einen blöden Fehler zu vermeiden. Oder geht 
ihr da anders vor?? Wenn es eine bessere Lösung gibt dann könnt ihr 
vielleicht nohc eben schreiben.

Danke!
Markus und Klaus

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Aber eine kurze Frage noch: Ich würde dann in Zukunft immer die
> Pulldowns bei den Eingängen anschließen (wenn nicht intern auf Pullup
> geschaltet ist), um solch einen blöden Fehler zu vermeiden. Oder geht
> ihr da anders vor?? Wenn es eine bessere Lösung gibt dann könnt ihr
> vielleicht nohc eben schreiben.

Du hast den eigentlichen Knackpunkt noch nicht verstanden. Das Problem 
entsteht, wenn in einem der beiden möglichen Zustände der Pegel nicht 
aktiv erzeugt wird und die Eingangsschaltung nicht selbst einen der 
beiden Zustände aktiv erzeugt. Ob das so ist, hängt von der Art und 
Anschaltung des Betätigungselementes bzw. der vorhergehenden 
Signalerzeugung ab. (Stichwort: Open-Kollektor)

Deine Schaltung (bzw. die Deines Bruders) hat offensichtlich in einem 
Zustand ein aktives High an den Eingangspin gelegt und in dem anderen 
Zustand den Pin offen gelassen. Dabei musste der interne PullUp des AVR 
ausgeschaltet sein, sonst wäre ja im offenen Zustand am Pin selbst durch 
den Pullup ein aktives High erzeugt worden.

In dem offenen Zustand also, wurde kein Low vom AVR gesehen, sondern 
irgendwas zufälliges. Deswegen die scheinbare "Verzögerung" die nur 
bedeutet hat, das irgendwann einmal durch Einstrahlung/Felder/etc. ein 
Pegel an dem Eingang anstand, der die Schwelle zum Low unterschritten 
hat.

Ergo musst Du in zukünftigen Schaltungen nicht etwa immer einen 
PullDown-Widerstand verwenden. Vielmehr musst Du unter Ausnutzung der 
Tatsache, das ein PullUp-Widerstand schon im AVR integriert ist, dafür 
sorgen, das der LOW-Zustand aktiv erzeugt wird und nicht durch einen 
offenen Kontakt. D.h. das Du etwa einen schliessenden Taster (also einen 
der beim Betätigen schliesst) so anschaltest, das er bei Betätigung den 
Minuspol der Schaltung mit dem Portpin verbindet. Den High-Zustand 
erzeugst Du im Fall, das der Taster offen ist, indem Du den internen 
PullUp-Widerstand aktivierst.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast eigentlich in Deiner Frage noch ausdrücklich geschrieben:

Markus schrieb:
> (wenn nicht intern auf Pullup geschaltet ist)

Das geht so, aber nur wenn der High-Zustand dann von Deinem Taster aktiv 
erzeugt wird. Da aber ohnehin durch den internen PullUp der High-Zustand 
aktiv erzeugt werden kann ist es viel ökonomischer (Widerstände ergeben 
sich im Portemonai, hehe) den internen PullUp auch zu benutzen und den 
Taster wie oben beschrieben so anzuschliessen, das er den Kontakt zu Gnd 
herstellt, wenn er betätigt wird.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> An der Schaltung sollte es nicht liegen.

Aus diesem Fall kannst Du auch lernen, das es sich, wenn Du nicht 
weiterweisst und hier fragen willst, immer lohnt den Schaltplan zu 
posten. Da hätte man das sofort gesehen. (Und Karl-Heinz hat das ja auch 
gleich richtig so vermutet).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was man auch daraus lernen kann:
Wenn es sich um etwas eigentlich sehr einfaches handelt, und du seihst 
selbst den Fehler nicht, dann sitzt der Fehler immer dort wo du ihn 
nicht vermutest. In deinem Fall dann eben in der Hardwareanschaltung.

Darum:
Du kannst bei einer Frage nie genug Information preisgeben. Immer nur 
zuwenig.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.