vario.asm


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