Schönen guten Morgen, ich bin Anfänge in sachen C Programmieren und habe jetz ein paar kleine Aufgaben gemacht. Ich habe Blinklichter programmiert und Lauflichter. Diese Codes habe ich dann versucht so weit wie geht zu stauchen. Jetz sitz ich gerade an meiner neuen Übung und möchte wenn ich einen Taster drücke das lauflicht anfängt zu "laufen" und wenn ich los lasse soll das Lauflciht auch aus sein. Ich habe ein code geschrieben wo ich nicht weiß ob der funktioniert, da ich auf arbeit bin und keinen Programmierer gerade bei mir habe, kann ich das gerade nicht testen. Wäre nett wenn ihr ma schaun könnt ob das so grundlegend richtig ist oder wenn nicht was falsch ist und wie man es anders machen kann bzw muss. #include<avr/io.h> #include<util/delay.h> int main() { int i; DDRB=0xFF; DDRD=0x00; while(1) { if(PORTD=0x01) { for (i=0; i < 8; i++) { PORTB = 1 << i; _delay_ms(500); } } else (PORTD=0) { DDRB=0; } } return1; } Vielen Dank im vorraus! Liebe Grüße Rob
Rob schrieb: > if(PORTD=0x01) Taster nach Masse? dann heißt das
1 | #define WO_IST_DER_KNOPF PD0
|
2 | #define KNOPF_PIN PIND
|
3 | #define KNOPF_DDR DDRD
|
4 | #define KNOPF_PORT PORTD
|
5 | |
6 | //knopp init
|
7 | KNOPF_DDR &= ~(1 << WO_IST_DER_KNOPF); |
8 | KNOPF_PORT |= (1 << WO_IST_DER_KNOPF); |
9 | |
10 | //abfrage
|
11 | if((KNOPF_PIN & (1 << WO_IST_DER_KNOPF)) != (1 << WO_IST_DER_KNOPF)) |
12 | {
|
13 | /*code*/
|
14 | }
|
Der Vergleichsoperator bei Vergleich heißt übrigens == und zum Port einlesen PIN benutzen. meinen Code kannste außerdem wiederbenutzen, wenn der knopf mal woanders hinkommt. mfg mf
Rob schrieb: > else (PORTD=0) der else-Zweig braucht keine Bedingung. er wird bei nicht-eintreten der Bedingung des if(Bedingung) ausgeführt. Rob schrieb: > da ich auf arbeit bin und keinen > Programmierer gerade bei mir habe, kann ich das gerade nicht testen. kompilieren kannst du es aber. Der wird eine Menge Errors schmeißen. Die kannst du dann Korrigieren. Nebenbei: if(PORTD = 0x01) ist immer "true", da eine Zuweisung erfolgt und der Wert "0x01" bewertet wird. der ist eben ungleich 0 und somit "true". solche Fehler bereiten einem oft stundenlange Fehlersuche im Code, nur weil ein == aus Versehen zu einem = verkommen ist. mfg mf
ja, fehlt halt noch dein Lauflicht, aber das bekomms du ja allein hin :) mfg mf PS:
1 | //abfrage
|
2 | if( !( KNOPF_PIN & (1 << WO_IST_DER_KNOPF) ) ) |
3 | {
|
4 | /*code*/
|
5 | }
|
wäre noch kürzer. !(Bedingung) dreht die Bedeutung von "true" und "false" um, es wäre somit auch
1 | //abfrage
|
2 | if(KNOPF_PIN & (1 << WO_IST_DER_KNOPF)) |
3 | {
|
4 | /*code für knopp nicht gedrückt*/
|
5 | }
|
6 | else
|
7 | {
|
8 | /*code für knopp gedrückt*/
|
9 | }
|
möglich.
Mini Float schrieb: > !(Bedingung) dreht die Bedeutung von "true" und "false" um Naja, hört sich seltsam an, diese Beschreibung einer simplen Negierung. Das "Nicht" ist eigentlich die allereinfachste logische Operation...
1 | // Zuhause mache ich den Kaffee selber
|
2 | if (BinZuhause) |
3 | MacheKaffeeSelber(); |
4 | |
5 | // Wenn ich nicht zuhause bin, kaufe ich den fertig
|
6 | if (!BinZuhause) |
7 | LasseKaffeeMachen(); |
Lothar Miller schrieb: > Das "Nicht" ist eigentlich die allereinfachste logische > Operation Ja, aber es ist die "logische" Negation "!(Ausdruck)" und nicht die Bitweise Negation "~(Ausdruck)". Wenn man aber an "logisches Irgendwas" denkt, denkt man meist an CMOS-/TTL-Logikschaltungen(was Bitoperationen entspräche). Viele Anfänger kommen so mit den Begrifflichkeiten ins Schleudern. Deswegen meine umständliche, komische Erklärung. Du hast natürlich recht :). In diesem Sinne mfg mf
Ich würde dazu raten, sich das Thema Entprellen erstmal völlig unabhängig von einem Projekt zu erarbeiten: 1. Eine Taste + eine LED. Bei jedem Drücken wechselt die LED. Wichtig: Die Dauer des Drückens darf keine Rolle spielen! 2. 2 .. 8 Tasten + 2 .. 8 LEDs. Bei jedem Drücken wechselt die zur Taste gehörende LED. Wichtig: Jede LED muß unabhängig von jeder anderen Taste funktionieren, also auch wenn diese gedrückt gehalten bleibt! Und wenn man das geschafft hat, schmeißt man alles weg und nimmt eine bewährte Lösung: http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29 Es programmiert sich nämlich deutlich entspannter, wenn man das Entprellen einmal verstanden und gelöst hat. Vorherige riesige Probleme werden plötzlich ganz einfach und in wenigen Zeilen zu erschlagen. Ich verstehe nicht, warum viele bei jedem Projekt immer wieder neu anfangen, irgendwelche abenteuerlichen Entprellkonstrukte in das Projekt hinein zu verweben. Man erspart sich enorm Zeit, wenn man das Entprellen als eigenständige Routine implementiert, die man dann nur noch aufrufen muß. Und die keinerlei störende Delays in das Programm mit einbaut. Peter
Okey danke. Ich werde mich dann mal ans Entprellen machen und das durch arbeiten.
Ich bin sehr dafür, dass jedenmal, wenn Peter auf seine (zugegebenermaßen sehr gute) Entprellroutine hinweist, ihm 10 ct überwiesen werden. :-P Von Deiner ersten Million kannst Du mir dann ja was abgeben, Peter. :-)
Peter Dannegger schrieb: > Thema Entprellen 3.141592653589793238462643383279 schrieb: > wenn Peter auf seine > (zugegebenermaßen sehr gute) Entprellroutine hinweist, ihm 10 ct > überwiesen werden Ich bin dafür, dass wenn Peter als erster im Thread seine eigene Entprellroutine vorschlägt, π(3,1416) keine Prozente bekommt. Außerdem wird Peter dir für deine Idee, auch wenn sie gut ist und Geld bringt, keine Prozente abdrücken, da die Entprellroutine seine Arbeit war/ist. mf
da ich auf arbeit bin und keinen Programmierer gerade bei mir habe, kann ich das gerade nicht testen. naja, sooo schlecht ist der Emulator im AVR Studio auch nicht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.