Hallo Forum, ich beschäftige mich seit einiger Zeit mit uCs und ich weis noch dass, als ich Anfänger war, ich über jede Hilfe froh war. Deshalb will ich auch mal was zurückgeben. Nach und nach werde ich das Tutorial erweitern. Das Tutorial ist theoretisch und praktisch aufgebaut also kann bestimmt jeder was mit anfangen. Erst mal die Grundlagen Logikpegel Wenn der Pegel 5V ist bedeutet das High oder 1 Wenn der Pegel 0V ist, also keine Spannung angeschlossen, bedeutet das Low oder 0 Es gibt auch 3.3V Logik, dann ist 3.3V High Taktfrequenz Mit dem Quarz an Xtal 1,2 bringt man quasi den uC zum schwingen. Ohne Takt leistet der uC nichts. Ports Jeder Port hat 8 Pins. Die können Eingänge oder Ausgänge sein. Jeder Pin kann 20mA liefern, also könnte man zB 8 normale LED betreiben, Bei 4 Ports sind das bis zu 32 LED. Jede LED kann man dann einzeln ansteuern Mit DDR und dem Portbuchstaben kann man die Richtung der Ports festlegen. Beispiel DDRA=145; Die Pins werden binär geschaltet. D h 145 wird intern nach binär umgewandelt. 145 entschlüsselt ist 10010001. 1 bedeutet Ausgang und 0 bedeutet Eingang. Also Hat Port d jetzt drei Ausgänge. Das umwandeln kan man selbst machen oder man benutzt ein Tool wie http://acc6.its.brooklyn.cuny.edu/~gurwitz/core5/nav2tool.html Mit PIN und dem Portbichstaben kann man den Pegel einlesen. Beispiel: DDRB=0; int a=PINB; Ein typischer Anfängerfehler zB int a=PORTB; zu schreiben. Das geht nicht. Wenn man jetzt nur an Pin 3 High dranlegt, dann wird a=8 Mit PORT und dem Portbuchstaben kann man den Pegel ausgeben. Beispiel: DDRB=255; PORTB=127; Nun ein einfaches Beispiel um mit einem Taster an Port B Pin 1 eine LED an Port a Pin a anzusteuern DDRA=255; DDRB=0; PORTA=0; while(1) { int a=0; a=PINB; if( PINB==1) PORTA=1; } Achtung: auch hier ist es ein typischer Anfängerfehler in der if Klammer = statt == zu benutzen. Ende der ersten Lektion Viel Spass und bis bald
:
Verschoben durch Moderator
Meins ist aber für C und meins ist didaktisch mehr für Hobby Anwender und nicht für Informatiker.
So ein quatsch aber auch. Es gibt auch ein AVR-GCC Tutorial. Dein Geschreibsel ist gruselig, wer soll da was lernen? Du scheinst selber noch auf Anfängerniveau festzuhängen. gruß cyblord
Andreax schrieb: > Beispiel DDRA=145; > Die Pins werden binär geschaltet. D h 145 wird intern nach binär > umgewandelt. 145 entschlüsselt ist 10010001. 1 bedeutet Ausgang und 0 > bedeutet Eingang. Also Hat Port d jetzt drei Ausgänge. schreib das doch direkt in binärschreibweise: DDRA=10010001; oder mit bitmanipulation. steht ber alles im AVR-GCC Tutorial
cyblord ---- schrieb: > So ein quatsch aber auch. Es gibt auch ein AVR-GCC Tutorial. Dein > Geschreibsel ist gruselig, wer soll da was lernen? Du scheinst selber > noch auf Anfängerniveau festzuhängen. > > gruß cyblord Wenn da ein Fehler drin ist kannst du doch darauf hinweisen. Das wäre konstruktiv. Man muss kein Profi sein um ein Tutorial zu schreiben. Aber Anfänger bin ich auch nicht mehr..
Andreax schrieb: > Meins ist aber für C und meins ist didaktisch mehr für Hobby Anwender > und nicht für Informatiker. Ist das AVR-GCC-Tutorial hier auch :-)
Hi >Beispiel DDRA=145; Das ist die dümmste Möglichkeit, die es gibt! Entweder DDRA=0b10010001; oder DDRA=1<<PA7|1<<PA5|1<<PA0; >Jeder Port hat 8 Pins Nicht unbedingt. Wie soll das z.B. bei einem 6- oder 8-pol. IC gehen? ..... >Ende der ersten Lektion Nichts für ungut. Aber wenn du dich nicht lächerlich machen willst dann: Ende des Tutorials MfG Spess
Andreax schrieb: > Viel Spass und bis bald Lass' man gut sein. Du solltest erstmal selbst ein Tutorial lesen und verstehen, bevor du versuchst eins zu schreiben. Andreax schrieb: > Man muss kein Profi sein um ein Tutorial zu schreiben. Doch. Andreax schrieb: > Aber Anfänger bin ich auch nicht mehr.. Doch. Andreax schrieb: > Wenn da ein Fehler drin ist kannst du doch darauf hinweisen. Einer würde ja noch gehen. mfg.
also für ein anfänger, der gleich losprogrammieren will ist das vielleicht hilfreich aber für mich persönlich wären das zu wenig infos. meiner meinung nach sollte ein einsteiger erstmal die ganzen grundlagen kennen bevor er anfängt zu programmieren.
Hallo ich wollte doch nur behilflich sein. Warum werde ich angegriffen. Ich werde das Tutorial vielleicht modifizieren. Lasst mir etwas Zeit. Es ist für Anfänger. Gruß
Andreax schrieb: > Es ist für Anfänger. Gruß Es hilft einem Anfänger nicht, wenn er halbgare Infos von einem Anfänger bekommt. Im Gegenteil.
Hier schon die Erweiterung Statt DDRA=145 kann man auch den Wert auch direkt schreiben damit der uC den Wert nicht umwandeln muss. DDRA=10010001; Quelle Hunt Worker DDRA=0b10010001; Quelle Spess DDRA=1<<PA7|1<<PA5|1<<PA0; Nicht jeder Port hat 8 Pins. Es gibt Avr mit weniger als 8 Pins und die können natürlich keinen 8 Pin Port haben. Also wie gesagt bis demnächst. Gruss
Andreax schrieb: > Wenn da ein Fehler drin ist kannst du doch darauf hinweisen. Deine Ausdrucksweise ist total falsch, zu einem Tutorial gehören auch die Einführung in die Fachausdrücke: > if Klammer Das da drinn ist eine Bedingung. > Mit dem Quarz an Xtal 1,2 bringt man quasi den uC zum schwingen. Klar, der Controller schwingt. Super ausgedrückt. Und wo ist der interne Oszillator abgeblieben? > Jeder Port hat 8 Pins. Gibt genügend AVRs wo das einfach nicht stimmt. Grausige Codebeispiele. Spaghetticode vom feinsten. Lass es, du bist selber noch Anfänger und musst noch viel lernen bevor du anderen was beibringen kannst. > Statt DDRA=145 kann man auch den Wert auch direkt schreiben damit der uC > den Wert nicht umwandeln muss. Willst du die Leute verarschen? Da muss der Controller doch nichts umwandeln. > Also wie gesagt bis demnächst. Hoffentlich nicht.... gruß cyblord
Andreax schrieb: > Statt DDRA=145 kann man auch den Wert auch direkt schreiben damit der uC > den Wert nicht umwandeln muss. Der Vollständigkeit halber solltest du noch erklären, wie der uC einen Wert wie 145 in 0b10010001 oder auch 1<<PA7|1<<PA5|1<<PA0 umwandelt, und welche der drei gezeigten Möglichkeiten falsch ist. Oliver
Hi >Statt DDRA=145 kann man auch den Wert auch direkt schreiben damit der uC >den Wert nicht umwandeln muss. Quatsch. Der Controller muss nichts umrechnen, das macht der Compiler. Es geht um die Lesbarkeit . >Es gibt Avr mit weniger als 8 Pins und die können natürlich keinen 8 Pin >Port haben. Es gibt auch grosse AVRs mit unvollständigen Ports. Wie viel Unsinn soll das noch werden? MfG Spess
Oliver schrieb: > Andreax schrieb: >> Statt DDRA=145 kann man auch den Wert auch direkt schreiben damit der uC >> den Wert nicht umwandeln muss. > > Der Vollständigkeit halber solltest du noch erklären, wie der uC einen > Wert wie 145 in 0b10010001 oder auch 1<<PA7|1<<PA5|1<<PA0 umwandelt, > und welche der drei gezeigten Möglichkeiten falsch ist. > > Oliver Ich hab das nur übernommen von den Komentaren. Ich bin vertraut mit meiner Weise (147) was doch funktioniert, also kann ich zu ihren Sachen nichts sagen.
DDRA = 0b10010001 ist btw die eleganteste Möglichkeit. Der uC kann den Wert, da er ja binär ist, direkt in das Register DDRA schreiben und spart sich 2 Takte, die er normal zum Umwandeln Dezimal <=> Binär bräuchte. Schlimm wirds bei den Atinys, die haben keine Hardwareeinheit zum Umrechnen, deshalb muss der Vorgang in Software nachgebildet werden. Hoffe beigetragen zu haben!
Andreax schrieb: > Statt DDRA=145 kann man auch den Wert auch direkt schreiben damit der uC > den Wert nicht umwandeln muss. Der µC muss den Wert nicht "umwandeln". Das erledigt schon der Compiler. Sieh einfach ein, dass dein Verständnis bei Weitem noch nicht ausreicht. Und das ist wirklich nicht böse gemeint! Versuche vielleicht zunächst einmal die Funktionsweise eines Compilers und vor allem die interne Architektur des µC zu verstehen. Letzteres wird dir am besten gelingen wenn Du zunächst einmal Assembler lernst und verstehst. Dafür gibt es jedoch bereits ein sehr gutes Tutorial hier ;-)
MisterT schrieb: > Der uC kann den Wert, da er ja binär ist, direkt in das Register DDRA > schreiben und spart sich 2 Takte, die er normal zum Umwandeln Dezimal > <=> Binär bräuchte. > > Schlimm wirds bei den Atinys, die haben keine Hardwareeinheit zum > Umrechnen, deshalb muss der Vorgang in Software nachgebildet werden. Das ist jetzt nicht Dein Ernst. Selten so einen Quatsch gelesen.
MisterT schrieb: > Hoffe beigetragen zu haben! Du hast das Niveau des "Tutorials" auf jeden Fall voll getroffen ;) Oliver
MWS schrieb: > MisterT schrieb: >> Der uC kann den Wert, da er ja binär ist, direkt in das Register DDRA >> schreiben und spart sich 2 Takte, die er normal zum Umwandeln Dezimal >> <=> Binär bräuchte. >> >> Schlimm wirds bei den Atinys, die haben keine Hardwareeinheit zum >> Umrechnen, deshalb muss der Vorgang in Software nachgebildet werden. > > Das ist jetzt nicht Dein Ernst. > Selten so einen Quatsch gelesen. Dein Beitrag ist aber auch nicht gerade so super. Statt nur zu sagen, dass es Quatsch ist, darfst du auch gerne schreiben, wie es richtig ist. Sonst ist dein Beitrag nicht viel besser. Gruß
Andreax schrieb: > Mit dem Quarz an Xtal 1,2 bringt man quasi den uC zum schwingen. Ohne > Takt leistet der uC nichts. auch falsch- der uc arbeitet im auslieferungszustand mit internem takt ohne externen quarz. bin selbst anfänger und deine idee ein tutorial für den schnellen einstieg zu schreiben find ich gut. meine weisheiten (avr betreffend) habe ich hier aus dem forum und mich dafür an anderer stelle auch schon artig bedankt. aber in dem bemühen der AVR Tutorial autoren das thema allumfassend darzustellen sieht der anfänger den sprichwörtlichen wald vor bäumen nicht mehr. eine geradeausanleitung- wie ein rezept wäre für einen einsteiger da sicher hilfreicher. man sollte allerdings wissen wovon man redet;-) walTTer
@ Andreax (Gast) >ich beschäftige mich seit einiger Zeit mit uCs Drei Wochen? Gibts schon ne AVR App? > und ich weis noch dass, >als ich Anfänger war, ich über jede Hilfe froh war. Deshalb will ich >auch mal was zurückgeben. Klingt eher nach übergeben. > Nach und nach werde ich das Tutorial >erweitern. Das Tutorial ist theoretisch und praktisch aufgebaut also >kann bestimmt jeder was mit anfangen. Oder auch nicht. >Erst mal die Grundlagen >Logikpegel >Wenn der Pegel 5V ist bedeutet das High oder 1 Was ist mit 3,3V Betrieb? >Wenn der Pegel 0V ist, also keine Spannung angeschlossen, bedeutet das >Low oder 0 Falsch. Wenn an einem Eingang nichts angeschlossen ist, dann ist er offen und genau das ist bei CMOS-Ics alles andere als gut. >Es gibt auch 3.3V Logik, dann ist 3.3V High Aha. Und bei 2,5V? >Taktfrequenz >Mit dem Quarz an Xtal 1,2 bringt man quasi den uC zum schwingen. Ohne >Takt leistet der uC nichts. so wie du >Ports >Jeder Port hat 8 Pins. Die können Eingänge oder Ausgänge sein. Jeder Pin >kann 20mA liefern, also könnte man zB 8 normale LED betreiben, Bei 4 >Ports sind das bis zu 32 LED. Und damit meistens der Controller mit 32x20mA=640mA hoffungslos überfahren. >Mit DDR und dem Portbuchstaben kann man die Richtung der Ports >festlegen. DDR? Dort hab ich mal gelebt! >Beispiel DDRA=145; Die Autobahnnummer gibt es nicht ;-) >Die Pins werden binär geschaltet. Was umso logischer ist, wenn man vorher ne Dezimalzahl hinschreibt. > D h 145 wird intern nach binär >umgewandelt. 145 entschlüsselt ist 10010001. 1 bedeutet Ausgang und 0 >bedeutet Eingang. Also Hat Port d jetzt drei Ausgänge. >Das umwandeln kan man selbst machen oder man benutzt ein Tool wie >http://acc6.its.brooklyn.cuny.edu/~gurwitz/core5/n... >Beispiel: DDRB=255; > PORTB=127; >Nun ein einfaches Beispiel um mit einem Taster an Port B Pin 1 eine LED >an Port a Pin a anzusteuern Soso, einfach. >Achtung: auch hier ist es ein typischer Anfängerfehler in der if Klammer >= statt == zu benutzen. >Ende der ersten Lektion würg Setzen, sechs! >Viel Spass und bis bald Ist das eine Drohung? MfG Falk P S Ein Artikel im Wiki un noch dreimal mehr ein TUTORIAL schüttel niemand einfach mal so in 5 Minuten aus dem Ärmel. Nichtmal die Vollprofis. Aber die App-Generation hat ja auch nicht mehr die Ruhe, sich mal wenigsten EINEN Tag hinzusetzen und mal bissel nachzudenken, da wird einfach nur schnell mal was ausgekotzt und als Kunst verkauft. Jaja.
Alex schrieb: > darfst du auch gerne schreiben, wie es richtig ist. Hatte schon mein Vorredner gemacht: Chris schrieb: > Der µC muss den Wert nicht "umwandeln". Das erledigt schon der Compiler. Alex schrieb: > Sonst ist dein Beitrag nicht viel besser. Doch, das ist er auf jeden Fall. Allein dadurch dass darin kein Unsinn verzapft wird. Und das hat hier nichts mit Zurückgeben zu tun, denn ein Tutorial von Nichtwissenden für Nichtwissende ist allein dazu geeignet Nichtwissen zu vermitteln.
MisterT schrieb: > Der uC kann den Wert, da er ja binär ist, direkt in das Register DDR > schreiben und spart sich 2 Takte, die er normal zum Umwandeln Dezimal > <=> Binär bräuchte. > Hoffe beigetragen zu haben! Gott bewahre! Geh' mit Andreax (Gast) einen trinken und sülzt euch gegenseitig voll, aber verschont den Rest dieser Welt mit euren Weisheiten. Mods, wo bleibt das Schloss? mfg.
Wenn man sich nur auf negatives konzentriert kann man alles schlecht aussehen lassen. Na schön dann hab ich halt den einen oder anderen Fehler, aber auch viel Wissen kann vermittelt werden. Sucht doch mal in euerm Tutorial nach Fehlern wer sucht der findet.
Andreax schrieb: > Wenn man sich nur auf negatives konzentriert kann man alles schlecht > aussehen lassen. Es IST schlecht. > Sucht doch mal in > euerm Tutorial nach Fehlern wer sucht der findet. Oho jetzt gibts schon "euer" und "mein" Tutorial. Sehr gute Einstellung in einer Community. Du weißt dass das Tutorial hier ein Wiki ist und wenn du einen Fehler findest darfst du ihn gerne korrigieren. Oder wenn du meinst, einige Dinge wären nicht anfängergerecht und könnten besser dargestellt werden. Damit würdest du mehr helfen als hier total falsche Dinge zu verbreiten. Aber wenn du da reinschreibst dass der Controller Dezimalzahlen erstmal zu Binärzahlen umwandeln muss dann wirst du gesteinigt. gruß cyblord
Andreax schrieb: > DDRA=10010001; Quelle Hunt Worker Schon falsch bzw. mit Sicherheit nicht das, was der Autor bezweckt: die Zahl ist eine Dezimalzahl; nur dadurch, daß sie nur 0 und 1 als Ziffern hat, wird die Darstellung nicht zur Binärdarstellung. Für diese Zahl sind die 8 niederwertigsten Ziffern in Binär- und Dezimaldarstellung zwar identisch, was aber auch nicht hilft.
Es geht kurz weiter. Denn so wie ich das sehe hilft das Tutorial viel mehr als es schadet. Und es gibt bestimmt auch Leute die wollen das ich weitermache. Nur so wie hier welche angreifen trauen sie sich nicht. Kann gut sein. Helligkeit der LED ändern Wenn man bei der Gitarre die tiefe Saite zupt schwingt die Saite langsam weit hin und her. Wenn man die kleinset Saite zupft schwingst sie schnell aber auch eng. Das kann man beim Avr benutzen um die Spannung zu ändern. Beispiel: mit der höchsten Frequenz LED ansteuern. DDRA=255; while (1) { PORTA=0; PORTA=255; }
Andreax schrieb: > Und es gibt bestimmt auch Leute die wollen das ich weitermache. Nein, auf den Schmarrn von Dir wartet kein Mensch. Andreax schrieb: > Das kann man beim Avr benutzen um die Spannung zu > ändern. Die Spannung ändert sich nicht. Langsam glaub' ich's nicht mehr, dass man so ein Vollpfosten sein kann, ich denk Du willst einfach nur ein wenig provozieren.
Also ich find's toll. Endlich mal was mit Unterhaltungswert. Und das sogar ganz ohne Zuckerle!
Andreax schrieb: > Und es gibt bestimmt auch Leute die wollen das ich > weitermache. Troll-Fetischisten hier?
HI >Und es gibt bestimmt auch Leute die wollen das ich >weitermache. Wzbw (Was zu bezweifeln wäre). >Beispiel: mit der höchsten Frequenz LED ansteuern. >DDRA=255; >while (1) >{ >PORTA=0; >PORTA=255; >} Schon wieder diese unmöglichen Dezimalzahlen. Außerdem geht es bei vielen AVRs noch schneller. MfG Spess
Nichts für ungut "Andreax". Ich halte es für äußerst unprofessionell, dass du hier von so vielen Seiten angegriffen wirst (zum Teil sogar persönlich). Ich weiß auch nicht warum eine ganze Generation "App" dafür gerade stehen muss. Aber unabhängig vom Inhalt deines Tutorials, welcher in der Tat sehr bescheiden ist, handelt es sich hier einfach um die falsche Plattform dafür. Du glaubst doch nicht ernsthaft, dass sich jemand durch ein Thread wühlt, welcher vor "Kritik" nur so wimmelt, um wieder ein paar Zeilen, welche von dir stammen und zum eigentlichen Tutorial gehören, zu finden. Daher schlage ich dir Folgendes vor: Formuliere das Ganze lokal aus - komplett. Damit hast wenigstens du einen Überblick über den Inhalt des Tutorials. Bei deinem aktuellen Schreibstil und Wissensstand solltest du dann am besten sehr viele Leute drüber schauen lassen. Anschließend kann man sich dann überlegen wie und wo man das am Besten veröffentlicht. Deine Energie und Motivation sind sicherlich löblich, aber man sollte das dann auch dahingehend fokussieren, dass für die Allgemeinheit ein Mehrwert entsteht. So jedenfalls hat das einfach keinen Sinn - weder in dieser Form noch mit diesem Inhalt.
cyblord ---- schrieb: > Andreax schrieb: >> Wenn man sich nur auf negatives konzentriert kann man alles schlecht >> aussehen lassen. > Es IST schlecht. > >> Sucht doch mal in >> euerm Tutorial nach Fehlern wer sucht der findet. > Oho jetzt gibts schon "euer" und "mein" Tutorial. Sehr gute Einstellung > in einer Community. Community, das ich nicht lache. Ich hab einen Fehler gefunden den niemand bemerkt hat oder vielleicht weis niemand Bescheid > Andreax schrieb: while(1) { int a=0; a=PINB; if( PINB==1) PORTA=1; } Man darf die Definition int a=0 nicht in den while Bereich reinschreiben weil sie dort ständig wiederholt wird. Das darf man nicht So ist es richtig int a=0; while(1) { a=PINB; if( PINB==1) PORTA=1; } Ich würde mich freuen wenn ich einigen hier geholfen habe. Machts gut
Andreax schrieb: > Man darf die Definition int a=0 nicht in den while Bereich reinschreiben > weil sie dort ständig wiederholt wird. Das darf man nicht Du bist ja nen ganz Harter, machst dich über deine eigene Fehler lustig. Natürlich sieht das nicht gut aus, daher auch meine Aussage dass du grausigen Code produzierst. Aber man darf und es geht. Warum kannst du ja mal rausfinden. Alleine. Für dich. gruß cyblord
Karol Babioch schrieb: > Ich weiß auch nicht warum eine ganze Generation "App" dafür > gerade stehen muss. Weil "Wir denken nicht mehr, wir googeln. Und das ist auch gut so." Das Problem ist dies, dass vielleicht Mama ein Lob ausspricht, wenn der Kleine alleine auf's Töpfchen geht oder ein Bäuerchen macht, nur wenn sich jemand tatsächlich mit dem Anspruch "AVR Tutorial" vorwagt und dann so einen erbärmlichen Blödsinn schreibt, gibt's halt nicht mehr Mama's wohlwollende Reaktion. Und das ist auch gut so. > Ich halte es für äußerst unprofessionell, Das hat nichts mit unprofessionell zu tun, eher mit dem Schutz von Anfängern vor solchen geistigen Blähungen.
Andreax schrieb: > D h 145 wird intern nach binär > umgewandelt. Bitte mach' mich glücklich, und teile Dein Wissen mit mir, wieviele Takte ein AVR dafür benötigt. Ist diese conversion time fix, Werte-abhängig, oder gar nicht-deterministisch? Bislang bedauernswerterweise ergebnisoffen suche und forsche ich danach bereits seit Jahren. Danke!
Andreax schrieb: > Man darf die Definition int a=0 nicht in den while Bereich reinschreiben Doch darf man. Und bei deinem Programm macht es noch nicht einmal einen Unterschied. Aber: Andreax, dein Versuch ehrt dich. Aber die Situation ist leider die, dass dein Tutorial in der Form nix taugt. Das ist nicht böse gemeint, das ist einfach nur eine neutrale, objektive Sichtweise. Ein Tutorial zu schreiben ist nicht einfach. Auf der einen Seite muss man die Information vermitteln, die wichtig ist und auf der anderen Seite darf man den Leser auch nicht überfordern. Bei deinem Ansatz überforderst du niemandan. So gesehen wäre das schon ok. Aber: Du vermittelst noch nicht einmal ansatzweise die Information die tatsächlich wichtig ist, ohne die es nicht geht. Und wenn ich mir deine Antworten so ansehe, dann liegt das noch nicht einmal daran, dass du sie absichtlich weggelassen hast. Der springende Punkt ist: Du weißt sie selber nicht. Und das sind nun mal keine guten Voraussetzungen, um ein Tutorial zu schreiben. Du schadest damit anderen mehr als du ihnen hilfst. (Und persönlich würde ich dir mal ein paar Stunden nachdenken über Zahlensysteme naheliegen. Die Thematik ist an und für sich nicht schwer, nur hattest du vorher noch nie damit zu tun. Und es gibt dabei viel zu lernen)
Falls die ständige Neuinitialisierung stören sollte, schreibe doch einfach ein 'static' vor Deinen Ausdruck, und kläre uns auf, was sich damit geändert haben könnte. Das wäre doch mal 'nen Tutorial. ;)
Hubert S. schrieb: > Pappnase schrieb: >> 'nen Troll >> 'nen Tutorial > > 'nen Deutschkurs! 'nen Oberlährer
Hunt Worker schrieb: > Andreax schrieb: >> Beispiel DDRA=145; >> Die Pins werden binär geschaltet. D h 145 wird intern nach binär >> umgewandelt. 145 entschlüsselt ist 10010001. 1 bedeutet Ausgang und 0 >> bedeutet Eingang. Also Hat Port d jetzt drei Ausgänge. > > schreib das doch direkt in binärschreibweise: > > DDRA=10010001; > Hier hab ich jetzt aber einen Fehler entdeckt. Richtig heisst es 0b10010001.
@Hubert S. mache Dir um mir keine Sorgen, Deutsch beherrsche ich treffsicher http://de.wikipedia.org/wiki/Auslassungszeichen http://de.wiktionary.org/w/index.php?title=%E2%80%99nen&action=edit&redlink=1
Pappnase schrieb: > @Hubert S. mache Dir um mir keine Sorgen, Deutsch beherrsche ich > treffsicher Tust du nicht! Das heißt "ein Troll" oder abgekürzt "'n Troll" oder ersatzweise "n Troll". Niemals aber "'nen Troll" - auch wenn die Generation App die Benutzung von "'nen" geil findet. Gleiches gilt für das Tutorial. Und jetzt ab ins Bett. Morgen ist wieder Schule. Gut aufpassen!
Schreiben in Register Zum Schreiben kann man Register einfach wie eine Variable setzen. Beispiel: #include <avr/io.h> int main() { /* Setzt das Richtungsregister des Ports A auf 0xff (alle Pins als Ausgang, vgl. Abschnitt Zugriff auf Ports): */ DDRA = 0xff; /* Setzt PortA auf 0x03, Bit 0 und 1 "high", restliche "low": */ PORTA = 0x03; // Setzen der Bits 0,1,2,3 und 4 // Binär 00011111 = Hexadezimal 1F DDRB = 0x1F; /* direkte Zuweisung - unübersichtlich */ /* Ausführliche Schreibweise: identische Funktionalität, mehr Tipparbeit aber übersichtlicher und selbsterklärend: */ DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4); while (1); } Die ausführliche Schreibweise sollte bevorzugt verwendet werden, da dadurch die Zuweisungen selbsterklärend sind und somit der Code leichter nachvollzogen werden kann. Atmel verwendet sie auch bei Beispielen in Datenblätten und in den allermeisten Quellcodes zu Application-Notes. Mehr zu der Schreibweise mit "|" und "<<" findet man unter Bitmanipulation. Der gcc C-Compiler unterstützt ab Version 4.3.0 Konstanten im Binärformat, z. B. DDRB = 0b00011111. Diese Schreibweise ist jedoch nur in GNU-C verfügbar und nicht in ISO-C definiert. Man sollte sie daher nicht verwenden, wenn Code mit anderen ausgetauscht oder mit anderen Compilern bzw. älteren Versionen des gcc genutzt werden soll.
Es geht wieder weiter im Tutorial Warten auf einen bestimmten Zustand Es gibt in der Bibliothek avr-libc Funktionen, die warten, bis ein bestimmter Zustand eines Bits erreicht ist. Es ist allerdings normalerweise eine eher unschöne Programmiertechnik, da in diesen Funktionen "blockierend" gewartet wird. Der Programmablauf bleibt also an dieser Stelle stehen, bis das maskierte Ereignis erfolgt ist. Setzt man den Watchdog ein, muss man darauf achten, dass dieser auch noch getriggert wird (Zurücksetzen des Watchdogtimers). Die Funktion loop_until_bit_is_set wartet in einer Schleife, bis das definierte Bit gesetzt ist. Wenn das Bit beim Aufruf der Funktion bereits gesetzt ist, wird die Funktion sofort wieder verlassen. Das niederwertigste Bit hat die Bitnummer 0. #include <avr/io.h> ... /* Warten bis Bit Nr. 2 (das dritte Bit) in Register PINA gesetzt (1) ist */ #define WARTEPIN PINA #define WARTEBIT PA2 // mit der avr-libc Funktion: loop_until_bit_is_set(WARTEPIN, WARTEBIT); // dito in "C-Standard": // Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN // nicht ungleich 0 (also 0) ist. while ( !(WARTEPIN & (1 << WARTEBIT)) ) {} ... Die Funktion loop_until_bit_is_clear wartet in einer Schleife, bis das definierte Bit gelöscht ist. Wenn das Bit beim Aufruf der Funktion bereits gelöscht ist, wird die Funktion sofort wieder verlassen. #include <avr/io.h> ... /* Warten bis Bit Nr. 4 (das fuenfte Bit) in Register PINB geloescht (0) ist */ #define WARTEPIN PINB #define WARTEBIT PB4 // avr-libc-Funktion: loop_until_bit_is_clear(WARTEPIN, WARTEBIT); // dito in "C-Standard": // Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN // gesetzt (1) ist while ( WARTEPIN & (1<<WARTEBIT) ) {} ... Universeller und auch auf andere Plattformen besser übertragbar ist die Verwendung von C-Standardoperationen.
ich glaube das Problem an halbgaren Tutorials ist, und ich vermute dass es das ist was die meisten schlimm finden, dass sie vom Netz nicht vergessen werden und geistern noch über Jahre. als ich angefangen habe, habe ich mir ein Buch besorgt. Wenn ich heute in so ein Buch reinschaue, denke ich oft, dass die Autoren sich vergeblich die Mühe machen. Am allerbesten ist es sich auf ein "device" einzulassen und das Datenblatt dazu anzuschauen. Wenn sein muss - ganze Woche lang, wenn man Zeit hat, Paar Stunden am Tag. Immer häppchenweise Peripherie austesten. Bringt mehr als jedes Buch und Tutorial sowieso. Ich hatte den grossen Vorteil, dass ich C, C++ und einige mehr für PC Plattform gut beherrscht habe. Jemand der beides gleichzeitig lernt, kämpft an zwei Fronten. Und zuletzt: Tutorial in Beitragsform ist denkbar ungeeignet. Man kann nicht nachträglich editieren. Besser ein Nischenthema wählen und Artikel schreiben ;)
>> Und jetzt ab ins Bett. Morgen ist wieder Schule. Gut aufpassen!
Mache ich! Doof nur, morgen und sonst nie mehr werde ich wohl 'ne
(bemerkt?) Schule wiedersehen, Herr Oberlehrer. Trotzdem Danke für die
gefundenen Rechtschreibfehler. Darfst sie auch behalten. (ehrlich)
Andreax, ein Vorschlag. Installier dir irgendwo ein WIKI und schreib dort dein Tutorial. Das was du hier machst ist nämlich obersinnlos. Spätestens morgen abend ist dein Beitrag schon auf die 2. Seite gerutscht und nächste Woche ist der Beitrag ganz weit hinten. Den findet kein Mensch mehr. Mach irgendwo ein WIKI auf, fang dein Tutorial an zu schreiben und wenn du denkst, du hättest eine kritische Masse erreicht, dann gib Bescheid, dann sehen wir uns das an und sagen dir was du besser machen kannst.