www.mikrocontroller.net

Forum: Compiler & IDEs AVR GCC Schleife


Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: gandolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"




}

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: gandolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"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!

Autor: gandolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Weil "if ( PIND & (1<<PIND3) )" sollte eigentlich "if ( PORTD &
> (1<<PINDx) )" lauten, oder?

Warum sollte es? Nein, PIND ist schon richtig.

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: gandolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das war Schmarn.
PINA stimmt natürlich. schäm

Claudio, les dir doch mal
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
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


Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: gandolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: gandolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na gut ;)
Das seh ich ein.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Claudio H. (Firma: BLS-Electronics) (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: gandolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.