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
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ß
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.
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 Lektionwü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.
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. ;)
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.
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.