Ich blick es einfach nicht. Ich programmiere seit einigen Monaten AVRs. Ich verwende immer den Atmega 8. Mein erstes Projekt, nach den Einstiegstutorials in ASM war ein Controller für einen Schrittmotortreiber. Dieser wurde per SPI angesteuert. Hier im Forum wurde mir erklärt wie ich ein Software SPI in ASM dafür implementiere. Ein guter Link zu diversen Macros brachte mich zu einem funktionierenden Programm. Nun mache ich diverse andere Sachen mit SPI und beginne auch erste Sachen in C zu schreiben. Es widerstrebt mir immer ein Software SPI zu implementieren und ich muss nun ja auch nicht noch lernen wie es in C funktioniert. Es muss doch möglich sein, das SPI Interface des µC zu nutzen und ihn trotzdem über ISP zu programmieren. Kann ich einfach zwei Sachen an die entsprechenden Beinchen (MOSI und MISO und SCK) anschliessen? CSN kann man ja problemlos manuell machen. Muss ich gegebenenfalls zus. Bauteile verwenden? Bitte helft mir, ich werde sonst wahnsinnig. Muss einen recht komplexen Kommandointerpreter schreiben. Dafür will ich C verwenden. Inline Assembler scheint mir nicht die Lösung. Oder doch Software SPI in C lernen? Chris
> Es muss doch möglich sein, das SPI Interface des µC zu nutzen und ihn > trotzdem über ISP zu programmieren. Du hast verschiedene Möglichkeiten. Verwendung eines Bootloaders beispielsweise, denn das läuft auch unter ISP. Falls du trotzdem Hardware verwenden willst, musst du dafür sorgen, dass die angeschlossenen SPI-Slaves deaktiviert sind, wenn programmiert wird (/SS der Slaves auf High -> bei direkter Portanbindung während dem Reset sichergestellt durch die Resetbedingung der Ports -> hochohmiger Eingang mit Pull-Up). > Kann ich einfach zwei Sachen an die entsprechenden Beinchen (MOSI und > MISO und SCK) anschliessen? CSN kann man ja problemlos manuell machen. Siehe oben, wenn der /SS der Slaves deaktiviert ist, sollten die Ausgänge hochohmig sein. Im Normalfall bietet eine SPI-Schnittstelle eines Controllers eh nur einen Hardware-SlaveSelect, d.h. die anderen Select-Leitungen müssen in Software gesteuert werden. Falls du schon einen Schaltplan hast, zeig mal, dann kann man sich das besser vorstellen. Ralf
> Es muss doch möglich sein, das SPI Interface des µC zu nutzen und ihn
trotzdem über ISP zu programmieren.
Dafür ist das auch gedacht. Bei Atmel gibt es Application Notes mit
allen Hinweisen- evtl. steht's sogar im Datenblatt.
Hi >Kann ich einfach zwei Sachen an die entsprechenden Beinchen (MOSI und >MISO und SCK) anschliessen? CSN kann man ja problemlos manuell machen. http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf MfG Spess
spess53 schrieb:
> http://www.atmel.com/dyn/resources/prod_documents/...
Ja steht im Prinzip drin wie es geht. Danke dafür.
Wenn ich jetzt noch weiss welchen Wert der Widerstand in Reihe haben
soll? Es steht leider kein Wert im Datenblatt.
Einen Schaltplan habe ich noch nicht, ist zur Zeit alles auf einem
Steckbrett.
Werde versuchen nachher grob anzureissen wie ich es habe. Vielleicht
komme ich da aber auch erst heut Abend zu.
Danke vorab für die Hilfe, bin zuversichtlich dass es klappen wird.
Chris
AVR042: AVR Hardware Design Considerations http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf
Christoph Hoell schrieb: > Es widerstrebt mir immer ein Software SPI zu implementieren und ich muss > nun ja auch nicht noch lernen wie es in C funktioniert. Warum nicht? SPI ist so ziemlich das einfachste:
1 | #include <avr/io.h> |
2 | |
3 | struct bits { |
4 | uint8_t b0:1; |
5 | uint8_t b1:1; |
6 | uint8_t b2:1; |
7 | uint8_t b3:1; |
8 | uint8_t b4:1; |
9 | uint8_t b5:1; |
10 | uint8_t b6:1; |
11 | uint8_t b7:1; |
12 | } __attribute__((__packed__)); |
13 | |
14 | #define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)
|
15 | |
16 | |
17 | #define SPI_CLK SBIT( PORTB, 0 ) // clock
|
18 | #define SPI_CLK_DDR SBIT( DDRB, 0 )
|
19 | #define SPI_MOSI SBIT( PORTB, 1 ) // data out
|
20 | #define SPI_MOSI_DDR SBIT( DDRB, 1 )
|
21 | #define SPI_MISO_PIN SBIT( PINB, 2 ) // data in
|
22 | |
23 | |
24 | uint8_t shift_io( uint8_t b ) // send / receive byte |
25 | {
|
26 | SPI_CLK_DDR = 1; // set as output |
27 | SPI_MOSI_DDR = 1; |
28 | |
29 | for( uint8_t i = 8; i; i-- ){ // 8 bits |
30 | SPI_MOSI = 0; |
31 | if( b & 0x80 ) // high bit first |
32 | SPI_MOSI = 1; |
33 | b <<= 1; |
34 | SPI_CLK = 1; |
35 | if( SPI_MISO_PIN ) |
36 | b++; |
37 | SPI_CLK = 0; |
38 | }
|
39 | return b; |
40 | }
|
Peter
Werner B. schrieb: > AVR042: AVR Hardware Design Considerations > > http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf Sorry, ich meinte http://www.atmel.com/dyn/resources/prod_documents/doc0943.pdf Zitat von Seite 2: The value of the resistors should be chosen depending on the circuitry connected to the SPI bus. Also denk dir was aus.
Also, erst mal danke Peter. Das sieht wirklich nicht so schwer aus. Das werde ich auf jeden Fall testen. Aber um es endgültig zu klären hier mal schnelle Schaltbilder. Einmal ohne Anpassungen ISP und SPI direkt verkabelt. Dann mit einem Pullup von 10K an SS nach VCC (ist das richtig so?) Dann mit den 3 Reihenwiderständen an MOSI, MISO und SCK wie im Datenblatt. Habe mal 4K7 eingetragen, aber kann das, auch mit den Tips von Werner B, nicht wirklich begründen. Da fehlt mir das Wissen zu. Falls jemand Zeit wäre hier eine Erklärung der Zusammenhänge toll. Der anzusteuernde Chip ist ein Trinamic TMC 246 und auch der Slave. An diesen wirden 2 Byte gesendet damit sich der Motor dreht. Er antwortet mit 2 Byte als "Zustandsdaten". Unabhängig davon dass ich es über Software SPI testen werde, dank Peter, es kann ja auch mal sein dass ich einfach die 4 Pins die ich fürs Software SPI nutze dringend brauchen werde, daher die Frage: Welche Version, Pullup oder Reihe ist besser oder sinnvoller? Sind die versch. Versionen überhaupt korrekt?
Ich hab das mal aus dem Datenblatt des TMC246 rausgesucht. Zitat: SDO is tristated whenever ENN is inactive (high) or CSN is inactive (high). Der Pull-Up an SS reicht völlig aus.
Werner B. schrieb:
> Der Pull-Up an SS reicht völlig aus.
Danke. Ich denke dass ich es auch richtig verkabelt habe und auch der
Wert okay ist.
Werde das mal so versuchen in einem zweiten Testaufbau.
P.S. Die Lernkurve am Anfang ist ja wirklich extrem steil, aber Spass
machts.
...zu den Schaltplänen: sehe ich das richtig, dass Du Master-out (MOSI) mit Serial-Data-Out (SDO) des Slaves verbinden willst? Keine gute Idee!
wswbln schrieb: > ..zu den Schaltplänen: sehe ich das richtig, dass Du Master-out (MOSI) > mit Serial-Data-Out (SDO) des Slaves verbinden willst? Keine gute Idee! Ne, das ist ein Fehler im Plan. Ich tue mir immer schwer mit MISO und MOSI und habe es wieder mal verwechselt.... Dumm von mir. Es soll natürlich MOSI an SDI und MISO an SDO
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.