Forum: Mikrocontroller und Digitale Elektronik sleep oder NOP in asm


von asm-Neuling (Gast)


Lesenswert?

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 :)

von asm-Neuling (Gast)


Lesenswert?

ähh Sleep sollte vor
rcall all_off
natürlich :)

von Johannes M. (johnny-m)


Lesenswert?

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.

von asm-Neuling (Gast)


Lesenswert?

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 :)

von Thomas K. (dlt)


Lesenswert?

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

von asm-Neuling (Gast)


Lesenswert?

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

//----------------------------------------------------------------------

von Denis (Gast)


Lesenswert?

temp1 etc. sind variablen, die muss du vorher definieren,
schau mal ins tutotial

von asm-Neuling (Gast)


Lesenswert?

finde ich nicht, da steht weder wie man variablen deklariert, noch sonst 
was...

von Jörg X. (Gast)


Lesenswert?

> 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

von asm-Neuling (Gast)


Lesenswert?

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

//----------------------------------------------------------------------

von canbastler (Gast)


Lesenswert?

> warum tut es denn dieses Programm hier nicht ??

weil Du bei "All_On" und "All_Off" "FF" auf die Ports gibst....

von Hannes L. (hannes)


Lesenswert?

Du benutzt RCALL/RET ohne den Stackpointer initialisiert zu haben. Das 
gibt Stacksalat.

...

von asm-Neuling (Gast)


Lesenswert?

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,

von Peter D. (peda)


Lesenswert?

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

von asm-Neuling (Gast)


Lesenswert?

ldi temp, RAMEND  ; Stackpointer initialisieren

da habe ich was gefunden....

ist das alles was ich zur initialisierung benötige ??

von Johannes M. (johnny-m)


Lesenswert?

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.

von asm-Neuling (Gast)


Lesenswert?

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'

von Hannes L. (hannes)


Lesenswert?

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.

...

von Gast (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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...

von Gast (Gast)


Lesenswert?

>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.

von asm-Neuling (Gast)


Lesenswert?

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 ??

von Johannes M. (johnny-m)


Lesenswert?

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...

von Simon K. (simon) Benutzerseite


Lesenswert?

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...

von Hannes L. (hannes)


Lesenswert?

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.

...

von Gast (Gast)


Lesenswert?

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?

von asm-Neuling (Gast)


Lesenswert?

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)

von asm-Neuling (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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...

...

von asm-Neuling (Gast)


Lesenswert?

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..

von Gast (Gast)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

>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. :-)

von asm-Neuling (Gast)


Lesenswert?

Ach Ihr seid und bleibt einfach die besten :)

Nix böse sein, danke ! :)

von Hannes L. (hannes)


Lesenswert?

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).

...

von asm-Neuling (Gast)


Lesenswert?

Holz hacken ?
I hacked Localhost (127.0.0.1) :)

von SechsSechsDoppelFünfDrei... (Gast)


Lesenswert?

ASM-Neuling, wo ist denn das andere AVR-Tutorial wovon du soviel 
faselst?

von Hannes L. (hannes)


Lesenswert?


von Wolfram Q. (quehl)


Lesenswert?

@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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Wolfram Q. (quehl)


Lesenswert?

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
Noch kein Account? Hier anmelden.