Hi zusammen, habe heute angefangen mit asm, also leds einschalten/ausschalten kann ich schonmal. Würde jetzt noch gerne wissen, wie ich dem µC (mega16) sage er soll etwas warten (F_CPU ist 1MHz) folgendes programm habe ich dazu in asm geschrieben, es fehlt lediglich der Eintrag für das sleep :) //--------------------------------------------------------------- .include "m16def.inc" ;ATMega16 Definitionen einbinden IO_Init: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out DDRA, r16 ;r16 Register in DDRA schreiben ;ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out DDRC, r16 ;r16 Register in DDRC schreiben ldi r16, 0xC0 ;r16 Register mit 1100 0000 füllen out DDRD, r16 ;r16 Register in DDRD schreiben loop: rcall all_on rcall all_off /* Hier soll kurzes SLEEP rein*/ rjmp loop all_on: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out PORTA, r16 ;PORTA auf 0xFF setzen -> alle LEDs an out PORTC, r16 ;PORTC auf 0xFF setzen -> alle LEDs an ldi r16, 0xC0 ;r16 Register mit 1000 0000 füllen out PORTD, r16 ;PORTD auf 0x80 setzen -> LED7 an ret ;wieder zurück all_off: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out PORTA, r16 ;PORTA auf 0xFF setzen -> alle LEDs an out PORTC, r16 ;PORTC auf 0xFF setzen -> alle LEDs an ldi r16, 0xC0 ;r16 Register mit 1000 0000 füllen out PORTD, r16 ;PORTD auf 0x80 setzen -> LED7 an ret ;wieder zurück //--------------------------------------------------------------- das wäre erstmal alles für den anfang ich hoffe jemand weiß Rat :)
sleep und nop sind zwei VÖLLIG VERSCHIEDENE Dinge! nop sagt dem µC einfach, er soll genau einen Taktzyklus lang gar nichts tun. sleep versetzt den µC in eine der Stromspar-Betriebsarten, und zwar abhängig davon, welche dieser Betriebsarten vorher eingestellt wurde. Um aus diesem Stromspar-Modus wieder aufzuwachen, benötigt der µC ein bestimmtes Ereignis. sleep macht nur dann Sinn, wenn es darum geht, in Zeiten der Inaktivität nur so viel Strom zu verbrauchen wie grad nötig. Wartezeiten im µs-Bereich (in der Größenordnung der Taktzykluszeit des µC) kann man durch nops oder Zählschleifen realisieren. Alles was darüber hinausgeht macht man i.d.R. mit einem Timer.
ok, sowas will ich ja alles nicht, ich will ja nur, das der µC mal kurz wartet und dann wider alle LEDs aus macht, damit man da mal überhaupt was sieht, also wenn ich die mit 1MHz ein/aus schalten würde würde ich ja nichts sehen, weils so schnell gehen würde..... sowas wie in C _delay(); das wäre fein wie würde denn so eine zählschleife aussehen ? in C wäre das alles kein Problem :)
aus lcd tutorial: delay5ms: ;5ms Pause ldi temp1, $21 WGLOOP0: ldi temp2, $C9 WGLOOP1: dec temp2 brne WGLOOP1 dec temp1 brne WGLOOP0 ret ;wieder zurück mfg thomas
Nee tuts nicht... der kennt temp1 und remp2.... nicht.... habe in einem anderen beitrag den Warteschleifen-generator gefunden aber der geht auch nicht, hier der code: //---------------------------------------------------------------------- .include "m16def.inc" ;ATMega16 Definitionen einbinden IO_Init: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out DDRA, r16 ;r16 Register in DDRA schreiben ;ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out DDRC, r16 ;r16 Register in DDRC schreiben ldi r16, 0xC0 ;r16 Register mit 1100 0000 füllen out DDRD, r16 ;r16 Register in DDRD schreiben loop: rcall all_on rcall schlaf rcall all_off rcall schlaf rjmp loop schlaf: ; ============================= ; Warteschleifen-Generator ; 1000000 Zyklen: ; ----------------------------- ; warte 999999 Zyklen: ldi R17, $09 WGLOOP0: ldi R18, $BC WGLOOP1: ldi R19, $C4 WGLOOP2: dec R19 brne WGLOOP2 dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ret all_on: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out PORTA, r16 ;PORTA auf 0xFF setzen -> alle LEDs an out PORTC, r16 ;PORTC auf 0xFF setzen -> alle LEDs an ldi r16, 0xC0 ;r16 Register mit 1000 0000 füllen out PORTD, r16 ;PORTD auf 0x80 setzen -> LED7 an ret ;wieder zurück all_off: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out PORTA, r16 ;PORTA auf 0xFF setzen -> alle LEDs an out PORTC, r16 ;PORTC auf 0xFF setzen -> alle LEDs an ldi r16, 0xC0 ;r16 Register mit 1000 0000 füllen out PORTD, r16 ;PORTD auf 0x80 setzen -> LED7 an ret ;wieder zurück //----------------------------------------------------------------------
temp1 etc. sind variablen, die muss du vorher definieren, schau mal ins tutotial
finde ich nicht, da steht weder wie man variablen deklariert, noch sonst was...
> da steht weder wie man variablen deklariert
OK, der Begriff 'Varable' kommt im ASM-Tutorial wahrscheinlich nicht
vor, aber damit ist sowas gemeint:
1 | .def temp1=r16 |
Um Registern Namen zugeben, die man besser versteht. Kannst mal in der AVR-Studio Hilfe danach schauen (und gleich auch .EQU) hth. Jörg
warum tut es denn dieses Programm hier nicht ?? Würde gerne etwas mehr als 5ms nops haben.... so das man da auch deutlich was erkennen kann //---------------------------------------------------------------------- .include "m16def.inc" ;ATMega16 Definitionen einbinden IO_Init: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out DDRA, r16 ;r16 Register in DDRA schreiben ;ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out DDRC, r16 ;r16 Register in DDRC schreiben ldi r16, 0xC0 ;r16 Register mit 1100 0000 füllen out DDRD, r16 ;r16 Register in DDRD schreiben loop: rcall all_on rcall schlaf rcall all_off rcall schlaf rjmp loop schlaf: ; ============================= ; Warteschleifen-Generator ; 1000000 Zyklen: ; ----------------------------- ; warte 999999 Zyklen: ldi R17, $09 WGLOOP0: ldi R18, $BC WGLOOP1: ldi R19, $C4 WGLOOP2: dec R19 brne WGLOOP2 dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ret all_on: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out PORTA, r16 ;PORTA auf 0xFF setzen -> alle LEDs an out PORTC, r16 ;PORTC auf 0xFF setzen -> alle LEDs an ldi r16, 0xC0 ;r16 Register mit 1000 0000 füllen out PORTD, r16 ;PORTD auf 0x80 setzen -> LED7 an ret ;wieder zurück all_off: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out PORTA, r16 ;PORTA auf 0xFF setzen -> alle LEDs an out PORTC, r16 ;PORTC auf 0xFF setzen -> alle LEDs an ldi r16, 0xC0 ;r16 Register mit 1000 0000 füllen out PORTD, r16 ;PORTD auf 0x80 setzen -> LED7 an ret ;wieder zurück //----------------------------------------------------------------------
> warum tut es denn dieses Programm hier nicht ??
weil Du bei "All_On" und "All_Off" "FF" auf die Ports gibst....
Du benutzt RCALL/RET ohne den Stackpointer initialisiert zu haben. Das gibt Stacksalat. ...
ok, habe mal versucht ausm dem tut herauszulesen, wie ich den stackpointer initialisiere, aber bin da nicht fündig geworden.... das mit dem FF habe ich geändert,
asm-Neuling wrote: > ok, sowas will ich ja alles nicht, ich will ja nur, das der µC mal kurz > wartet und dann wider alle LEDs aus macht, damit man da mal überhaupt > was sieht Wenn Du was sehen willst, dann meinst Du wohl Sekunden. Das ist für nen MC aber alles andere als kurz, 1s = 20000000 Zyklen. Entweder Du nimmst nen Timer mit großem Prescaler oder ne Menge Zählschleifen kaskadiert. Die Delayschleifen sind nur für kurze Zeiten (einige 10..1000 Zyklen, also im kHz-Bereich) gedacht. Peter
ldi temp, RAMEND ; Stackpointer initialisieren da habe ich was gefunden.... ist das alles was ich zur initialisierung benötige ??
asm-Neuling wrote: > ldi temp, RAMEND ; Stackpointer initialisieren > > da habe ich was gefunden.... > > ist das alles was ich zur initialisierung benötige ?? Nein. Lies Dir das Tutorial bitte mal von Anfang an durch und versuche, es zu verstehen! So hat das keinen Zweck. Da steht nämlich alles Wichtige drin, und es ist absoluter Unsinn, sich das hier zusammenzufragen.
Ja schon aber da ich heute erst mit asm angefangen bin, möchte ich mich nicht direkt in timer/prescaler und so ranwaen..... .include "m16def.inc" ;ATMega16 Definitionen einbinden .def temp = r16 ldi temp, RAMEND ; Stackpointer initialisieren out SPL, temp IO_Init: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out DDRA, r16 ;r16 Register in DDRA schreiben ;ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out DDRC, r16 ;r16 Register in DDRC schreiben ldi r16, 0xC0 ;r16 Register mit 1100 0000 füllen out DDRD, r16 ;r16 Register in DDRD schreiben loop: rcall all_on rcall schlaf rcall all_off rcall schlaf rjmp loop schlaf: ; ============================= ; Warteschleifen-Generator ; 1000000 Zyklen: ; ----------------------------- ; warte 999999 Zyklen: ldi R17, $09 WGLOOP0: ldi R18, $BC WGLOOP1: ldi R19, $C4 WGLOOP2: dec R19 brne WGLOOP2 dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ret all_on: ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen out PORTA, r16 ;PORTA auf 0xFF setzen -> alle LEDs an out PORTC, r16 ;PORTC auf 0xFF setzen -> alle LEDs an ldi r16, 0xC0 ;r16 Register mit 1000 0000 füllen out PORTD, r16 ;PORTD auf 0x80 setzen -> LED7 an ret ;wieder zurück all_off: ldi r16, 0x00 ;r16 Register mit 1111 1111 füllen out PORTA, r16 ;PORTA auf 0xFF setzen -> alle LEDs an out PORTC, r16 ;PORTC auf 0xFF setzen -> alle LEDs an out PORTD, r16 ;PORTD auf 0x80 setzen -> LED7 an ret ;wieder zurück bekome jetzt aber immer folgenden Fehler: D:\Programmierung\Assembler\IO Grundlagen\LEDs\bitaccess\bitaccess.asm(25): error: Operand(s) out of range in 'ldi r16,0x45f'
Du solltest unbedingt das (ganze!!!) Tutorial durcharbeiten und die Beispielcodes anderer Leute analysieren. Auch das Datenblatt solltest Du lesen und versuchen zu verstehen, hinter dem Abschnitt Interrupt-Quellen ist ein Beispielcode, der auch den Stackpointer initialisiert. ...
Hallo asm_Neuling, unterstellt, dass die LED an Port D Bit 7 angeschlossen ist und über einen Vorwiderstand gegen Masse verbunden ist, sollte in all_on: ; ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen ; out PORTA, r16 ;PORTA auf 0xFF setzen -> alle LEDs an ; out PORTC, r16 ;PORTC auf 0xFF setzen -> alle LEDs an ldi r16, 0x80 ;r16 Register mit 1000 0000 füllen out PORTD, r16 ;PORTD auf 0x80 setzen -> LED7 an ret ;wieder zurück und in all_off: ; ldi r16, 0xFF ;r16 Register mit 1111 1111 füllen : out PORTA, r16 ;PORTA auf 0xFF setzen -> alle LEDs an ; out PORTC, r16 ;PORTC auf 0xFF setzen -> alle LEDs an ldi r16, 0x00 ;r16 Register mit 0000 0000 füllen out PORTD, r16 ;PORTD auf 0x7F setzen -> LED7 aus ret ;wieder zurück stehen. Die Anweisungen zu PORTA und PORTC braucht es nicht. Das gleiche Ergebnis lässt sich auch eleganter mit den Anweisungen SBI und CBI erreichen. Siehe ASM-Handbuch. Man braucht dann das Register r16 nicht zu bemühen.
Hallo asm_Neuling, ein Tutorial verfolgt normalerweise den Zweck, den Leser an der Hand zu nehmen und Schritt für Schritt zu führen, wenn er sich nicht autodidaktisch durch die Datenblätter "fressen" möchte. Aus einem Tutorial beliebig das Eine und das Andere heraus zu picken führt erst über Umwege zum Ziel. Wer also den Rat gibt, ein Tutorial auch von Anfang an zu lesen, der meint es gut. RAMEND bei mega16 ist 0x045F weil der RAM-Bereich eben so groß ist. 0x045F ist für die Aufnahme in ein Register zu groß. Ich kenne das Tutorial nicht, aber ich könnte mir gut vorstellen, dass dort so etwas wie ldi r16,HIGH (RAMEND) out SPH,r16 ldi r16,LOW (RAMEND) out SPL,r16 steht. Würde mich wundern, wenn nicht...
>bekome jetzt aber immer folgenden Fehler: >D:\Programmierung\Assembler\IO >Grundlagen\LEDs\bitaccess\bitaccess.asm(25): error: Operand(s) out of >range in 'ldi r16,0x45f' Einfach mal lesen, was da steht: >error: Operand(s) out of range in 'ldi r16,0x45f' Zu Deutsch: Ein (oder mehrere) Operanden werden außerhalb ihrer Wertebereiche genutzt. ldi ist der Operator, kein Operand r16 ist ein Operand 0x45f ist ein Operand Was sagt uns das? Operand r16 und Operand 0x45f passen nicht zusammen. Warum? weil der Operand r16 nur Werte von 0x00 bis 0xFF aufnehmen kann. Leider hilft diese Fehlermeldung in diesem Falle nur mittelbar weiter, denn der eigentliche (Denk-) Fehler liegt wo ganz anders. Der ATmega16 hat ZWEI Register für den Stackpointer.
asm ist echt voll geschissen, aber c ist um nix besser, da es so großen code erzeugt, der wohl einzige vorteil in c ist, das man das leichter erlernen kann... ein ganze tutorial von anfang an durchzuarbeiten finde ich gähnend langweilig, besonders wenn es um etwas wie : was für hardware brauche ich, was ist ein µc und son scheiss geht.... ich habe mir den Einstieg in asm um einiges leichter vorgestellt.... will eigentlich nur ein dämliches blinken mit den LEDs sehen, damit ich endlich mal erfolge bei der Anwendung von asm erkenne... ich habe heute mittag einfach mal ein programm geschrieben, welches alle LEDs einscahltet, einmal in c und einmal in asm. Daraufhin habe ich mir angesehen, wieviel Speicher die jeweils übersetzten Programme auf dem µC benötigen.... Das Ergebnis hat mich ein für alle male von asm überzeugt. Aber asm wird vorerst nicht meine bevorzugte Sprache werden, ich denke asm bleibt erstmal noch eine Geheimsprache, an die ich mich noch rantasten werde. Das Tutorial hier auf der Seite für asm ist auch nix... kennt vll jemand ein richtig gut geeignetes ??
asm-Neuling wrote: > asm ist echt voll geschissen, aber c ist um nix besser, da es so großen > code erzeugt, der wohl einzige vorteil in c ist, das man das leichter > erlernen kann... > ein ganze tutorial von anfang an durchzuarbeiten finde ich gähnend > langweilig, besonders wenn es um etwas wie : was für hardware brauche > ich, was ist ein µc und son scheiss geht.... Dann solltest Du Dich vielleicht eher mit Kaninchenzucht befassen und nicht mit Mikrocontrollern. Man muss alles Schritt für Schritt lernen, und wenn man es einmal gelernt hat, dann kann es auch Spaß machen. > ich habe mir den Einstieg in asm um einiges leichter vorgestellt.... > will eigentlich nur ein dämliches blinken mit den LEDs sehen, damit ich > endlich mal erfolge bei der Anwendung von asm erkenne... > > ich habe heute mittag einfach mal ein programm geschrieben, welches alle > LEDs einscahltet, einmal in c und einmal in asm. > Daraufhin habe ich mir angesehen, wieviel Speicher die jeweils > übersetzten Programme auf dem µC benötigen.... C erzeugt zwar zunächst einen ordentlichen Overhead, der aber bei etwas größeren Programmen kaum noch ins Gewicht fällt. Bei einem "Einzeiler" bestehen natürlich 90% des Programms aus Overhead, da brauchste Dich nicht zu wundern... > Das Ergebnis hat mich ein für alle male von asm überzeugt. Aber asm wird > vorerst nicht meine bevorzugte Sprache werden, ich denke asm bleibt > erstmal noch eine Geheimsprache, an die ich mich noch rantasten werde. > Das Tutorial hier auf der Seite für asm ist auch nix... > kennt vll jemand ein richtig gut geeignetes ?? Das Tutorial auf dieser Seite geht nunmal alles Schritt für Schritt durch. Genau diese Vorgehensweise ist es, die Dir anscheinend fehlt. Man darf bei sowas nicht ungeduldig werden...
asm-Neuling wrote: > asm ist echt voll geschissen, aber c ist um nix besser, da es so großen > code erzeugt, der wohl einzige vorteil in c ist, das man das leichter > erlernen kann... > ein ganze tutorial von anfang an durchzuarbeiten finde ich gähnend > langweilig, besonders wenn es um etwas wie : was für hardware brauche > ich, was ist ein µc und son scheiss geht.... > > > ich habe mir den Einstieg in asm um einiges leichter vorgestellt.... > will eigentlich nur ein dämliches blinken mit den LEDs sehen, damit ich > endlich mal erfolge bei der Anwendung von asm erkenne... *wieder ein Strich bei den Mikrocontroller-Anfängern, die nach einem lächerlichen halben Tag aufgeben > ich habe heute mittag einfach mal ein programm geschrieben, welches alle > LEDs einscahltet, einmal in c und einmal in asm. > Daraufhin habe ich mir angesehen, wieviel Speicher die jeweils > übersetzten Programme auf dem µC benötigen.... > > Das Ergebnis hat mich ein für alle male von asm überzeugt. Und du meinst mit dieser "einfachen" Methode die Effizienz von C beurteilen zu können? Tut mir leid, aber wer aus solchen Tests so einfach solche Schlüsse zieht, sollte das alles besser sein lassen. Da stehen mir die Haare zu berge.. Nur als Tipp: C hat einen kleinen (STATISCHEN!) Overhead. Sprich: Falsch: Das Programm ist in C x-mal größer als in assembler Richtig: Das Programm ist in C um x byte größer, da noch einige Initialisierungsschleifen beim Programmstart durchlaufen werden, die auch Code benötigen. In diesem Sinne...
asm-Neuling wrote: > asm ist echt voll geschissen, Nööö... > aber c ist um nix besser, da es so großen > code erzeugt, der wohl einzige vorteil in c ist, das man das leichter > erlernen kann... Nööö, ASM ist leichter, ist eindeutiger. > ein ganze tutorial von anfang an durchzuarbeiten finde ich gähnend > langweilig, Dann bist Du ja ein gaaaaanz Schlauer. > besonders wenn es um etwas wie : was für hardware brauche > ich, was ist ein µc und son scheiss geht.... Auch diese Fragen werden hier oft gestellt, also ist es wichtig. > > > ich habe mir den Einstieg in asm um einiges leichter vorgestellt.... Das liegt aber nicht an ASM sondern an Dir. > will eigentlich nur ein dämliches blinken mit den LEDs sehen, damit ich > endlich mal erfolge bei der Anwendung von asm erkenne... > > ich habe heute mittag einfach mal ein programm geschrieben, welches alle > LEDs einscahltet, einmal in c und einmal in asm. > Daraufhin habe ich mir angesehen, wieviel Speicher die jeweils > übersetzten Programme auf dem µC benötigen.... > > Das Ergebnis hat mich ein für alle male von asm überzeugt. Aber asm wird > vorerst nicht meine bevorzugte Sprache werden, ich denke asm bleibt > erstmal noch eine Geheimsprache, An ASM ist nix geheim, es ist (in Form von Maschinencode) die einzige Sprache, die der AVR wirklich beherrscht. > an die ich mich noch rantasten werde. > Das Tutorial hier auf der Seite für asm ist auch nix... > kennt vll jemand ein richtig gut geeignetes ?? Schau in die Linkliste dieser Seite, da gibt es einen Link auf ein weiteres Tutorial in Deutsch. Oder nimm BASCOM und gehe zu http://www.bascom-forum.de Die warten schon auf Leute wie Dich. ...
Dazu fällt mir nur noch ein: "von Nichts kommt Nichts". Mit einer solchen Lernverweigerung wird es wohl auch mit C nichts werden. :-) Programmieren - egal ob ASM, C oder sonst was, geht nicht ohne den Willen zu Lesen und zu Lernen. Da kommt nur noch ein Hobby in Frage, bei dem der Griff in den Geldbeutel genügt. Oder etwas ohne intellektuellen Anspruch - wie wäre es mit Tischfussball?
Ja nicht streiten !! jetzt hier, ja ? Also Ihr hab natürlich recht, habe noch ein anderes Tutorial gefunden und habe die Lösung bereits selbst herausgefunden :) Also alle wieder beruhigen ! So habe einfach wie folgt den stackpointer initialisiert :D :D Habe dafür das Registerprchen R28/R29 benutzt.... ldi yh,high(RAMEND) ldi yl,low(RAMEND)
Nee Tischfussball finde ich genau wie normalen Fussball voll dumm, und wenn ich mir die grühlenden Idioten da im Stadium ansehe, dann weiß ich auch warum.... :) So jetzt sind wir wieder alle leib zu einander, Hannes hast Recht, asm ist eindeutiger, da es ja reine Maschinensprache ist.
asm-Neuling wrote: > Ja nicht streiten !! jetzt hier, ja ? > So jetzt sind wir wieder alle leib zu einander, Bist Du jetzt hier der neue Quizmaster??? Du provozierst mit Deinem geistigen Durchfall die Leute und ermahnst sie dann, sie mögen still sein... Du hast 'ne Vorstellung vom Leben... ...
wollte niemandem etwas böses, oder zu nahe treten.... das anfangs beim erlernen Fehler geschehen ist normal, so möchte ich daran erinnern, das ein lernprozess durch fehler machen am besten geschieht..
Na also... ;-) > ldi yh,high(RAMEND) > ldi yl,low(RAMEND) Da steht aber dahinter dann noch out SPH,yh out SPL,yl ja? Denn erst dadurch wird der Zeiger auf den Kellerspeicher vorbereitet. Blinkt die LED nun? Dann wäre als nächster Schritt m.E. weniger Interrupt-Sachen angesagt, sondern - so wie Du/Sie Dich/sich uns vorgestellt hast/haben als schnellen-Erfolg-Braucher - etwas interaktives. Da käme in Frage, die LED durch einen Taster ein- und aus- zuschalten. Das bliebe beim Thema I/O-Portbearbeitung. Noch ein nicht weniger gut gemeinter Rat: man kann durch seine Wortwahl Forumsleute für sich gewinnen oder auch einfach nur abstoßen.
>das anfangs beim erlernen Fehler geschehen ist normal, so möchte ich >daran erinnern, das ein lernprozess durch fehler machen am besten >geschieht.. Das kommt auf die Person an. Wirklich effizient ist diese Methode aber nicht. :-) Schneller zum Ziel kommt man allemal, wenn man auf "Fehler machen" verzichtet und für die Vordenkarbeit Anderer offen ist. Ich spreche aus Erfahrung, wenn ich verrate, dass die Analyse von veröffentlichten Problemlösungen mir mehr gebracht hat, als wahlloses Herumprobieren. An dieser Stelle der Tipp, dass der Hersteller des ATmega16 auf seiner Website eine Menge brauchbarer Programmbeispiele für jeweils ein kleines Problemchen bereit hält. Leider alles öder Lesestoff und dann noch in der falschen Sprache. :-)
Für "schnellen Erfolg" fällt mir noch Holzhacken ein, die Idee stammt aber nicht von mir, sondern glaube von Albert Einstein (für die jüngeren Zeitgenossen: das war der mit der Müller-Milch-Zunge). ...
@asm neuling, programmieren braucht vor allem Geduld. Es ist noch kein Meister vom Himmel gefallen. Man kann ein funktionsfähiges Programm nicht an 1 Tag erstellen, wenn man noch keine Ahnung hat. Die Entscheidung für ASM ist richtig. Und zwar deshalb, weil die eigentliche Schwierigkeit im Denken und Verfassen der Logik liegt. Die Befehle stehen in der Hilfe. Das Ansehen von anderen Programmen und dann von jedem Programm das Beste heraussuchen, hat mir am Besten geholfen. Es gibt nämlich für das gleiche Ergebnis verschiedene Möglichkeiten. Dazu muß man dann die Unterschiede in den Programmen erkennen können. Inzwischen müßte das Programm aber laufen. @ die anderen ob das wirklich so hilfreich ist, Unsinn zu schreiben, Holzhacken, Fußball, Bascom? zu C: wie groß ist denn der zusätzliche Code, den C benötigt? Und warum muß in C was initialisiert werden, was nicht gebraucht wird? In ASM muß ich doch auch Initialisierungen vornehmen. mfg
Wolfram Quehl wrote: > ob das wirklich so hilfreich ist, Unsinn zu schreiben, Holzhacken, > Fußball, Bascom? Leute, die sich einbilden, sie können mal schnell ohne jegliches Grundlagenwissen so nebenbei das ultimative Weltverbesserungsprogramm schreiben, die brauchen das. Solche Sprüche lasse ich nur ab, wenn ich sehe, dass Jemand mit fast null Wissen noch nicht die nötige Ehrfurcht vor dem Programmieren hat. Wer sich wirklich Mühe gibt und versucht, die Zusammenhänge zu verstehen, der bekommt Sowas von mir auch nicht zu hören/lesen, das müsstest Du, Wolfram, eigentlich aus eigener Erfahrung wissen. Daher weiß ich nicht so recht, was Du mit dieser Kritik ausdrücken willst. ...
ich wollte eigentlich ASM Anfänger mit unterstützen. Nur weil in dem o.a. Programm 2 Fehler drin sind, ist noch kein Grund, gleich abzustempeln. Ein Anfänger wird auch erst mal erkennen müssen, daß Programmieren nicht aus der Hand zu schütteln ist. Woher soll er das wissen. Geduld ist dabei eine besondere notwendige Charaktereigenschaft, ohne diese geht es nicht. Eigentlich könnte ich auch so eine Einstellung gewonnen haben. Bei meinem ersten Rechner, den ich programmiert habe (PC gabs noch nicht), hatte jede Taste eine Funktion. Diese wurden in einen Speicher geschrieben und dann RUN. Mein erstes Programm war das Zählen einer Variablen und nach jedem Zählen wurde der Zählstand ausgedruckt. Das war allerdings auch ein Floating Point Rechner mit interner Umwandlung in BCD. Aber solche Unterscheidungen brauchte ich dafür nicht zu wissen. Der Rechner konnte nichts anderes. Da war mein Programm auch schnell geschrieben. Erst später habe ich dann Kurse belegt, wie Logik des Programmierens, Fortran u.s.w. Vorher hatte ich mich noch mit TTL Logik ICs beschäftigt, wo man auch schon einiges an Logik lernen konnte, zumindest die Grundlagen. Deshalb habe ich auch Verständnis für solche Leute, die meine Erfahrungen noch nicht gemacht haben. Der AVR ist sehr viel komplexer als andere Bauteile. Hab auch mal einen Z80 mit Basic und Assembler programmiert. Basic war viel zu langsam. mfg
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.