Hallo Kann mir mal einer sagen wieso diese if-bedingung bei meiner Schaltung plotzlich wahr wird :(
1 | if ( !(PINC & ( 1 << PINC5))) |
2 | {
|
3 | while (1) |
4 | {
|
5 | PORTD = 0xFF; |
6 | }
|
7 | }
|
|
Forum: Mikrocontroller und Digitale Elektronik UHR- if-bedingungHallo Kann mir mal einer sagen wieso diese if-bedingung bei meiner Schaltung plotzlich wahr wird :(
Wiel wichtiger ist doch die Frage, warum du uns eine C# Projekt angehangen hast.
>Wiel wichtiger ist doch die Frage, warum du uns eine C# Projekt >angehangen hast. :( > PINC & ( 1 << PINC5) und > PORTC = (1 << PC3); passt nicht wirklich zusammen. Du darst nur die Ausgänge manipulieren. Außerdem fehler noch die volatiles bei den ganzen ISR variablen. Wenn C.5 auf GND (oder LOW) gelegt wird, schaltest du deinen PORTD auf 0xFF (alles HIGH) und das machst du so lange, bis du dem µC den Strom wegnimmst. Alles, was darunter steht, wird niemals erreicht. Die ISR wird zwar arbeiten, aber die verändert ja nur stunde, minute, sekunden. Die Ausgabe erfolgt nie.
Ich würde es mal mit 0-Pegel an Pin C5 Probieren - oder auch nicht. >Die ISR wird zwar arbeiten, aber die verändert ja nur stunde, minute, >sekunden. Die Ausgabe erfolgt nie. Wenn die Taste gedrückt wird soll keine ausgabe mehr erfolgen. > PINC & ( 1 << PINC5) >und > PORTC = (1 << PC3); >passt nicht wirklich zusammen. Du darst nur die Ausgänge manipulieren. kannst du mir das bitte genauer erklären? Azubi schrieb: >> PORTC = (1 << PC3); > >>passt nicht wirklich zusammen. Du darst nur die Ausgänge manipulieren. > > kannst du mir das bitte genauer erklären? wenn ein PullUP eingeschaltet ist, dann wird diese mit PORTC = (1 << PC3); wieder abgeschaltet. Man sollte einfach nur das Bit ändern, was man braucht. Und nicht den kompletten port zuweisen. > DDRC = 0x0F; > PORTC = ( 1 << PC4)|( 1 << PC5); Die Datenrichtung ist: Ausgang für C0 bis C3 und Eingang für C4 bis C7 C4 und C5 erhalten einen Pullup. > wenn ein PullUP eingeschaltet ist, dann wird diese mit PORTC = (1 << > PC3); wieder abgeschaltet. Ein Ausgang hat keinen Pullup! C3 ist ein Ausgang, er wird durch "PORTC = (1 << PC3);" auf HIGH gesetzt. >wenn ein PullUP eingeschaltet ist, dann wird diese mit PORTC = (1 << >PC3); wieder abgeschaltet. Nur zum Verständnis: PORTC = ( 1 << PC0); entspricht PORTC = b'0000 0001' dadurch schalte ich mein Pull-up Widerstand ab, also muss ich PORTC = ( 1 << PC0); durch PORTC = b'00100001' ersetzen um meinen Pull-up Widestand eben nicht abzuschalten. Ich hoffe ich habe es jetzt richtig verstanden DDRC ist das Datenrichtungs-Register. Dort, wo eine 1 steht, ist ein Ausgang, bei einer 0 ist das Bit ein Eingang. Für die Eingangsbits: Wenn du auf PORTC schreibst, bedeutet ein 1-Bit, daß der Pullup eingeschaltet wird und ein 0-Bit, daß der Pullup aus ist. Für die Ausgangsbits: Ein 1-Bit bedeutet, daß der Ausgang auf 1 (also HIGH) geht, ein 0-Bit, daß der Ausgang auf LOW geht. Also erstmal sagen, was Eingang und was Ausgang ist mit DDRC. Und dann bei Eingängen die Pullups und bei Ausgängen die Ausgangspegel setzen, ok? hilmar schrieb: >> DDRC = 0x0F; >> PORTC = ( 1 << PC4)|( 1 << PC5); > > Die Datenrichtung ist: Ausgang für C0 bis C3 und Eingang für C4 bis C7 > C4 und C5 erhalten einen Pullup. > >> wenn ein PullUP eingeschaltet ist, dann wird diese mit PORTC = (1 << >> PC3); wieder abgeschaltet. > > Ein Ausgang hat keinen Pullup! > C3 ist ein Ausgang, er wird durch "PORTC = (1 << PC3);" auf HIGH > gesetzt. Schon. Was er sagen wollte. Durch die Zuweisung wird nicht nur PC3 auf High gesetzt. Als Nebeneffekt werden alle anderen BIts in PORTC auf 0 gesetzt. Und damit ist dann der schöne Pullup, der hier eingeschaltet wurde >> PORTC = ( 1 << PC4)|( 1 << PC5); nur noch Geschichte. Azubi schrieb: >>wenn ein PullUP eingeschaltet ist, dann wird diese mit PORTC = (1 << >>PC3); wieder abgeschaltet. > > Nur zum Verständnis: > > PORTC = ( 1 << PC0); entspricht PORTC = b'0000 0001' > > dadurch schalte ich mein Pull-up Widerstand ab, also muss ich > PORTC = ( 1 << PC0); durch PORTC = b'00100001' ersetzen um meinen > Pull-up Widestand eben nicht abzuschalten. > > Ich hoffe ich habe es jetzt richtig verstanden Im Prinzip ja. Nur mahct man das nicht so. Du willst dir doch nicht ewig und immer und überall merken, welche anderen Pins du in welchem Portregister du zusätzlich auch noch mit berücksichtigen musst! Hier
hast du es doch so schön geschrieben: In TIMSK ausschliesslich und nur das OCIE1A Bit setzen. Alle anderen Bits bleiben so wie sie sind. Azubi schrieb: > dadurch schalte ich mein Pull-up Widerstand ab, also muss ich > PORTC = ( 1 << PC0); durch PORTC = b'00100001' ersetzen um meinen > Pull-up Widestand eben nicht abzuschalten. ja aber nicht sehr komfortabel. du sollte einfach nur ein Bit setzen und die andere einfach nicht anfassen! PORTC |= ( 1 << PC0) http://www.mikrocontroller.net/articles/Bitmanipulation Ein Bit setzen
Ein Bit löschen
ein Bit auf 1 abfragen
ein Bit auf 0 abfragen
Bitmanipulation 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.
|
|