moin moin
habe n kleines Prop. : Hardware : Xmega 128a3
so, ich wollt mit dem DAC einfach ein periodisches Signal ausgeben um
den timer overflow interrupt zu testen habe also n Oszi dran um die
genauigkeit anzugucken.
und es kommt nicht heraus was ich will ( ich will eine periodische
treppe 2v -> 1v -> 0)
irgendwie löst der Interrupt nicht aus oder ich behandel ihn falsch.
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <stdint.h>
|
4 | #include "function.h"
|
5 | #include "avr_compiler.h"
|
6 |
|
7 | // 2V = DEA = 3562
|
8 | // 1V = 6F5 = 1781 DACB.CH0DATA
|
9 | // 6000 U/min = per =5486 >> 0x156E
|
10 | // 3000 U/min = per =10958 >> 0x2ACE
|
11 | // 1000 U/min = per =32000 >> 0x7D00
|
12 | // 32MHz => takt 31,25 ns
|
13 | #define F_CPU 32000000UL
|
14 |
|
15 |
|
16 | uint16_t Zeit[3] = { 300, 400, 300};// absoluter zeitwert
|
17 |
|
18 | uint16_t startWert[3] = { 3562, 1781, 0 };// absolute Spannung
|
19 |
|
20 | int i, ii;
|
21 | //====================================================================
|
22 | int main( void )
|
23 | {
|
24 | int CountZeit[3];
|
25 |
|
26 | inter_init();
|
27 | Clock_init();
|
28 | DACB_Channel0_Enable(DAC_REFSEL_AVCC_gc);
|
29 | for (i=0;i<3;i++)
|
30 | {
|
31 | CountZeit[i]=(Zeit[i]*100/3125);
|
32 | }
|
33 |
|
34 | while(1)
|
35 | {
|
36 | ii = 0;
|
37 | i = 0;
|
38 | sei();
|
39 | do
|
40 | {
|
41 | TCC1.CNT=0;
|
42 | TCC1.PER=CountZeit[i];
|
43 | DACB.CH0DATA = startWert[i];
|
44 | while(ii==0)
|
45 | {
|
46 |
|
47 | }
|
48 | i++;
|
49 | }while(i<3);
|
50 | }
|
51 | }
|
52 | //----------------------------------------------------------------------
|
53 | void DACB_Channel0_Enable(DAC_REFSEL_t convRef)
|
54 | {
|
55 | DACB.CTRLB = ( DACB.CTRLB & ~DAC_CHSEL_gm ) | DAC_CHSEL_SINGLE_gc;
|
56 | DACB.CTRLC = ( DACB.CTRLC & ~DAC_REFSEL_gm) | convRef;
|
57 | DACB.CTRLA = ( DACB.CTRLA & ~DAC_CH1EN_bm ) | DAC_CH0EN_bm | DAC_ENABLE_bm;
|
58 | }
|
59 | //----------------------------------------------------------------------
|
60 | void inter_init(void)
|
61 | {
|
62 | PMIC.CTRL = PMIC_MEDLVLEN_bm;
|
63 | }
|
64 | void Clock_init(void)
|
65 | {
|
66 | OSC.CTRL |= OSC_RC32MEN_bm; // Oszillator auf 32Mhz stellen
|
67 | while(!(OSC.STATUS & OSC_RC32MEN_bm));// Warten bis Oszillator rdy
|
68 | CCP = CCP_IOREG_gc;
|
69 | CLK.CTRL = CLK_SCLKSEL_RC32M_gc; // Clock auf 32MHz stellen
|
70 | timer1_init();
|
71 | }
|
72 | void timer1_init(void)
|
73 | {
|
74 | TCC1.CTRLA = TC_CLKSEL_DIV1_gc;
|
75 | TCC1.CTRLB = TC_WGMODE_NORMAL_gc;
|
76 | //TCC1_CTRLC
|
77 | TCC1.INTCTRLA = TC_OVFINTLVL_MED_gc;
|
78 |
|
79 | }
|
80 | //----------------------------------------------------------------------
|
81 | isr(TCC1_OVF_vect)
|
82 | {
|
83 | ii =1;
|
84 | }
|
jemand ne idee bzw einen verbesserungs vorschlag ( bitte konstriktiv :D
)