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


von Dominik (Gast)


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

von Feadi (Gast)


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

von Dominik (Gast)


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

von Dominik (Gast)


Lesenswert?

Danke!

Jetzt weiß ich, dass das Schieberegister funktioniert.

Dominik

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.