1 | /*
|
2 | http://www.mikrocontroller.net/topic/237455
|
3 |
|
4 | ATtiny13 Problem mit Tonerzeugung
|
5 | Autor: Jörg T. (joto59)
|
6 | Datum: 05.11.2011 16:34
|
7 |
|
8 | Hallo Freunde,
|
9 |
|
10 | ich möchte für den Aufbau eines Variometers verschiedene Töne (300, 400,
|
11 | 600,800,1000,1200,1600Hz) mit dem ATtiny13 über das Register Compare
|
12 | OCR0B im Togglemodus erzeugen. Mit der Konfig in der Anlage habe ich
|
13 | bisher nach dem Einschalten der ersten Tonausgabe keinen Erfolg bei der
|
14 | Umschaltung auf eine andere Frequenz.
|
15 | Die erste Frequenz bleibt erhalten. da ich mit dem AVR Studio nicht über
|
16 | ein STK-Board verfüge, kann ich nicht richtig debuggen. Deshalb läuft
|
17 | parallel bei der Freqenzänderung zur Kontrolle eine LED auf PB2 mit.
|
18 | Diese wird immer bei der Tonänderung über eine zwischengelegte
|
19 | Zeitschleife (ca. 1Sek.) geschaltet. Die LED blinkt korrekt. In diesem
|
20 | ersten Versuchsaufbau läuft alles ohne Interrupts. Später soll über das
|
21 | zweite Register OCR0A alle 5 Millisekunden ein Interrupt für eine andere
|
22 | Routine ausgelöst werden.
|
23 | Zur Programmierung benutze ich einen selbstgebauten Parallelportadapter
|
24 | und PonyProg. Die Einstellungen der Fuse-Bits sind außer SUT0 und CSEL1
|
25 | alle deaktiviert. Der Takt liegt bei 4,8MHz/Vorteiler-64 .Die
|
26 | Programmierung erfolgt problemlos.
|
27 | An diesem Problem sitze ich nun schon einige Tage. Nun wende ich mich an
|
28 | euch in der Hoffnung, es kann mir einer meinen Fehler aufzeigen.
|
29 |
|
30 | Vielen Dank im Voraus.
|
31 | */
|
32 |
|
33 | .NOLIST
|
34 | .include "tn13def.inc"
|
35 | .LIST
|
36 |
|
37 | .org 0x0000
|
38 | rjmp main ; Reset
|
39 | reti ; Ext. Int.
|
40 | reti ; Pin Change Interrupt
|
41 | reti ; rjmp timer0_overflow Timer Counter Overflow
|
42 | reti ; EEPROM ready
|
43 | reti ; Analog Comp.
|
44 | reti ; Timer/Counter Compare Match A
|
45 | reti ; Timer/Counter Compare Match B
|
46 | reti ; Watchdog Timeout
|
47 | reti ; ADC Conversation Complete
|
48 |
|
49 | main:
|
50 | ; Stack initialisieren
|
51 | ldi r16, RAMEND
|
52 | out SPL, r16
|
53 |
|
54 | ; Ausgabepins einstellen
|
55 | ldi r16, (1<<PB2)|(1<<PB1)|(1<<PB0) ; PB0, PB1, PB2 = Ausgang
|
56 | out DDRB, r16
|
57 | sbi PORTB, PB2 ; PB2 auf HIGH für LED auf Zustand "AUS"
|
58 |
|
59 | ; Systemclock einstellen
|
60 | ldi r16, (1<<CLKPCE)
|
61 | out CLKPR, r16
|
62 | ldi r16, (1<<CLKPS0) ; Clock Prescaler 2: 9,6 MHz => 4,8MHz
|
63 | out CLKPR, r16
|
64 |
|
65 | ; Timer0 einstellen
|
66 | ldi r16, (1<<WGM01)|(1<<COM0A0) ; Toggle OC0A (PB0) on Compare Match (CTC Mode)
|
67 | out TCCR0A, r16
|
68 | ldi r16, (1<<CS01)|(1<<CS00) ; Takt 4,8MHz / Vorteiler 64
|
69 | out TCCR0B, r16
|
70 |
|
71 | loop:
|
72 | rcall set_310Hz
|
73 | rcall warten
|
74 | cbi PORTB, PB2 ; Blinken der LED an PB2 auf Low => LED ein
|
75 | rcall set_430Hz
|
76 | rcall warten
|
77 | sbi PORTB, PB2 ; Blinken der LED an PB2 auf HIGH => LED aus
|
78 | rjmp loop
|
79 |
|
80 | ; #############
|
81 |
|
82 | /*
|
83 | 4800000 / 64 = 75000
|
84 | 75000 / 2 (wg. Toggle) / 310 = 120.9
|
85 | 120.9 + 0.5 (erst Aufrunden, dann Ganzzahl machen) = 121
|
86 | 121 - 1 (wg. CTC) = 120 (0x78)
|
87 | */
|
88 | .equ TON_310 = ((4800000/64/2/310)+0.5)-1
|
89 | .equ TON_430 = ((4800000/64/2/430)+0.5)-1
|
90 |
|
91 | set_310Hz:
|
92 | clr r16
|
93 | out TCNT0, r16
|
94 | ldi r19, TON_310 ; OCR0A auf 77 => 310Hz an PB0
|
95 | out OCR0A, r19
|
96 | ret
|
97 |
|
98 | set_430Hz:
|
99 | clr r16
|
100 | out TCNT0, r16
|
101 | ldi r19, TON_430 ; OCR0A auf 4C => 430Hz an PB0
|
102 | out OCR0A, r19
|
103 | ret
|
104 |
|
105 | ; #############
|
106 |
|
107 | warten:
|
108 | clr r16 ;Zeitverzögerung ca.1 Sekunde
|
109 | zeit0:
|
110 | inc r16
|
111 | clr r17
|
112 | zeit1:
|
113 | inc r17
|
114 | clr r18
|
115 | zeit2:
|
116 | inc r18
|
117 | cpi r18, 0xff
|
118 | brne zeit2
|
119 | cpi r17, 0xff
|
120 | brne zeit1
|
121 | cpi r16, 0x10
|
122 | brne zeit0
|
123 | ret
|