Forum: Mikrocontroller und Digitale Elektronik PWM / TIM1/ ASM


von Bitte ein Bit (Gast)


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!!!

von spess53 (Gast)


Lesenswert?

Hi

>main:
>    rcall dim
>    rcall wait

Und dann läuft dein Programm fröhlich in die Routine 'dim' und der 
Controller stürzt beim nächsten ret ab.

MfG Spess

von Bitte ein Bit (Gast)


Lesenswert?

Vielen Dank für die schnelle Antwort!

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?

Mfg

von spess53 (Gast)


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

von Bitte ein Bit (Gast)


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

von Michael S. (Firma: electro-tester) (michael0307)


Lesenswert?

Probier mal das hier!

1
main:
2
      rcall dim
3
      rcall wait
4
      rjmp main

Grüße...

von Bitte ein Bit (Gast)


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

von Bitte ein Bit (Gast)


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

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.