mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI mega8 <-> ADS7841 keine kommunikation


Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, schon viel gesucht und probiert nur leider kein erfolg.

folgendes problem. ich mächte mit meinem mega8 einen ads7841 ansprechen 
(4channel adc) nur leider bekomme ich keine antwort vom chip. habe mitn 
oszi das spi signal vom mega8 gemessen, schaut so aus: 
http://666kb.com/i/bcy36etzawuk1l6i7.bmp (oben clk, unten mosi), das 
einzige was mich stört, dass MOSI immer auf high bleibt, sollt laut 
datasheet seite11 
http://pdf1.alldatasheet.com/datasheet-pdf/view/56... 
von low kommen. und so ein zumpfi high nach den ersten 8 takten. habe 
mit CPHA versucht, dann ist es immer low aber verschoben und nicht sowie 
im datasheet angegeben. beschalten ist der ads7841 laut datenblatt seite 
9.

vcc & gnd an mega8 und ads7841 ~5V, beide verbunden und spannungen an 
beiden vorhanden

mega8 takt = 8mhz


MEGA8 -> ADS7841
MOSI -> SDI
MISO -> SDO
SCK -> CK
SS -> CS

vielleicht hat wer einen tipp! ist mein erster versuch mit spi ;-)
hier noch der code, an dem ich schon unzählige veränderungen versucht 
habe.
bin dankbar für jeden tipp!
#include <stdlib.h>
#include <avr/io.h>
#include "lcd.h"
#include <avr/signal.h> 

#define DDR_SPI DDRB
#define DD_SCK PB5
#define DD_MISO PB4
#define DD_MOSI PB3
#define DD_SS PB2

#define akku1 0b10010100        //10010111


uint8_t sek=0;            //sek werden mit 0 initialisiert
uint8_t hilfs=0;          //hilfswert mit dem das lcd aktualisiert wird
uint16_t spannung1=0;
int i=0;

void timerconfig();          //prototyp: der timer0 wird konfiguriert s.u.
uint16_t readADC(uint8_t channel);  //Prototyp: adc wird konfiguriert und ausgelsen
void SPI_MasterInit(void);
void SPI_MasterTransmit(char);
uint16_t SPI_MasterRecive(void);

int main(void)            //hauptprogramm
{

  timerconfig();          //timer config aufruf für lcd aktualisierung 
    lcd_init(LCD_DISP_ON);      // initialize display, cursor off
  SPI_MasterInit();
  //sei ();
      
    for (;;) {             //endlosschleife

    
    

      lcd_gotoxy(0,0);      //zu anfangskoordinaten des lcd springen
    if(sek!=hilfs)  {     
    hilfs=sek;  
    lcd_clrscr();        //lcd wird gelöscht
    
    lcd_gotoxy(0,0);      
         char text[77];        //wird für die übergabe für sprintf benötigt
    sprintf(text,"SPI Test %d",spannung1);   //ausgabe adc0 und akt.intervall via sprintf
    lcd_puts(text);        //text aus sprintf wird auf dem lcd ausgegeben
    }
    
    PORTB |= (1<<DD_SS);
    PORTB &= ~(1<<DD_SS);
    
  //  PORTB &= ~(1<<DD_SCK);
  //  SPI_MasterTransmit(0b0);
    SPI_MasterTransmit(akku1);
    
  
    
    //SPI_MasterTransmit(0x00);  //dummy transmit für conversion
  
    spannung1= SPI_MasterRecive();
    //SPDR=0;
  //  PORTB &= ~(1<<DD_SCK);
    
  //  PORTB = (1<<DD_SS);
    //PORTB &= ~(1<<DD_MOSI);

    PORTB |= (1<<DD_SS);
    //PORTB &= ~(1<<DD_SS);

    PORTB &= ~(1<<PB3);
    
    //}
  }
}                   //main ende



void SPI_MasterInit(void){
  DDR_SPI=(1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);//MOSI & SCK = output alles andere eingang
  SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);//enable spi, master, clk/16
  PORTB |=(1<<DD_SS);
}

void SPI_MasterTransmit(char cData){
  SPDR=cData;
  while(!(SPSR&(1<<SPIF)));
  PORTB &= ~(1<<DD_MOSI);
}

uint16_t SPI_MasterRecive(void){    //empfangsroutine
  SPDR=0;
  //PORTB &= ~(1<<DD_MOSI);
  while(!(SPSR & (1<<SPIF)));    //warten bis alle daten übertragen sind
  return SPDR;
  //SPDR=0;
}

void timerconfig()  {        //  timer config für 85µsek
  TIMSK |= (1<<TOIE0);      //Timer 0 Timer/Counter0 Overflow Interrupt Enable
  TCCR0 |= (1<<CS00) | (1<<CS02);  //1024Teiler  
     sei ();              //
}


ISR(TIMER0_OVF_vect)  {  
    sek++;            //"pseudo"sek (85µsek) wird erhöht
}

Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat keiner einen tipp?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lowtzow,

bitte zeig mal den Schaltplan!

Gruß
Stefam

Autor: Tobias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lowtzow,

hast Du die Kommunikation hinbekommen? Ich habe aktuell auch mit einem 
ADS7841 zu tun. Da funktionierte die Kommunikation auch nicht. Die 
Lösung dauerte lang und war relativ einfach: Ich hatte bei eagle das 
ADS7841-Symbol aus der bur-brown.lib genommen. Dort sind (siehe Bild) 
die Pins 15 und 16 vertauscht: So muss das CS-Signal auf Pin 15 und das 
CLK-Signal auf Pin 16 liegen.

Leitungen getauscht und ... tata ... es funktioniert.

Gruß,
Tobias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.