mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD Wandler an der SPI Schnittstelle


Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Da der Atmel AT89C51ED2 keinen AD Wandler hat, habe ich einen externen 8 
Bit AD Wandler auf mein Board gelötet. Ich möchte die Daten über die SPI 
Schnittstelle einlesen.

Folgendes Programm hab ich dazu geschrieben:

SPCON  = 0xFA;
unsigned int test;
while(1)
{
     test = 0x00;    // Variable auf 0 setzen
     P1_B0 = 0;      // AD Wandler über CS aktivieren
     SPDAT=0x00;     // Daten über die SPI schicken, damit eine Frequenz
                     // erzeugt wird
     while(SPIF == 1); // Warten bis Daten empfangen wurden
     test = SPDAT;   // Daten einlesen
     printf ("Wert: %x\n", test); // Daten über Com1 ausgeben
     P1_B0 = 1;      // AD Wandler deaktivieren
}

Jetzt zu meinem Problem: Leider list dieses Programm nur nach einem 
Reset den aktuellen Analogwert ein und gibt den dauerhaft über Com1 aus.
Das Programm soll den Analogwert dauerhaft einlesen und wenn ich ihn 
verändere auch sofort ausgeben.
Wo ist mein Fehler??? Ich hoffe ihr könnt mir Helfen.

Gruß
Tim

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht benötigt der Wandler etwas mehr Zeit zwischen CS high und CS 
low. Kannst ja mal ein paar NOPs ans Ende der Schleife hängen bzw. ins 
Datenblatt gucken... Den Typ des ADCs hältst Du ja leider bislang 
geheim...

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze den AD Wandler TLC 549, 8 Bit. Ich habe schon versucht die 
Pause größer zu machen. Leider ohne Erfolg. Wie groß sollte die sein?

Gruß
Tim

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
17 Microsekunden, solltest Du mindestens warten. Außerdem sollte man 
mind. 1.4 us warten, bevor man nach der fallenden CS-Flanke den SPI-Takt 
startet.

Guck' doch mal ins Datenblatt; wenn alle Stricke reißen, kannst Du das 
SPI auch sehr einfach selbst in Software machen und kannst das dann so 
langsam ablaufen lassen, dass Du es mit 'nem Multimeter verfolgen 
kannst...

Viel Erfolg

Johannes

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Johannes danke für die Tips.

Der Code Funktioniert jetzt einwandfrei:

     P1_B0 = 0;               // AD WANDLER aktivieren
     test = 0x00;             // Variable auf 0 setzen
     SPDAT=0xff;              // Clock für die SPI ausgeben
     while(SPSTA == 0x00);    // Warten bis Byte empfangen wurde
     P1_B0 = 1;               // AD WANDLER deaktivieren
     test = SPDAT;            // Wert aus dem SPI Daten Register holen
     CCAP1H = test;           // Wert als PPV an PWM Modul 2 ausgeben

Gibt es eine möglichkeit den MOSI Port nicht zubenutzen?
Dieser Port ist bei mir doppelt belegt und ich bräuchte ihn als PWM 
Ausgabe Port. Ist das möglich?

Gruß
Tim

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.