Hallo zusammen, ich bin gerade dabei mich in das Thema µC einzuarbeiten. Um in der Praxis auch tätig zu sein, habe ich mir das Pollin Board v2.0 bestellt und programmiere mit einem ATMEG32. Die Inbetriebnahme des Board hat geklappt und einfach mal die 2 LED´s anschalten funktioniert auch super. Bin nun dabei eine einfache Abfrage zu schreiben. Lese Taste 1 ein und wenn dieser gedrückt wurde, schalte LED 1 ein. Aber irgendwie klappt das bei mir nicht. Anbei mein Programm: #include <avr/io.h> int main (void){ DDRD = 0b11100000; //Eingänge und Ausgänge definieren PORTD = 0b00011100; //Pull UP Widerstände aktivieren if (PIND == 0b00000100) // Abfragen ob Taster 1 gedrückt wurde { PORTD = 0b00100000; // Wenn ja dann Ausgang setzen, LED an } return 0; } Habe schon ein Teil der beiden Tutorials gelesen. Und da fangen auch meine Frage an: 1) Muss ich bei Tastern immer die Pull-UP Widerstände aktivieren, wenn ich extern keine habe? Habe das noch nicht ganz verstanden. Im Tutorial gibs ja die Übersicht, aber mich verwirrt das immer noch bißel, da ich denke das ich mir Bits überschreibe z.b sage ich PORTD = 0b00011100, was passiert denn wenn ich danach das 3.Bit bei PortD setze? Verliert er dann die Info das der Pull UP an dieser Stelle aktiv sein sollte? Vielleicht könnte mir das einer noch mal erklären. Stehe da noch auf dem Schlauch 2) Welche Sprache ist besser für den Anfang Assembler oder C? Habe gute Kenntnisse in C. Was wird bei den meisten Firmen bevorzugt? 3) Kann ich auch die Pins mit z.B. PIND.2 einlesen, abfragen PIND.2 ==1? Bekomme immer die Fehlermeldung das es ein Floatformat ist. Oder muss das in Hexa, Binär aufgeschrieben werden PIND.2 = 0x00000100? 4) Was ist in meinem obrigen Programm noch falsch, das ich die Eingänge nicht einlesen kann? 5) Wie kann ich eigentlich hier meinen Code richtig im Forum einbinden? Da steht ja was von [/code]. Muss das am Anfang und Ende des codes stehen? Hoffe ihr könnt Helfen. Danke, Gruß
Mach mal ein while(1){ ... } oder for(;;) {... } um die if Abfrage. Du fragst nur einmal, dann ist dein Programm bereits fertig. while(1) { if (PIND == 0b00000100) // Abfragen ob Taster 1 gedrückt wurde { PORTD = 0b00100000; // Wenn ja dann Ausgang setzen, LED an } } Zum Rest kann ich nicht viel sagen, weil ich nicht mit AVRs arbeite.
Beginner schrieb: > 1) Muss ich bei Tastern immer die Pull-UP Widerstände aktivieren, wenn > ich extern keine habe? Habe das noch nicht ganz verstanden. Im Tutorial > gibs ja die Übersicht, aber mich verwirrt das immer noch bißel, da ich > denke das ich mir Bits überschreibe z.b sage ich PORTD = 0b00011100, was > passiert denn wenn ich danach das 3.Bit bei PortD setze? Verliert er > dann die Info das der Pull UP an dieser Stelle aktiv sein sollte? > Vielleicht könnte mir das einer noch mal erklären. Stehe da noch auf dem > Schlauch Pullups können nur aktiv sein, wenn der jeweilige Pin als Eingang konfiguriert ist. Bein pollinboard sind die pullups aber sinnlos. Da haben die Taster nämlich externe Pulldown-Widerstande. > 2) Welche Sprache ist besser für den Anfang Assembler oder C? Habe gute > Kenntnisse in C. Was wird bei den meisten Firmen bevorzugt? Assembler gibt dir Feeling für die Hardware und von da her ist es sinnvoll die ersten programme in Assembler zu schreiben. > 3) Kann ich auch die Pins mit z.B. PIND.2 einlesen, abfragen PIND.2 ==1? > Bekomme immer die Fehlermeldung das es ein Floatformat ist. Oder muss > das in Hexa, Binär aufgeschrieben werden PIND.2 = 0x00000100? Nein geht nicht. > 4) Was ist in meinem obrigen Programm noch falsch, das ich die Eingänge > nicht einlesen kann? if (PIND == 0b00000100) // Abfragen ob Taster 1 gedrückt wurde Hier muss exakt das Bitmuster anliegen. Tut es das denn? Außerdem musst du dein Programm in einer Endlosschleife fangen. Das kann nirgendwo hin zurückkehren. > 5) Wie kann ich eigentlich hier meinen Code richtig im Forum einbinden? > Da steht ja was von [/code]. Muss das am Anfang und Ende des codes > stehen? [c ]...[/c] [code ]...[/code] Die Leerzeichen nach c und code noch entfernen
Stimmt, das hatte ich vergessen. Habe dies nun angewendet aber der Eingang wird unregelmäßig abgefragt. Teilweise geht die LED erst nach dem 10 mal drücken an, bzw wenn der Taster länger gedrückt wird. Woran liegt das, das dort keine definierte Abfrage erfolgt?
i vermute das die anderen Pins von port D 'floaten' dh. du must den Pin filtern vor dem vergleich irgend wie in der art dummy = pind AND 0b00000100 so ist sichergestellt das nur bit2 noch relevant ist vlG Charly
Beginner schrieb: > PORTD = 0b00011100; //Pull UP Widerstände aktivieren > > if (PIND == 0b00000100) // Abfragen ob Taster 1 gedrückt wurde > { > PORTD = 0b00100000; // Wenn ja dann Ausgang setzen, LED an Ich weiß nicht, ob du das schon geändert hast (neue version evtl posten), aber werden die Pull-up-Widerstände mit dem gleichen Register gesetzt, wie auch die Ausgänge?? Zuerst schreibst du nämlich in "PORTD" deine Einstellung für die pullups und bei der if-abfrage schreibst du in "PORTD" den Ausgangsstatus des Ports. Ich hatte das mal, dass ich vergessen hatte, den ADC auszuschalten, der am Port hängt. Allerdings bei einem anderen Controller. Vielleicht hast du ja auch am PORTD eine höherwertige Funktion als den digitalen Input bzw. Output. Zusätzlich kann es sein, wenn du pullups im µC und pulldowns auf dem Board hast, dass er so in der Mitte vom Logikpegel ist und er wackelt quasi
Hi Wenn du die Taster auf deinem Board benutzt, MUSST du die Pull-Up deaktivieren, sonst hast du am Eingang einen Spannungsteiler! Das Board hat wie bereits erwähnt externe Pull-Down ! Gruß oldmax
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.