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


von Markus (Gast)


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:
1
#include <avr/io.h>
2
#define F_CPU 1000000UL
3
4
5
6
int main () {
7
8
 DDRB &= ~(1<<PB0); //PBO auf 0 -> als Eingang
9
 DDRB |=  (1<<PB2); //PB1 auf 1 -> als Ausgang
10
11
 //PB0 und PB1 sicherheitshalber auf 0 zurücksetzen
12
 PORTB &= ~(1<<PB0);
13
 PORTB &= ~(1<<PB1);
14
15
  while(1) {
16
    if (PINB & (1<<PB0)) { 
17
      PORTB |= (1<<PB2); //Ausgang PB1 auf 1 setzen
18
    }
19
    else {
20
      PORTB &= ~(1<<PB2); //Sonst: PortB aus!
21
    }
22
  }
23
24
return 0;
25
}

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

von Karl H. (kbuchegg)


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?

von Karl H. (kbuchegg)


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.

von Mark .. (mork)


Lesenswert?

@Markus

Deine Kommentare stimmen nicht mit dem Quellcode überein
1
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

von Magnus M. (magnetus) Benutzerseite


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

von B e r n d W. (smiley46)


Lesenswert?

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

Gruß, Bernd

von Karl H. (kbuchegg)


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)

von Grrrr (Gast)


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:
1
   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.

von Grrrr (Gast)


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.

von Markus (Gast)


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

von Grrrr (Gast)


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.

von Markus (Gast)


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

von Markus (Gast)


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

von Grrrr (Gast)


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.

von Grrrr (Gast)


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.

von Mark .. (mork)


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...

von Markus (Gast)


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

von Grrrr (Gast)


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.

von Grrrr (Gast)


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.

von Grrrr (Gast)


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).

von Karl H. (kbuchegg)


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.

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.