servo pwm asm > überblick verloren

OP #1734432
Lesenswert?
• ▲
▼
Moinsen,
ich bin mal wieder am verzweifeln.  hab mir in den letzten tagen ein 
kleines programm erarbeitet, in dem ich mit dem timer0 ein servo 
ansteuere.
klappt soweit auch ganz gut nur reicht mir die auflösung nicht. deshalb 
habe ich versucht mit dem tut und dem datenblatt des mega16 eine pwm für 
meine servos zu schreiben. nur leider macht der nicht was er soll:
1
.include <m16def.inc>
2

3

4
.org 0x0000
5
  rjmp main
6

7
main:
8
  ldi r16, low(ramend)
9
  out spl, r16
10
  ldi r16, high(ramend)
11
  out sph, r16
12
  
13

14
  ;timer settings
15
    
16
  ldi r16, (1<<com1a0) | (1<<com1b0)| (1<<wgm11) 
17
  out tccr1a, r16
18

19
  ldi r16, (1<<wgm13)| (1<<wgm12) | (1<<cs12) 
20
  ;wgm 11,12 und 13 für mode 14 ctc cs10 für no prescaling
21
  out tccr1b, r16
22
    
23
  
24

25
  ldi r16, 0x18
26
  out icr1h, r16
27
  ldi r16, 0x6a
28
  out icr1l, r16  ;zähler für 20 ms bei 8mhz
29

30
  ldi r16, 0x01
31
  out ocr1ah, r16
32
  ldi r16, 0xd4
33
  out ocr1al, r16  ;zähler für 1,5ms
34

35
  
36
  ldi r16, 0xff
37
  out ddrd, r16  ;ausgänge definieren
38

39

40
loop:
41
  nop
42
  rjmp loop
die bits werden im simulator richtig gesetzt, nur zählt er nicht bis icr 
und setzt den zähler zurück, sondern zählt nur bis ocr1a und dann wieder 
rückwärts.


hab mir die ganze nacht um die ohren geschlagen , komme aber nicht auf 
den fehler....

lg martin
<rechtschreibfehler dürfen behalten werden>
#1736165
Lesenswert?
• ▲
▼
Martin G. schrieb:

> die bits werden im simulator richtig gesetzt, nur zählt er nicht bis icr
> und setzt den zähler zurück, sondern zählt nur bis ocr1a und dann wieder
> rückwärts.

Dann hast Du den Timer vermutlich im falschen Modus (Phase correct PWM 
anstatt fast PWM).

> <rechtschreibfehler dürfen behalten werden>

Das wird der Grund sein, warum Dir bisher keiner geantwortet hat, siehe 
Netiquette und "Wichtige Regeln" (z.B. Groß-Kleinschreibung).

MfG
Gast #1736279
Lesenswert?
• ▲
▼
Habe mal kurz drüber geschaut und in das
Datenblatt gesehen. Für die richtige
Initialisierung von Timer1 müsste die Zeile
1
ldi r16, (1<<com1a0) | (1<<com1b0)| (1<<wgm11)
durch
1
ldi r16, (1<<com1a1) | (1<<com1a0)| (1<<wgm11)
ersetzt werden.

Das würde für Timer1 dann FAST PWM, Mode 14,
Set OCnA/OCnB on Compare Match, clear OCnA/OcnB
at TOP etc. bedeuten ...

Außerdem siehe auch hier:
Beitrag "PWM mit ATtiny2313 an OCnx-Ausgang"


Ralf2008

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.