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
intmain(){
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
return0;
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
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?
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.
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
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)
> 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.
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.
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
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.
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
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
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.
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.
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...
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
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.
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.
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).
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.