Hallo Forengemeinde,
ich habe so meine Probleme mit testen von Port-Bits.
Folgendes geht:
if ( !(PINB & (1<<PINB4)) - Wenn Bit 4 (0-7) im Port-B Lo ist, dann
mache..
Das funktioniert ja.
nun benötige ich aber ein Konstrukt, dass z.B. testet:
Wenn Bit 5 im Port-B High ist, dann....
Mein Ansatz:
if ((PINB &= (1<<PINB5)) & Korb_Flag == true)
oder
if ((PINB |= (1<<PINB5)) & Korb_Flag == true)
- funktioniert nicht
Korb-Flag könnt Ihr ignorieren, oder was weiß ich. Das ist die 2.
Bedingung
Bitte erklärt mir mal, wie ich ein Bit vom Port teste, ob es High ist.
Danke.
Thomas S. schrieb:> if ((PINB &= (1<<PINB5)) & Korb_Flag == true)> oder> if ((PINB |= (1<<PINB5)) & Korb_Flag == true)
Ganz böses Foul, ein Schreiben auf einen Inputport kann Outputbits
kippen!
Auf PINx nur dann schreiben, wenn man auch weiß, was man tut.
Und Binärverknüpfung von logischen Ausdrücken ist zumindest unschön,
wenn nicht sogar falsch.
Thomas S. schrieb:> Mein Ansatz:> if ((PINB &= (1<<PINB5)) & Korb_Flag == true)> oder> if ((PINB |= (1<<PINB5)) & Korb_Flag == true)> - funktioniert nicht
Erkenne den Unterschied zwischen
& und &=
bzw. zwischen
| und |=
Hast Du mal in ein C-Buch gesehen?
Thomas S. schrieb:> Korb-Flag könnt Ihr ignorieren, oder was weiß ich. Das ist die 2.> Bedingung
Die hoffentlich die gleiche Bitmaske wie Deine Port-Pins hat.
Hallo Mitwirkende
@Knisterbein
der Part funktioniert aber trotzdem nicht, so wie ich es will.
Letztendlich will ich eine neg. Flanke aus dem Eingangssignal haben.
so hatte ich das auch schon. bzw. mit ausgeschriebenen ...& Korb_Flag ==
true
1. Wenn PinB5 Lo wird, und das Flag 'False' ist
. soll das Flag 'High' werden
2. Wenn PinB5 wieder 'High' wird (weil das Eingangsignal weggeht), und
das Flag 'High' ist, wird die Prozedere ausgeführt
3. Wird PinB5 'Lo', und das Flag False ist, wird das Flag 'High'.
4. Bleibt PinB5 'Lo', ist ja das Flag noch High, bis Der Pin High wird.
Die Pins werden per PullUp hochgehalten, ein Optokoppler zieht den bei
Signal runter. der Impuls kann bis zu 300 mS dauern, das ist zu lang.
Deshalb über eine Variable, setzen und löschen, und diese auswerten. Der
angehängte Part ist so nicht stimmig. Wird der Pin Lo, zählt der
unaufhörlich hoch. Es darf nur 1 Impuls kommen.
Habe hier mal den betreffenden Part angehängt
1
if(Spiel_gestartet==true)
2
{
3
if(!(PINB&(1<<PINB5))&Korb_Flag==false)
4
{
5
Korb_Flag=true;// Flankenerzeugung
6
// PORTA |= (1<<6); // Led ein
7
}
8
if((PINB&~(1<<PINB5))&&Korb_Flag)// Bei fallender Flanke, bzw wenn das Bit Lo ist
Thomas S. schrieb:> if ( !(PINB & (1<<PINB5)) & Korb_Flag == false)
Und jetzt nimmst Du Dir Dein C-Buch nochmal in die Hand und findest
raus, was der Unterschied zwischen logischen und bitweisen
Operatoren ist.
Das steht da nämlich drin.
Harald K. schrieb:> Thomas S. schrieb:>> if ( !(PINB & (1<<PINB5)) & Korb_Flag == false)>> Und jetzt...
So funktioniert es
if ((PINB & (1<<PINB5)) && Korb_Flag) // Bei fallender Flanke, bzw wenn
das Bit Lo ist
Top!!
Sehe die Fehler vor lauter Ostereier nicht mehr. - smile
Thomas S. schrieb:> Sehe die Fehler vor lauter Ostereier nicht mehr
Hast Du denn in einem der Ostereier auch dein C-Buch gefunden und Dir
dort mal die verschiedenen Operatoren angesehen?
Sherlock 🕵🏽♂️ schrieb:> Damit fragst du alle Pins ab, außer PB5.
Aber auch noch mit der Gemeinheit, daß der Ausdruck wahr wird, sobald
einer oder eine beliebige Kombination der anderen Pins high ist.
Sherlock 🕵🏽♂️ schrieb:>> if ((PINB & ~(1<<PINB5))>> Damit fragst du alle Pins ab, außer PB5.
Aktuell, wie es funktioniert ist diese:
if ((PINB & (1<<PINB5)) && Korb_Flag)
Harald K. schrieb:> Hast Du denn in einem der Ostereier auch dein C-Buch gefunden und Dir> dort mal die verschiedenen Operatoren angesehen?
Nein habe ich noch nicht gefunden. Bin aber online fündig geworden, auch
mit hilfe von RBX. Manche Syntax ist mir halt nicht geläufig, und dann
frag ich halt nach. Ich denke dafür ist dann das Forum da. - smile
Habe auch noch vor Sound entweder mit diesem Atmega32, oder besser mit
einem Atmega8 an der Seite vom Atmega32 zu erzeugen. Nur Kling-Klang,
oder wilde Töne, evtl. mit Hallkurve, bzw. anschwellen, abschwellen. Das
hat in einer Schaltung ein steinalter Pic geschafft, dann sollte es der
Atmega8 an der Seite auch schaffen.
Thomas S. schrieb:> Manche Syntax ist mir halt nicht geläufig, und dann> frag ich halt nach.
Ja, warum auch Grundlagen lernen, wenn man doch einfach immer irgendwo
nachfragen kann?
Bis jetzt knapp fünfzehn Beiträge, welche sich mit einfachsten
arithmetischen und logischen Ausdrücken beschäftigen. Ohne sichtbaren
Erfolg.
Thomas S. schrieb:> Habe auch noch vor Sound entweder mit diesem Atmega32, oder besser mit> einem Atmega8 an der Seite vom Atmega32 zu erzeugen. Nur Kling-Klang,> oder wilde Töne, evtl. mit Hallkurve, bzw. anschwellen, abschwellen. Das> hat in einer Schaltung ein steinalter Pic geschafft, dann sollte es der> Atmega8 an der Seite auch schaffen.
Möchtest du dem Forenbetreiber zunächst eine zusätzliche große
Festplatte spendieren? Das kann noch echt lang werden.
Norbert schrieb:> Ohne sichtbaren> Erfolg.
Sieht er vermutlich anders.
Thomas S. schrieb:> So funktioniert es>> (...)>> Top!!
Wir könnten jetzt die alte und immer zutreffendere* Leier über die
Jugend anstellen, oder aber eine Exitstrategie entwickeln, die uns
hilft, mit den immer häufiger werdenden Grundlagenverweigereren
irgendwie klarzukommen.
Ich stelle mir das schwierig vor.
*) vor allem die über deren zunehmende Verblödung, siehe auch hier:
https://www.nytimes.com/2025/04/10/opinion/education-smart-thinking-reading-tariffs.html
Danach kannst du gut lesbare if Ausdrücke schreiben:
1
if(Start_Taster_gedrueckt&&Korb_flag==false){
2
...
3
}
4
5
if(Start_Taster_losgelassen&&Korb_flag==true){
6
...
7
}
Mache auf jeden Fall immer Klammern um die Ausdrücke hinter #define,
damit sie innerhalb von komplexen Ausdrücken immer das tun, was man
erwartet.
Den Namen von Korb_flag würde ich auch nochmal überdenken, denn er sagt
nicht aus, was das Flag bedeutet. Namen wie Korb_getroffen wären
aussagekräftiger.
1
if(Start_Taster_gedrueckt&&!Korb_getroffen){
2
...
3
}
4
5
if(Start_Taster_losgelassen&&Korb_getroffen){
6
...
7
}
Makros helfen auch bei Schaltausgängen:
1
#define Sirene_an PORTC |= (1<<PC1)
2
#define Sirene_aus PORTC &= ~(1<<PC1)
3
4
if...{
5
Sirene_an;
6
}else{
7
Sirene_aus;
Falls dir solche Makros suspekt sind, schreibe stattdessen Funktionen
mit sprechenden Namen.
1
boolSabotage_erkannt(){
2
returnPortB&(1<<PB4)
3
}
4
5
voidSirene_an(){
6
PORTC|=(1<<PC1)
7
}
8
9
if(Sabotage_erkannt()){
10
Sirene_an();
11
}
Gerade bei AVR sind Funktionsaufrufe "billig". Außerdem optimiert der
Compiler solche einzeiligen Funktionen meistens komplett weg, als hätte
man direkt auf den Pin zugegriffen.
Der entscheidende Punkt ist, lesbare Namen zu verwenden, damit komplexe
Ausdrücke verständlich bleiben.
Sherlock 🕵🏽♂️ schrieb:> Lege dir Makros mit sprechenden Namen an. z.B.
Dann danke ich Dir für die Ausführung hier. Das werde ich überdenken es
ectl. so umzuschreiben. Das sind im Gegensatz zu den 'Nörglern' hier
verwertbare Infos, und Tips.
Norbert schrieb:> Bis jetzt knapp fünfzehn Beiträge, welche sich mit einfachsten> arithmetischen und logischen Ausdrücken beschäftigen. Ohne sichtbaren> Erfolg.
Es sind auch ca. 1 Meter Beiträge dabei, die sinnfrei sind, und wo es
nur ums Meckern geht.
Du brauchst nicht nörgeln. wenn Dir was nicht passt, bleib einfach vor
der Tür. Ich habe es schon x-mal geschrieben, dass ich kein C-Guru bin.
Mache es hier und da. Und ich komme auch zum Ziel. Auch mit Hilfe von
hier, klar.
Habt Ihr ein Problem mit Forenmitgliedern, die nicht auf der sehr hohen
Programmierschwelle sind wie Ihr? - Dan sagt es. Ich dachte, und denke,
dafür ist ein Forum da. - Um zu Fragen.
Zur Info: das Modul, um das es hier geht, läuft problemlos.
Thomas S. schrieb:> Ich dachte, und denke,> dafür ist ein Forum da. - Um zu Fragen.
Es ist nicht dafür da, Fragen von Leuten zu beantworten, die sich
hartnäckig weigern, Tips zur Selbsthilfe anzunehmen. Es ist nicht
ChatGPT, das geduldig immer wieder die gleichen Fragen beantwortet, weil
der Fragende zu faul ist, etwas selbst zu lernen.
Ich habe Dir sinnvolle Hinweise gegeben. Gleich zweimal.
Aber das hast Du vermutlich nicht verstanden, oder nicht verstehen
wollen, denn meine Hinweise waren ja auch kompliziert und anstrengend,
nämlich der Hinweis, zwei bestimmte Fragestellungen in einem Buch
nachzulesen.
Das ist natürlich eine Zumutung, ich hätte ja auch einfach Deine Aufgabe
lösen können. Nur hättest Du dabei erst recht nichts gelernt.
Niemand verlangt von Dir, wenn Du hier Fragen stellst, daß Du der
"C-Guru" bist; wärst Du es, müsstest Du ja keine Fragen stellen.
Aber wenn Du Dich hartnäckig weigerst, hilfreiche Hinweise anzunehmen --
dann fange ich an, unerfreut zu reagieren.
Harald K. schrieb:> Ich habe Dir sinnvolle Hinweise gegeben. Gleich zweimal.>> Aber das hast Du vermutlich nicht verstanden,
Das habe ich auch registreiert, und versucht zu verstehen, wo Du mich
'hinlenken' willst. Ich habe hier einfach nicht den Fehler gesehen.
Nun läuft die Routine auch ferhlerfrei.
Mir ging es nicht um Deine Komentare, aber andere söseln da noch mit
rein, und dann wird der Tread lang.
Zum Beispiel hier. - Sowas ist überflüssig.
Norbert schrieb:> Möchtest du dem Forenbetreiber zunächst eine zusätzliche große> Festplatte spendieren? Das kann noch echt lang werden.
Thomas S. schrieb:> Zum Beispiel hier. - Sowas ist überflüssig.> Norbert schrieb:>> Möchtest du dem Forenbetreiber zunächst eine zusätzliche große>> Festplatte spendieren? Das kann noch echt lang werden.
Na Thomas, dann setz' das mal in den passenden Kontext.
Du quälst dich damit ein Bit eines Registers abzufragen und planst
zeitgleich Audiogenerierung mit Hüllkurven auf dem µC. Da sollte ein
wenig Ironie gestattet sein.
Thomas S. schrieb:> Nun läuft die Routine auch ferhlerfrei.
Hast du aber auch verstanden was warum der Code von Sherlock
funktioniert?
Das hilft dir bei deiner nächsten Code-Zeile.