Forum: Mikrocontroller und Digitale Elektronik steigender und fallender wert


von Rene (Gast)


Lesenswert?

halllo an alle spezialisten.

ich weiß nicht so recht wie ich das machen soll

ich brauche einen ansteigenden wert von 0->255 wenn der maximalwert
erreicht ist soll das ganze wieder zurücklaufen also von 255->0
So eine Art halber sinus

gibts da irgendwo beispiele

von Karl H. (kbuchegg)


Lesenswert?

int i;
  while( 1 ) {
    for( i = 0; i < 256; ++i )
      /* mach was mit i */

    for( i = 254; i > 0; --i )
      /* mach was mit i */
  }

von Rene (Gast)


Lesenswert?

danke für dieb Schnelle Antwort

und wie geht das im assembler

Sorry hatte ich nicht gesagt

von Ludwig W. (lordludwig)


Lesenswert?

oder asm:

loop:

        'mache irgendwas
        '...
  cpi temp, 255    'zähler mit 255 vergleichen
  breq loop2    'wenn 255 dann anfangen mit runter zählen
  inc temp    'temp um 1 erhöhen
  rjmp loop    'zu loop springen

loop2:

        'mache irgendwas
        '...
  cpi temp, 0    'zähler mit 255 vergleichen
  breq loop    'wenn 255 dann anfangen mit rauf zählen
  dec temp    'temp um 1 verniedrigen
  rjmp loop2    'zu loop2 springen

von Karl H. (kbuchegg)


Lesenswert?

Im Prinzip genau so.

Du schnappst Dir ein Register und initialisierst
es mit 0.
Dann machst Du etwas mit dem Wert
und zaehlst ihn hoch. Ist 256 (aka 0, da wir ja 8 bit
Register haben) noch nicht erreicht springst Du zurueck
zu 'mach was mit dem Wert'.
Das war die erste Schleife, wie die zweite aussieht
muesstest Du eigentlich jetzt auch selbst hinkriegen.
Da kannst doch eine Zaehl-Schleife programmieren, oder?

von Ludwig W. (lordludwig)


Lesenswert?

ich war schneller ;-)

von Karl H. (kbuchegg)


Lesenswert?

Mist :-)

von Karl H. (kbuchegg)


Lesenswert?

Dein Code hat nur einen Fehler :-)

mit 255 und 0 machst Du 2 mal 'mach irgendwas

(Ich weiß, die Loesung ist trivial, aber Rene soll auch noch
was zu tun haben).

von Rene (Gast)


Lesenswert?

Danke euch;-)

nur noch ein Problem
ich habe nicht mehr viele Register Frei und habe schon alles
"verbraten"
und müsste alles im RAM zwischenspeichern mit STS und LDS gibts da auch
noch andere methoden. werte im RAM kan man ja nicht über den umweg eines
Registers verändern oder?

von Ludwig W. (lordludwig)


Lesenswert?

@Karl Heinz Buchegger: ne, ich spring wieder zu loop zurück:

breq loop    'wenn 255 dann anfangen mit rauf zählen

@Rene dann solltest du generell auf SRAM umsteigen. Es ist nie gut wenn
alle register benutzt sind

von Karl H. (kbuchegg)


Lesenswert?

> loop:
>
>        'mache irgendwas
>        '...
>  cpi temp, 255    'zähler mit 255 vergleichen
>  breq loop2    'wenn 255 dann anfangen mit runter zählen
>  inc temp    'temp um 1 erhöhen
>  rjmp loop    'zu loop springen
>
> loop2:
>
>        'mache irgendwas
>        '...
>  cpi temp, 0

fang mal oben an und nimm an dass temp den Wert 255 hat

  'mach irgendwas    ; hier machst Du das erste mal was mit 255

  cpi temp, 255      ; ist der Fall
  breq loop2         ; also wird der breq genommen

loop2:

  'mach irgendwas    ; und hier machst du schon wieder was mit 255

von Ludwig W. (lordludwig)


Lesenswert?

achso hast du das gemeint... hast recht.

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.