Gast
#978016
Liebe Forenleser und uC-Anwender Habe eine Frage betreffend Digitalem Potentiometer von Analog Device (AD8400) und ATMEGA 128. Der ATMEGA128 läuft mit einem clock von 16Mhz und ist auf einem Display 3000 2.1" montiert. (Link Display 3000: http://www.display3000.com/) Das Problem sieht wie folgt aus: Der Digitale Potentiometer von Analog Device (AD8400) erwartet eine 10bit-Nachricht um den Poti einzustellen. (Link zu AD8400: http://www.analog.com/en/digital-to-analog-converters/digital-potentiometers/ad8400/products/product.html) Die ersten 2bits definieren die Adresse des RDAC-Speicher und da es nur einen einzigen gibt also folgendermassen A1=A0=0. Alle nächsten 8bits (von der 10bit Nachricht) sind die Einstellungswerte von 0-255. Programmiert wird der AD8400 über SPI, zu finden auf dem ATMEL 128 bei den Pins CLK (PB1), SS (PB0) und MOSI (PB2). Da aber der SPI nur eine 8bit-Nachricht (SPSR) ausgeben kann, habe ich die Nachricht in 2x8bit aufgeteilt. In der ersten 8bit-Nachricht sind lauter NULLEN und in der 2ten-8bit-Nachricht der einzustellende Wert. Leider übernimmt mir der Digitale Potentiometer die Einstellungen nicht und ich weiss nicht wieso. Hat jemand von euch eine Idee oder einen anderen Lösungsvorschlag? ------------------code--------------------- #include <avr/io.h> #include <avr/wdt.h> #include <util/delay.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <stdlib.h> /**************************/ // Variablen /**************************/ unsigned char poti_init = 0; // unsigned char poti_adress = 0b00;//0 in 8Bit //unsigned char poti_data = 0b11001100;//127 in 8Bit //unsigned char poti_adress = 0;//0 in 8Bit unsigned char poti_data = 25; //127 in 8Bit void SPI_MasterInit(void) { /*Set SS(PB0), SCK(PB1) and MOSI(PB2) output, all others input */ DDRB = (1<<DDB0) | (1<<DDB1) | (1<<DDB2); /*Enable SPI, Data Order, Master Select, set clock rate fck/16 */ SPCR = (1<<SPE) | (1<<DORD) | (1<<MSTR); } void SPI_MasterTransmitDelete(unsigned char poti_init) { //PORTB |= (1<<PB0); // CS (oder SS hier bei ATMEG128) auf High setzen PORTB &= ~ (1<<PB0); // CS (oder SS hier bei ATMEG128) auf Low setzen /*---------------------*/ /*Start 1. transmission*/ SPDR = poti_init; /*Wait for 1. transmission complete*/ while (!(SPSR & (1<<SPIF))) { ; } /*1. transmission finished*/ //PORTB |= (1<<PB0); // CS (oder SS hier bei ATMEG128) auf High setzen //PORTB &= ~ (1<<PB0); // CS (oder SS hier bei ATMEG128) auf Low setzen /*---------------------*/ /*Start 2. transmission*/ SPDR = poti_init; /*Wait for 2. transmission complete*/ while (!(SPSR & (1<<SPIF))) { ; } /*2. transmission finished*/ /*---------------------*/ /*Start 3. transmission*/ SPDR = poti_init; /*Wait for 3. transmission complete*/ while (!(SPSR & (1<<SPIF))) { ; } /*3. transmission finished*/ /*---------------------*/ PORTB |= (1<<PB0); // CS (oder SS hier bei ATMEG128) auf High setzen //PORTB &= ~ (1<<PB0); // CS (oder SS hier bei ATMEG128) auf Low setzen } void SPI_MasterTransmit(unsigned char poti_adress, unsigned char poti_data) { //PORTB |= (1<<PB0); // CS (oder SS hier bei ATMEG128) auf High setzen PORTB &= ~ (1<<PB0); // CS (oder SS hier bei ATMEG128) auf Low setzen /*Start transmission*/ //SPDR = poti_adress; /*Wait for transmission complete*/ /*while (!(SPSR & (1<<SPIF))) { ; }*/ //PORTB |= (1<<PB0); // CS (oder SS hier bei ATMEG128) auf High setzen //PORTB &= ~ (1<<PB0); // CS (oder SS hier bei ATMEG128) auf Low setzen SPDR = poti_data; while (!(SPSR & (1<<SPIF))) { ; } PORTB |= (1<<PB0); // CS (oder SS hier bei ATMEG128) auf High setzen //PORTB &= ~ (1<<PB0); // CS (oder SS hier bei ATMEG128) auf Low setzen } int main(void) { SPI_MasterInit(); //SPI_MasterTransmitDelete(poti_init); //_delay_ms(1); //sei(); SPI_MasterTransmitDelete(poti_init); _delay_ms(2000); SPI_MasterTransmit(poti_adress, poti_data); /*while(1){ _delay_ms(10); }*/ return 0; } ------------------code---------------------