Hallo Ich habe nun schon alles mögliche versucht aber ich schaffs nicht... Ich möchte das beim meinem Programm das in AVR GCC geschrieben werden soll zu beginn der eingang D überürüft wird Etwa so.... start If pind1 = high then portb = 0b00000000 portb = 0b00000011 if pind2 = high then portb = 0b00000000 portb = 0b00001100 if pind3 = high then portb = 0b00000000 portb = 0b00110000 goto start Fals die pins low sind soll nichts geschehen oder der wert der bereits gesetzt ist einfach bleiben. Ich weiss einfach nicht wie ich das als GCC schreiben soll bitte hilfe vielen dank
Vielleicht hilft dir das etwas: while(true) { //endlosschleife switch(PORTD) { case 1: { PORTB=0; //falls du das wirklich willst PORTB=0x02; // letzten beiden Bits auf 1 break; } case 2: { PORTB=0; PORTB=0x02<<2; //letzen beiden Bits auf 1 und dann um zwei Stellen nach links schieben break; } default: {} //garnix machen } } Uups, da hab ich was überlesen?! Also diese Version hier führt immer genau einen Fall aus. Wenn du z.B. pind3 und pind5 auf high abfragen willst, müsstest du bisschen rechnen. Wenn ich jetzt nicht völlig daneben liege, sollte das dezimal 8+32=40 ergeben. Dann müsstest du noch eine case 40: {PORTB=....} einbauen. Vielleicht bringt's dir ja was... Falls du so sehr viele Fälle bekommst, ist deine if-Lösung wahrscheinlich sinnvoller. Pack sie einfach in eine while Schleife rein. Die Abfrage "if pind0 == high" kannst du so machen: if( (PORTD&0x01!=0) ) {....} //pin0 high? Analog dann für pind1,pind2 usw: if ( (PORTD&0x02!=0) ) {...} //pin1 high? if ( (PORTD&0x04!=0) ) {...} //pin2 high? Hoffentlich hilfts dir. Gruss
Hmmm also da ich anfänger bin hab ich fast! nichts verstanden Was ich verstanden habe ist das ich eine endlos schleife machen soll also bis jetzt hab ich mal das hier... if ( PIND & (1<<PIND1) ) { DDRB = 0; DDRB = 0b00011100; } if ( PIND & (1<<PIND2) ) { DDRB = 0; DDRB = 0b10011100; } if ( PIND & (1<<PIND3) ) { DDRB = 0; DDRB = 0b01010100; Aber das klappt nicht Wenn der taster betätigt wird leuchten alle leds und wenn nicht gilt der unterste befehl hier DDRB = 0b01010100; Bei deinem code gab es viele fehler unter anderen undefined "true" }
Warum setzt du DDRB jedesmal erst auf 0, bevor du es auf den gewünschten Wert einstellst? Und warum benutzt du überhaupt DDRB? Ansonsten fehlt hier natürlich noch die Endlosschleife. Für das while(true) muss oben ein #include <stdbool.h> stehen.
"Bei deinem code gab es viele fehler unter anderen undefined "true"" Naja, sorry. ich habs halt so runtergetippt ohne weiter nachzudenken. Außerdem sollte dir das ja nur als Anregung dienen und ist keinesfalls als fertiger Kot gemeint gewesen. Aber zurück zum Problem: Beschreib doch bitte mal ein bisschen besser! Wie viele Taster hast du denn wie am Port D angeschlossen? Und dein Code kompiliert? Weil "if ( PIND & (1<<PIND3) )" sollte eigentlich "if ( PORTD & (1<<PINDx) )" lauten, oder? Ansonsten sollte das schon so funktionieren. In ner Endlosschleife die Tasten abfragen, Ausgaben setzen und im Zweifelsfall (kein Taster gedrückt) die Ausgabe nicht verändern. Du bist schon auf dem richtigen Weg, schreib hal mal ein bisschen ausführlicher, was du da zusammengebastelt hast, dann kann man sich bisschen besser reindenken. Gute Nacht wünsche ich!
Uhh ja, DDRB hab ich überlesen! Das musst/solltest du nur genau einmal bei Programmstart setzen um festzulegen, welche Pins als Ein- und Ausgang fungieren sollen. @ Rolf Magnus Naja, das mit dem Nullsetzen hat er quasi in der Vorgabe so gemacht. Keine Ahnung, ob's sinnig ist ;) Deshalb: Bitte ein bisschen ausführlicher! Nacht!
> Weil "if ( PIND & (1<<PIND3) )" sollte eigentlich "if ( PORTD & > (1<<PINDx) )" lauten, oder? Warum sollte es? Nein, PIND ist schon richtig.
Also Ich habe eine Trocknungs anlage gebastelt mit einem lüfter Nun soll dieser über 3 taster geschwindigkeits geregelt werden Also die geschwindigkeit wird über transistoren und widerständen die an den ausgängen des Mikrocontroller hängen sollen gesteuert werden. Und deshalb die das programm
Ja, das war Schmarn. PINA stimmt natürlich. schäm Claudio, les dir doch mal http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#I.2FO-Register durch! Da wird alles bestens erklärt. Und wenn ich dich richtig verstanden habe, willst du mit den Tastern eine von drei Geschwindigkeiten auswählen, ja? Dann kannst du doch ----------- DDRB=0x07; // entspricht 00000111 -> untere drei als Eingang, Rest Ausgang while(1) { switch(PIND) { case 1: {speed=low; break;} case 2: {speed=medium; break;} case 4: {speed=high; break;} default: {} } motor_steuern(speed); } ----------- zum Einlesen der Tasten benutzen. Das DDRB=0x07 solltest du nur genau einmal beim Programmstart machen, also z.B. gleich als erstes in main(). Und jetzt musste du doch nur noch die variable "speed" auswerten und dann die Ausgänge entprechend setzen. Hab das mal mit motor_steuern() angedeutet. Ich nehme an, du hast dir damit einen D/A Wandler gebastelt? Vielleicht wäre PWM interessant für dich! So, hoffentlich hab ich nicht zu viele Fehler gemacht! Sorry für den PORT/PIN Verwechsler nochmals ;) Natürlich kannst du auch alles auf einmal machen, die "motor_steuern()" Funktion rausstreichen und die Ausgänge direkt im switch-case setzen. Ich rate jetzt einfach mal, das niedrigste Geschwindigkeit bei dir bedeutet, das nur das unterste Bit vom Ausgang gesetzt ist. Bit0 bis Bit2 sind Eingänge für die Taster, also wäre Bit3 das unterste vom Ausgang. Anstelle von: case 1: {speed=low; break;} kannst du dann auch direkt: case 1: {PORTD=(1<<PD3); break;} schreiben! Find ich halt ein bisschen unübersichtlicher. Kommt aber aufs selbe raus! Gruss
Ok vielen dank und wie kann ich das jetzt in eine IF abfrage setzen? Also wegen PWM nein also die ausgänge... 3 Ausgänge sind an jeweils 3 Transistoren geschaltet die widerum haben jeder unterschiedliche widerstände die den Lüfter regeln Also zb so.. Ausgang1 = 20 Ohm Ausgang 2 = 50 Ohm Augnag 3 = 100 Ohm Nun das mit dem Abfragen hab ich so halbwegs verstanden Könntet ihr mir nicht al den gesamten code senden weil da lerne ich am meisten durch ausprobieren und verändern. Vielen dank für eure bisherige hilfe ihr gebt euch echt mühe danke! :D
Ei Jung, ich hab doch gar keinen kompletten Kot, ich denk mir das doch auch nur beim Tippen aus! Daher auch die bescheidene Qualität. Also, das mit der Eingabe ist jetzt okay so, ja? Dann bleibt noch die Ausgabe und es gibt nur genau eine Person auf der weiten Welt, die weiss, wie du die Transistoren mit den Ausgängen zusammengetüdelt hast! Insofern kann ich dir keinen kompletten Code geben! Falls du nur drei Geschwindigkeitstufen hast und jeder Geschwindigkeitsstufen genau ein Transistor und damit auch ein Ausgang vom Mikrocontroller zugeordnet ist, kannst du es doch wie oben beschrieben machen. Also case 1: {PORTD=(1<<PD3); break;} //Ausgang 1 an case 2: {PORTD=(1<<PD4); break;} //Ausgang 2 an case 4: {PORTD=(1<<PD5); break;} //Ausgang 3 an beispielsweise. Allerdings kommt mir jetzt beim Durchlesen ein komischer Verdacht auf! Ich will dein Projekt nochmal zusammenfassen, korrigier mich bitte, falls ich es falsch verstanden hab! Du willst mit drei Knöpfen drei Transistoren ansteuern, auf das ein Lüfter mit drei unterschiedlichen Geschwindigkeiten dreht. Richtig? Für was brauchst du denn da den Mikrocontroller eigentlich? Gruss
Der microcontroller soll machen das der Schalter wie nicht rausfällt weil es ja taster sein sollen Sonst müsste ich ja immer drauf drücken
>Könntet ihr mir nicht al den gesamten code senden weil da lerne ich am >meisten durch ausprobieren und verändern. Ganz im Gegenteil du lernst eben nicht. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial hier solltest du anfangen
Das hab ich schon zig mal durchgelesen und ich kann auch etwas ausgeben oder anhand EINES tasters etwas machen aber ich kriege keine schleife hind und auch keine abfrage von 3 tastern
Wenn du keine Schleife hinkriegst, dann solltest du mit einem ganz normalen Buch über C anfangen. Ausserdem wurde weiter oben schon mal aufgzeigt wie das gemacht wird. Aber im Ernst: Du solltest dir wirklich schleunigst Literatur besorgen. Wenn dir ein relativ simples Schleifenkonstrukt Schwierigkeiten bereitet, dann will ich gar nicht genauer wissen wo es sonst noch hapert. Foren und Newsgroups sind eine gute Hilfe wenn es darum geht Details abzuklären. Aber ein ordentliches Einführungsbuch können sie nicht ersetzen.
Ok werd mal sehen aber nur so zur info falls jemand die Programmiersprache Delphi kennen sollte Ich kann in delphi jedes noch erdenkliche programm programmieren also damit will ich sagen das mir eine Hochsprache wie delphi keine mühe bereitet. Für mich wäre am besten mal eine Liste mit allen Befehlen in GCC. Ich arbeite am liebsten nach dem baukasten Prinzip also immer das nehmen was gebraucht wird
Langsam versteh ich's auch nicht mehr. Mit welcher Schleife hast du denn eigentlich dein Problem? Ich versuche mich gerade an meine alten pascal "Kentnisse" zurückzuerinnern... while, for, do-while und das isses dann doch eigentlich gewesen. Wobei man natürlich jede Schleifenart in eine beliebige andere überführen kann. Wenn du eine Liste mit allen Befehlen im GCC bzw in C haben willst, suche doch mal nach einem der zahlosen C Tutorials im Netz oder kauf dir ein Buch zum Thema. Ansonsten gibts in meinem Vorschlag weiter oben doch nur eine einzige while(1) Schleife. Wo liegt da das Problem? Das ist halt eine Endlosschleife und das ist doch genau das, was du haben willst?! Dein Controller guckt dann permanent ob ein Taster gedrückt wurde und setzt dann ggf. den Ausgang neu. Und das alles macht er, bis der Strom ausfällt...
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.