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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.