Gast
#674951
Hallo ich bemühe mich schon seid Stunden diesen AD Wandler zum laufen zu bringen doch bisher leider erfolglos. (Linear Technology) Datenblatt unter: http://www.linear.com/pc/downloadDocument.do?navId=H0,C1,C1155,C1001,C1152,P2287,D3179 Anschluss: PIN 1,2 auf 5 Volt PIN 3,5,7-10,14-16 auf 0 V (GND) PIN 12 auf MISO, Atmega PIN 13 auf SCK, Atmega PIN 11 auf PC1, Atmega Hier ist mein Programm, vielleicht könnt ihr mir helfen, vielen Dank. (Erklärung unten) // SPI, Atmega als Master // MOSI, SS und SCK Ausgang, alle anderen als Eingänge DDRB |= (1 << DDB3) | (1 << DDB5); // SPI Ausgänge aktivieren DDRB |= (1 << DDB2); // Slave Select Ausgang DDRC |= (1 << DDC1); // CS_nicht, ADC LTC2436 PORTC |= (1 << PC1); // CS_nicht ein // Enable SPI, Master, Vorteiler 32 SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1); SPSR = (1 << SPI2X); uint32_t SPI_lesen() { // LTC2436 SPCR &= ~(1 << CPOL); // Polarität der Taktleitung, damit SCK von Atmega //SPCR |= (1 << CPHA); PORTB |= (1 << PB2); // SPI aktivieren PORTC &= ~(1 << PC1); // CS_nicht aus, ADC starten unsigned char Daten1, Daten2, Daten3; SPDR = 0; while(!(SPSR & (1 << SPIF))) { ; // warten bis Daten übertragen } Daten3 = SPDR; SPDR = 0; while(!(SPSR & (1 << SPIF))) { ; // warten bis Daten übertragen } Daten2 = SPDR; SPDR = 0; while(!(SPSR & (1 << SPIF))) { ; // warten bis Daten übertragen } Daten1 = SPDR; PORTC |= (1 << PC1); // CS_nicht ein, ADC aus PORTB &= ~(1 << PB2); // SPI ausschalten uint32_t wert = (Daten3 << 11); wert |= (Daten2 << 3); wert |= (Daten1 >> 5); //SPCR &= ~(1 << CPHA); //SPCR |= (1 << CPOL); // Polarität der Taktleitung return wert; } Diese ADC hat nämlich ein 19 Bit Output-format ich hoffe das ich mich beim hin und her schieben der Bits nich geirrt habe. Weiters wird automatisch einmal Channel0 und beim nächsten ansprechen Channel1 ausgelesen, d.h. man muss immer 2 mal auslesen pro Zyklus. Folgendes verhalten hat mein Programm: Ich mache eine Abtastung über den Timer interrupt alle Sekunden. nun lege oich einen Spannungswert am Eingang des ADC an. Komischerweise sprigt der Wert jetzt alle Sekunden hin und her, einmal stimmt er, einmal ist er falsch (abwechselnd immer die beiden Werte). Überprüfen kann ich den Wert auf einem LCD bzw. einen DAC. Die letzten 16 Bit der Variable wert sollte dann der Integerwert sein. Vielen Dank im voraus Werner