Forum: Mikrocontroller und Digitale Elektronik ADC wird nicht richtig ausgewertet (ATiny15)


von Timo (Gast)


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

von Johannes M. (johnny-m)


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.

von Timo (Gast)


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

von Johannes M. (johnny-m)


Lesenswert?

Timo wrote:
> Noch was: Die angelegte Spannung liegt zw. 0..5 V.
Du hast aber die interne Referenz von 2,56 V ausgewählt. Das schreit 
schon mal nach Problemen.

von Timo (Gast)


Lesenswert?

ok, das seh ich ein.
Dann müsste doch aber bei ca. 0x200 der ADC in Clampbetrieb gehen? Aber 
selbst wenn nicht, dann würde sich damit nur ein Überlauf erklären!?

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.