ADC wird nicht richtig ausgewertet (ATiny15)

Gast #727495
Lesenswert?

Hallo,

Ich habe zur Übung ein kleines Assembler-Programm für den Tiny15 
geschrieben. Letztlich soll über einen Poti das PWM-Signal eingestellt 
werden.
Den Code habe ich ganz unten angehängt.

Problem: Zunächst schein alles zu funktionieren, das PWM ändert sich mit 
der Potieinstellung. Allerdings bekomme ich vier mal einen "Überlauf", 
also das Signal hat DutyCycle 100% und danach 0% ?!
Das selbe würde (theoretisch) passieren, wenn der ADC im ADLAR=0 
eingestellt und ausgelesen wird, also die beiden höchsten Bytes nicht 
beachtet werden würden. Dies ist aber hier nicht der Fall!?

Gibt es noch weitere Einstellungen die ich nicht beachtet habe??

Danke für Eure Hilfe!


Timo
1
; PB1  Ausgang PWM
2
; PB4  Eingang ADC
3

4

5

6

7
.include "tn15def.inc"
8

9
.def WRegister    =  R16
10
.def LEDNr      =  R17
11
.def RDummy      =  R18
12
.def RHelligkeit0  =  R19
13
.def RHelligkeit1  =  R20
14
.def RHelligkeit2  =  R21
15

16
.org  $000
17

18
rcall Init
19
rjmp Main
20

21
    .org $003  ;Timer1 Compare Match
22
      nop  
23
    .org $004  ;Timer1 Overflow handler
24
      rjmp TIM1_OVF
25
    .org $005  ;Timer0 Overflow handler
26
      nop
27

28

29
.org $009
30

31
Init:
32

33
    ldi   WRegister,0x00|(1<<PB1)|(1<<PB2)|(1<<PB3)  ; PB1 als Ausgang
34
    out   DDRB,WRegister
35

36
  ;PWM einstellen
37

38
    ldi   WRegister,(0<<CS13)|(1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<PWM1)|(1<<COM1A1)|(1<<COM1A0)  ; invertierte PWM einsschalten -> Geschwindigkeit CK
39
    out   TCCR1,WRegister
40

41
    ldi   WRegister,(0<<OCIE1A)|(1<<TOIE1)|(0<<TOIE0) ;Interruptregister schalten
42
    out   TIMSK,WRegister
43

44

45

46
    ldi   WRegister,0xFF  ;Pulsweite einstellen; zähle bis hier her
47
    out   OCR1B,WRegister
48

49

50
    ldi   WRegister,0x80  ;Pulsweite einstellen
51
    out   OCR1A,WRegister
52

53
  ;ADC
54
    ldi    WRegister,(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX2)|(1<<MUX1)|(1<<MUX0) ;mit ADLAR links reicht das HB zur Steuerung aus
55
    out   ADMUX,WRegister
56
    
57
    ldi    WRegister,(1<<ADEN)|(1<<ADSC)|(1<<ADFR)
58
    out    ADCSR,WRegister
59

60
    sei
61

62
    ret            ;zurückspringen
63

64
Main:
65

66
    nop
67

68
    rjmp   Main
69

70

71
TIM1_OVF:
72
    in    RDummy,ADCH      ; von Poti lesen
73
    lsl    RDummy
74
    lsl    RDummy
75
    out   OCR1A,RDummy    ; und als PWM-Wert einstellen
76

77
    reti
#727624
Lesenswert?

Wenn Du mit gesetztem ADLAR nur das High-Byte einliest und das um 2 
Stellen nach links schiebst, dann ist doch klar, dass die beiden MSB 
links rausfallen. Und dann ist auch klar, dass über den Wertebereich 4 
Überläufe der 6 LSB auftreten. Ich weiß nicht, was Du mit dem 
Linksschieben bezwecken willst, aber so kann das nicht funktionieren.
Gast #727692
Lesenswert?

Ups!

Nein, das Linksschieben macht keinen Sinn. Da habe ich nur was probiert 
und vergessen es raus zu machen. Also bitte die beiden Schiebebefehle 
vergessen...

Noch was: Die angelegte Spannung liegt zw. 0..5 V.


Gruß

Timo

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren