mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR At8- SPI an Shiftregister


Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich versuche mein Schieberegister CMOS 4006 (18 Bit, 2x 4 Bit + 2x 4/5
Bit) zu testen, indem ich es als Zwischenstufe zwischen MOSI und MISO
beim SPI-Interface meines Atmega8 einsetze.

Verdrahtung:
MOSI vom µC an D1 vom CMOS, D1+4 (CMOS) an D2 (CMOS), D2+4 an MISO, Sck
(µC) an Clock (CMOS).

Betriebsspannung per Regler, 5V. Beide ICs versorgt, und 100nF
Kondensatoren möglichst dicht zwischen den Anschlüssen
(Stromversorgung). Beim Atmega auch GND und AVcc vom Wandler
angeschlossen, aber Wandler unbenutzt.

Serielle Programmierung über den Schaltkreis aus dem Tutorial hier, per
Stecker vom Atmega während des Betriebs getrennt (obwohl der Schaltkreis
noch nie das SPI-Interface gestört hat).

Der Atmega funktioniert, ich habe bereits per SPI den AD-Wandler TLC549
angesprochen und seine Werte per UART ausgegeben. Der µC läuft mit 8 Mhz
(Quarz + 2x 22pF).

Bedauerlicherweise habe ich kein Oszilloskop, sondern nur ein
Multimeter. Da es zu langsam ist, kann ich gerade mal sagen, dass auf
MOSI und Sck etwas passiert nach dem Einschalten (Frequenzzähler zeigt
ca. 3,85khz, Spannung (Gleichstrom) ca. 90mV oder so). Auf D1+4 usw.
erscheint jedoch nur die Betriebsspannung (5V Gleichstrom gemessen,
0khz). Ich weiß, dass das nicht viel aussagt ohne ein ordentliches
Oszilloskop.

Hier mein C-Code:

int main (void) {
  unsigned char temp;

  Init();

  temp = 0xFF;

  while (1) {
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //fosc/8, SPI Enable, Master,
1Mhz
    SPSR = (1<<SPI2X);
    SPSR &= ~(1<<SPIF); //2 Takte

    SPDR = temp;

    //loop_until_bit_is_set(SPSR,SPIF);

  asm
volatile("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t" 
"nop\n\t"::);
//8 Takte
  asm
volatile("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t" 
"nop\n\t"::);

  asm
volatile("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t" 
"nop\n\t"::);
  asm
volatile("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t" 
"nop\n\t"::);
  asm
volatile("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t" 
"nop\n\t"::);
  asm
volatile("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t" 
"nop\n\t"::);
  asm
volatile("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t" 
"nop\n\t"::);
  asm
volatile("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t" 
"nop\n\t"::);

    temp = SPDR;

    UART_Transmit(temp);
    temp--;
  }
}

void Init (void) {
...
  //SPI-Interface für die AD-Wandler
  DDR_SPI1 |= (1<<MOSI)|(1<<SCK);

  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //fosc/8, SPI Enable, Master,
1Mhz
  SPSR = (1<<SPI2X);
...
}

main.h
#define F_CPU 8000000

#include <avr/io.h>
#include <avr/delay.h>
#include <stdlib.h>

#define UART_BAUD_RATE 38400
#define BAUD F_CPU / (UART_BAUD_RATE * 16L) - 1

#define DDR_SPI1 DDRB

#define MOSI DDB3
#define MISO DDB4
#define SCK DDB5
...
int main (void);
void Init (void);

void UART_Init (unsigned int baud);
static _inline_ void UART_Transmit (unsigned char data);


Grüße Dominik

Autor: Feadi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du das Schieberegister nur testen möchtest, nimm lieber eine LED
für DataOut, ein entprellten Taster für Clock, und ein Schalter für
DataIn.

Dann kannst Du jeden einzelnen Schritt genauer betrachten, auch mit
einem Multimeter.

Feadi

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Vielen Dank für deine Antwort. Ich werde mir dann in den nächsten Tagen
LED, Taster und Schalter besorgen. Erstmal morgen früh die Übungsklausur
zu Höhere Mathematik urgs.

Dominik

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Jetzt weiß ich, dass das Schieberegister funktioniert.

Dominik

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.