1 |
|
2 |
|
3 |
|
4 | #define F_CPU 16000000UL // 16 MHz
|
5 | #define __AT90CAN128__
|
6 |
|
7 | #include <avr/io.h>
|
8 | #include <avr/delay.h>
|
9 |
|
10 | #define setbit(ADR,BIT) (ADR|=(1<<BIT))
|
11 | #define clearbit(ADR,BIT) (ADR&=~(1<<BIT))
|
12 |
|
13 | int spi_init()
|
14 | {
|
15 | // SPI_EIN MASTER Speed = fck/128
|
16 | SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0) | (1<<SPR1);
|
17 | }//spi_init
|
18 |
|
19 | void mcu_init()
|
20 | {
|
21 |
|
22 | // CS_Analog_IN MOSI An_out_LDAC An_out_Sync An_Out_CLR
|
23 | DDRB = 1<<PB0 | 1<<PB1 | 1<<PB2 | 1<<PB5 | 1<<PB6 | 1<<PB7; //Ausgänge setzen
|
24 | PORTB = 1<<PB0 | 1<<PB6; //Chip-Select Analog Out und Analog IN auf high setzen
|
25 |
|
26 | DDRF = 0xff; //Leistungsausgänge Digital definieren
|
27 | PORTF = 0x00; //Ausgangszustand auf 0 setzen
|
28 |
|
29 | DDRA = 0x00; //DIGITAL-Eingänge definieren
|
30 | PORTA = 0x00; //Ohne Pull-Ups
|
31 | }//mcu_init
|
32 |
|
33 | void analog_out_ausgabe(uint8_t channel, uint16_t uebergabe_daten)
|
34 | {
|
35 | channel &= 0x0F;
|
36 | uint8_t parameter = 0b00000011; //Write to and update DAC-Channel n
|
37 | uint32_t daten = parameter<<24 | channel<<20 | uebergabe_daten<<4; //Daten bilden für Übermittlung an AD5668
|
38 | //daten = 0b0000 0011 0000 1111111111111111 0000;
|
39 | clearbit(PORTB,PB6); //Chip-Select Analog out auf low ziehen
|
40 | SPDR = daten>>24;
|
41 | while (!(SPSR & (1<<SPIF)));
|
42 | SPDR = daten>>16;
|
43 | while (!(SPSR & (1<<SPIF)));
|
44 | SPDR = daten>>8;
|
45 | while (!(SPSR & (1<<SPIF)));
|
46 | SPDR = daten;
|
47 | while (!(SPSR & (1<<SPIF)));
|
48 | setbit(PORTB,PB6);
|
49 | }//analog_out_ausgabe
|
50 |
|
51 | /*uint16_t get_ADC_Channel(uint8_t channel)
|
52 | {
|
53 | setbit(SPCR,CPHA);
|
54 | uint8_t anfrage = 0;
|
55 | uint8_t MSB = 0;
|
56 | uint8_t LSB = 0;
|
57 | uint8_t letzte_bit = 0;
|
58 | uint16_t messergebnis = 0;
|
59 | channel = (channel & 0x01)<<2 | (channel & 0x06)>>1; // Kanaldekodierung laut Datenblatt ändern
|
60 | anfrage = 0x87 | channel<<4;
|
61 |
|
62 | clearbit(PORTB,PB0);
|
63 | SPDR = anfrage;
|
64 | while (!(SPSR & (1<<SPIF)));
|
65 | //while (!(PINB & (1<<PB4)));
|
66 | SPDR = 0xFF;
|
67 | while (!(SPSR & (1<<SPIF)));
|
68 | MSB = SPDR;
|
69 | SPDR = 0xFF;
|
70 | while (!(SPSR & (1<<SPIF)));
|
71 | LSB = SPDR;
|
72 | SPDR = 0xFF;
|
73 | while (!(SPSR & (1<<SPIF)));
|
74 | letzte_bit = SPDR;
|
75 | messergebnis = (MSB<<9) + (LSB<<1);
|
76 | messergebnis |= letzte_bit;
|
77 | setbit(PORTB,PB0);
|
78 | clearbit(SPCR,CPHA);
|
79 | return messergebnis;
|
80 | }//get_ADC_Channel
|
81 | */
|
82 |
|
83 |
|
84 | int main(void)
|
85 | {
|
86 |
|
87 | mcu_init();
|
88 | spi_init();
|
89 | uint8_t channel_auswahl = 0x00; //KANAL1_ausgewählt
|
90 | while(1)
|
91 | {
|
92 |
|
93 | for (uint16_t i = 0; i<65535; i++)
|
94 | {
|
95 | analog_out_ausgabe(channel_auswahl, i);
|
96 | _delay_ms(1);
|
97 |
|
98 | }
|
99 |
|
100 |
|
101 |
|
102 |
|
103 |
|
104 |
|
105 | }//while
|
106 | }//main
|