Forum: Mikrocontroller und Digitale Elektronik AVR Assembler: Anfängerfrage


von Jörg (Gast)


Lesenswert?

Hallo,
ich habe eine wohl einfache Frage zu Assembler, da ich diese Sprache 
aber eigentlich nicht brauche und auch nicht lernen möchte, da ich den 
fertigen Code von einem Projekt übernehme, stelle ich sie kurz hier.

Folgender Codeausschnitt soll den Vorteiler eines ATmega PWMs bei 
bestimmten Einstellungen des Potis ändern.
1
Convert3:
2
  sts sCmp,R7 ; speichere im SRAM
3
  sts sCmp+1,R8
4
  mov ZL,rAdc0L ; kopiere ADC0 nach Z
5
  mov ZH,rAdc0H
6
  ldi XL,LOW(392)
7
  ldi XH,HIGH(392)
8
  ldi rmp,(1<<WGM13)|(1<<WGM12)|(1<<CS10)
9
  cp ZL,XL
10
  cpc ZH,XH
11
  brcc Convert4
12
  ldi rmp,(1<<WGM13)|(1<<WGM12)|(1<<CS11)
13
  ldi XL,LOW(225)
14
  ldi XH,HIGH(225)
15
  cp ZL,XL
16
  cpc ZH,XH
17
  brcc Convert4
18
  ldi rmp,(1<<WGM13)|(1<<WGM12)|(1<<CS10)|(1<<CS11)
19
  ldi XL,LOW(60)
20
  ldi XH,HIGH(60)
21
  cp ZL,XL
22
  cpc ZH,XH
23
  brcc Convert4
24
  ldi rmp,(1<<WGM13)|(1<<WGM12)|(1<<CS12)
25
  cpi ZL,3
26
  brcc Convert4
27
  ldi rmp,(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(1<<CS10)

Ich benötige aber konstant den Vorteiler "1", also der, der bei 392 
gesetzt wird. Die Vorteiler werden sonst ja offentlich bei 3, 60, 225 
und 392 geändert. Wie baue ich den Code nun um, dass nur der eine 
Vorteiler, unabhängig vom Potiwert, benutzt wird?

Mein Vorschlag wäre jetzt gewesen:
1
Convert3:
2
  sts sCmp,R7 ; speichere im SRAM
3
  sts sCmp+1,R8
4
  mov ZL,rAdc0L ; kopiere ADC0 nach Z
5
  mov ZH,rAdc0H
6
  brcc Convert4
7
  ldi rmp,(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(1<<CS10)

Macht das Sinn? Sorry wie gesagt, möchte nicht Assembler lernen da ich 
es nur für diese eine Sache brauche, vll. erbarmt sich ja jemand :)

von Karl H. (kbuchegg)


Lesenswert?

Jörg schrieb:

> möchte nicht Assembler lernen da ich
> es nur für diese eine Sache brauche

Das soll dich aber nicht daran hindern, ins Datenblatt zu schauen ...


> Mein Vorschlag wäre jetzt gewesen:
>
1
Convert3:
2
>   sts sCmp,R7 ; speichere im SRAM
3
>   sts sCmp+1,R8
4
>   mov ZL,rAdc0L ; kopiere ADC0 nach Z
5
>   mov ZH,rAdc0H
6
>   brcc Convert4
7
>   ldi rmp,(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(1<<CS10)
>
> Macht das Sinn?

... denn das ist kein Vorteiler von 1

Machs dir doch einfach:
In dem Code werden offenbar verschiedene Vorteiler gesetzt, je nach 
Bereich, in dem sich der ADC Wert abspielt.

Wenn nun in all den unterschiedlichen Fällen immer der gleiche Vorteiler 
gesetzt wird (die 'alte' Belegung als Kommentar dazuschreiben, wer weiß 
ob man die nicht noch einmal braucht) ... brauchst du den Code nicht 
weiter analysieren und hast trotzdem dein Ziel erreicht.

von Jörg (Gast)


Lesenswert?

Dankeschön. Werd mir den Vorteilerwert selbst raussuchen.

von Karl H. (kbuchegg)


Lesenswert?

Ob allerdings die Anzeige in deinem Generator dann noch den richtigen 
Wert anzeigt, ist eine ganz andere Geschichte :-)

von Jörg (Gast)


Lesenswert?

Mit ein wenig nachdenken glaube ich, dass der Vorteiler offenbar dieser 
sein muss:
  ldi rmp,(1<<WGM13)|(1<<WGM12)|(1<<CS10)

von Jörg (Gast)


Lesenswert?

Die Anzeige wird stimmen, da ich die Frequenztabelle angepasst habe. (es 
war fertiger Code mit Anleitung)

von Karl H. (kbuchegg)


Lesenswert?

Jörg schrieb:
> Mit ein wenig nachdenken glaube ich, dass der Vorteiler offenbar dieser
> sein muss:
>   ldi rmp,(1<<WGM13)|(1<<WGM12)|(1<<CS10)


Das sieht schon besser aus.
Du solltest aber trotzdem mit dem Datenblatt kontrollieren.

Schon alleine die Neugier, was eigentlich WGM13 + WGM12 bewirkt, sollte 
einem das Wert sein :-)

von Jörg (Gast)


Lesenswert?

Habe ich gerade. Wenn nur CS10 gesetzt ist, heißt das Vorteiler von 1. 
Wunderbar :)

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.