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