PWM / TIM1/ ASM

Gast #2210603
Lesenswert?

Hallo!!

Ich hätte folgendes Problem:

- Ganz einfach, mit dem Attiny45 mit dem Timer 1 (OC1B - PB4) im PWM 
Mode eine LED zu dimmen.

Ich habe schon alles mögliche da herum probiert, will es in Assembler, 
in C funktionierts. Ich dachte dann vl. liegts am AVR Studio 4 (Build 
700) aber AVR Studio 5 konnte des auch ned Lösen :D.

Zum Testen schnell geschriebener Code wo die LED bis zur Hälfte aufdimmt 
und wieder von neu beginnt.

Hier der Code:
1
; Interner RC Osci, 1MHz
2

3
.include "tn45def.inc"
4
;                                                         
5
;--------------------------------------                 
6
; PORT B Verdrahtung                                      
7
;--------------------------------------                    
8
;PORT B                                                
9
;PB0 - NC                            
10
;PB1 - NC                                  
11
;PB2 - NC
12
;PB3 - Taster (Active Low, wird nicht verwendet)
13
;PB4 - LED
14
;PB5 - 4k7 auf VCC /Reset (NC)
15

16
;--------------------------------------
17
; Definitionen
18
;--------------------------------------
19

20
.def  a    = r16
21
.def  b    = r17
22
.def  signalcount = r18
23
.def  compare = r19
24
sei
25

26
;--------------------------------------
27
; Macros
28
;--------------------------------------
29
;.MACRO
30
;.ENDMACRO
31
;----------------------------------
32
;Shutdown procedures
33
;----------------------------------
34
;----------------------------------
35
;Interrupt Vectors
36
;----------------------------------
37

38
        ;rjmp RESET ; Reset Handler
39
        ;rjmp EXT_INT0 ; IRQ0 Handler
40
        ;rjmp PCINT3 ; PCINT0 Handler
41
        ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
42
        ;rjmp TIM1_OVF ; Timer1 Overflow Handler
43
        ;rjmp TIM0_OVF ; Timer0 Overflow Handler
44
        ;rjmp EE_RDY ; EEPROM Ready Handler
45
        ;rjmp ANA_COMP ; Analog Comparator Handler
46
        ;rjmp ADC ; ADC Conversion Handler
47
        ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
48
        ;rjmp TIM0_COMPA ;
49
        ;rjmp TIM0_COMPB ;
50
        ;rjmp WDT ;
51
        ;rjmp USI_START ;
52
        ;rjmp USI_OVF ;
53

54
;----------------------------------
55
;ISR'S
56
;----------------------------------
57

58
;EXT_INT0:   reti
59
;PCINT0:     reti      
60
;TIM1_COMPA: reti
61
;TIM1_OVF:   reti
62
;TIM0_OVF:   reti
63
;EE_RDY:     reti
64
;ANA_COMP:   reti
65
;ADC:        reti
66
;TIM1_COMPB: reti
67
;TIM0_COMPA: reti
68
;TIM0_COMPB: reti
69
;WDT:        reti
70
;USI_START:  reti
71
;USI_OVF:    reti
72

73
;----------------------------------
74
;Initializations
75
;----------------------------------
76

77
ldi a, high(RAMEND)     ;Stack init, HIGH-Byte zuerst
78
out SPH, a
79
ldi a, low(RAMEND)
80
out SPL, a
81

82

83
clr a
84
ldi a, (1<<CS13) | (1<<CS10)  ; Vorteiler für den Timer 1 /256 (eig. egal in dem Fall)
85
out TCCR1, a
86

87
clr a
88
ldi a, (1<<PWM1B) | (1<<COM1B0) | (1<<COM1B1) | (1<<FOC1B) ; Modulator B, SET @ compare match, Force Output (ohne Effekt)
89
out GTCCR, a
90

91
clr a
92
ldi a, (1<<PB4) ; Port B Pin 3 als Ausgang (LED - Grün)
93
out DDRB, a
94

95
clr a
96
ldi a, (1<<PB3)  ; Pull-UP Widerstand einschalten
97
out PORTB, a
98

99
;clr a
100
;ldi a, (0<<PRTIM0)|(1<<PRTIM1)|(1<<PRUSI) ; Power reduction -/ Timer 1, USI Comm
101
;out PRR, a
102

103
sbi ACSR,ACD ; Analog Comparator DISABLED
104

105
clr a
106
ldi b,0xFF              ;Startwert für OCR1B
107
ldi signalcount, 0x04   ; 4 Wiederholungen
108
ldi compare, 0x80       ;128 reinladen
109
;*************************************************************************
110
;*                                            *
111
;*      Procedure Main Program Subroutine     *
112
;*                                            *
113
;*                                            *
114
;*************************************************************************
115
main:
116
    rcall dim
117
    rcall wait
118
    ;rcall led
119

120

121

122
dim:
123
    ldi signalcount, 0x04
124
    inc a
125
    out OCR1B, a
126
    cp a, compare
127
    breq clear
128
wait: 
129
    dec b
130
    breq count
131
    rjmp wait
132

133

134
count:
135
    dec signalcount
136
    breq dim
137
    rjmp wait
138

139
clear:
140
    clr a
141
    out OCR1B, a
142
    ret

-Mir ist beim Debugger aufgefallen, dass die Timer Flags alle gesetzt 
sind, also Output Compare, Overflow.. und er setzt sie alleine nicht 
zurück?

-Die LED geht ab Start sofort los auf max. Helligkeit und ändert sich 
nicht.

Anscheinend übersehe ich die ganze Zeit etwas. Könnt mir da wer helfen??
Danke!!!
Gast #2210643
Lesenswert?

Hi

>Aber was muss ich dann für einen Befehl verwenden, wenn ich
>zurückspringen will? rjmp würde sich der PC ja nicht merken oder?

Na was soll denn dein Controller nach rcall wait machen?

Vielleicht hilft ein rjmp main danach.

MfG Spess
Gast #2210666
Lesenswert?

Danke ja, hat gefehlt, geht aber leider noch immer nicht...
habs jetzt auf das hier geändert:
1
main:
2
    rcall dim
3
    rcall wait
4
    ;rjmp main
5

6

7

8
dim:
9
    ldi signalcount, 0x04
10
    inc a
11
    out OCR1B, a
12
    cp a, compare
13
    breq clear
14
wait: 
15
    dec b
16
    breq count
17
    rjmp wait
18

19

20
count:
21
    dec signalcount
22
    breq dim
23
    rjmp wait
24

25
clear:
26
    clr a
27
    out OCR1B, a
28
    rjmp main
Gast #2210721
Lesenswert?

nja, das macht genau das gleiche ;) - geht leider auch nicht
ich habs im Simulator probiert, da geht eig. alles bis auf die 
Timerflags...

OCF1A, OCF1B und TOV1 sind die ganze zeit über gesetzt.. warum?

mfg
Gast #2210784
Lesenswert?

Öhhmmm hab das Problem gelöst...
Peinlich peinlich... die Frequenz war zu niedrig bzw. der Vorteiler zu 
groß, und NUR "COM1B0" also TOGGLE output line.. dann funzts...

Hier der funktionierende Code für jedermann:
1
ldi a, high(RAMEND)     ;Stack init, HIGH-Byte zuerst
2
out SPH, a
3
ldi a, low(RAMEND)
4
out SPL, a
5

6

7
clr a
8
ldi a, (0<<CS13) | (1<<CS10)  ; Set OCR0A @ OCR0A value
9
out TCCR1, a
10

11
clr a
12
ldi a, (1<<PWM1B) | (1<<COM1B0) | (0<<COM1B1) ; Phase correct PWM, clk/1024 = ~980 Hz
13
out GTCCR, a
14

15
clr a
16
ldi a, (1<<PB4) ; Port B Pin 3 als Ausgang (PLED - Amber)
17
out DDRB, a
18

19
clr a
20
ldi a, (1<<PB3)  ; Pull-UP Widerstand einschalten
21
out PORTB, a
22

23
;clr a
24
;ldi a, (0<<PRTIM0)|(1<<PRTIM1)|(1<<PRUSI) ; Power reduction -/ Timer 1, USI Comm
25
;out PRR, a
26

27
sbi ACSR,ACD ; Analog Comparator DISABLED
28

29
clr a
30
ldi b,0xFF
31
ldi signalcount, 0x16
32
ldi compare, 0x80       ;128 reinladen
33
;*************************************************************************
34
;*                   *
35
;*      Procedure Main Program Subroutine     *
36
;*     Measurement of Accumulator Voltage       *
37
;*                   *
38
;*************************************************************************
39
main:
40
    rcall dim
41
    rcall wait
42
    rjmp main
43

44

45

46
dim:
47
    ldi signalcount, 0x16
48
  in a,OCR1B
49
  inc a
50
    cp a, compare
51
    breq clear
52
  out OCR1B, a
53
wait: 
54
    dec b
55
    breq count
56
    rjmp wait
57

58

59
count:
60
    dec signalcount
61
    breq dim
62
    rjmp wait
63

64
clear:
65
    clr a
66
    out OCR1B, a
67
  ret

Vielen Dank für die Hilfe !!!
MFG

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