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.
So ein paar Grundlagen zu erwerben, und mit praktischen Übungen zum Erweitern, wären auch sehr hilfreich und machen (jedenfalls mir) etwas mehr Spaß ;)
@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
Wenn PinB5 Lo wird, und das Flag 'False' ist
. soll das Flag 'High' werden
Wenn PinB5 wieder 'High' wird (weil das Eingangsignal weggeht), und das Flag 'High' ist, wird die Prozedere ausgeführt
Wird PinB5 'Lo', und das Flag False ist, wird das Flag 'High'.
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
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.
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.
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.
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.
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.
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.
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.
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.