Forum: Mikrocontroller und Digitale Elektronik (AVR) SPI_Master mit (AVR) API_Slave wie geht's richtig?


von SPI_Slave (Gast)


Angehängte Dateien:

Lesenswert?

Im Bild seht Ihr meinen Aufbaut:
Atmega1281 ist Master, f_spi = f_osc/128, f_osc=16MHz
Atmega16A ist Slave, f_osc=12MHz

Toolchain: AVR Studio 4.19, JTAG ICE MKII

Problem:
sobald beide uCs per SPI verbunden werden (oder sobald per 
singlestepping der SPI auf dem Atmega16A initialisiert ist) ist der 
Slave-uC nicht mehr per JTAG ansprechbar.

Für den Slave sind 2 Interrupts registert:
1) SPI hat neues byte empfangen
2) positive Flanke auf INT2

Ziel:
der Atmega16A empfängt die SPI-Daten im Interrupt und speichert sie in 
einen Puffer.

von Glaskugel Verweigerer (Gast)


Lesenswert?

SPI_Slave schrieb:
> Im Bild seht Ihr meinen Aufbaut:

... und deine Sourcen brauchen wir auch noch ...

Es sei denn es soll hier ein Ratespiel werden.

von SPI_Slave (Gast)


Lesenswert?

Kann ich heute Abend nachreichen

von SPI_Slave (Gast)


Angehängte Dateien:

Lesenswert?

hier die FW der beiden uC ... reduziert auf den SPI Anteil

von SPI_Slave (Gast)


Lesenswert?

Ich bring den Thread nochmal hoch ...

Niemandem fällt was falsches auf?
- Verdrahtung?
- SPI mode
- Interrupt
- Lese-Sschreib - Reihenfolge?

Ich krieg's einfach nicht ans Laufen
(Clock, Daten, ChipSelect sieht auf dem Oszi erstmal unauffällig aus)

von Dussel (Gast)


Lesenswert?

JTAG sollte doch eigentlich unabhängig vom Programm laufen, oder?
Werden die JTAG-Pins für irgendwas anderes benutzt?
Wann tritt das auf? Wenn beide verbunden sind, wenn SPI initialisiert 
wird oder in beiden Fällen?

von SPI_Slave (Gast)


Lesenswert?

Ja.. Jtag sollte unabhängig sein... hatte schon einige Sitzationen bei 
AVRs, wo das so war.
Die Pins werden exklusiv genutzt, hängt sonst nichts dran.

Jtag am Slave hängt, sobald SPI mit interrupts initialisiert ist and 
Spi-Traffic kommt. Hat das die Frage beantwortet?

von Pandur S. (jetztnicht)


Lesenswert?

Nun ja. MOSI und MISO werden gekreuzt. Schau mal den internen Aufbau an. 
Schieberegister.

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

>Nun ja. MOSI und MISO werden gekreuzt. Schau mal den internen Aufbau an.
>Schieberegister.

Wo ist im Anhang (stammt vom ATMega16A des TO) etwas gekreuzt?

MfG Spess

von Oliver S. (oliverso)


Lesenswert?

Nirgends.

Was man aus den Bezeichnungen eigentlich auch ableiten kann:

M aster O ut S lave I n
M aster I n S lave O ut

Oliver

von Pandur S. (jetztnicht)


Lesenswert?

Tatsaechlich. Der Mega vertauscht die Pins intern je nach Mode, Slave 
oder Master. Besten Dank. Ich konnte bisher einen Slave mit einem 
controller nachzubilden vermeiden. Das ist mangels Buffer etwas vom 
Muehsamsten das es gibt.

: Bearbeitet durch User
von Shit Wind (Gast)


Lesenswert?

Zitronen F. schrieb:
> Wenn ich also einen Mega16 mit einem Mega16
> verbinde muss gekreutzt werden.

Mit so einer Scheisse wirst du kein einziges Byte übertragen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Zitronen F. schrieb:
> Bei einem Controller sind die Anschriften der Pins aber fest, so wie
> wenn er Master waere. Wenn ich also einen Mega16 mit einem Mega16
> verbinde muss gekreutzt werden. Sonst habe ich Input auf input und

 Das ist aber genial.
 Ob Master oder Slave wird mit MSTR in SPCR bestimmt.
 Und SCK wird vom Master generiert und vom Slave gesampelt.
 Es können weder 2 Master noch 2 Slaves miteinander kommunizieren.

von Shit Wind (Gast)


Lesenswert?

Marc V. schrieb:
> Es können weder 2 Master noch 2 Slaves miteinander kommunizieren.

Zitronen F. kann das aber trotzdem, denn er ist der
Chuck Norris der Mikrocontroller-Elektronik, und Chuck Norris
kann bekanntlich alles.

von SPI_Slave (Gast)


Lesenswert?

Habt Ihr Ideen, wie ich das ganze noch eingrenzen kann oder Stück für 
Stück den möglichen Fehlerraum verringern kann?

von Code Betrachta (Gast)


Lesenswert?

SPI_Slave schrieb:
> oder Stück für
> Stück den möglichen Fehlerraum verringern kann?

Mir ist aufgefallen dass du für ein Ereignis zwei Interrupts
installierst. Das müsste ja mit dem SPI Interrupt alleine
auch funktionieren.

Könnte sein dass die beiden ISRs sich gegenseitig stören?
Habe es nicht näher betrachtet.

Jedenfalls kannst du nicht einfach mit dem Master den Slave
mit Daten "vollballlern" in der Hoffung dass der Slave so
schnell ist dass er nicht überfahren wird.

von Dussel (Gast)


Lesenswert?

SPI_Slave schrieb:
> Jtag am Slave hängt, sobald SPI mit interrupts initialisiert ist and
> Spi-Traffic kommt.
Das heißt, wenn ein Master vorhanden ist.
Was passiert, wenn du den Master weglässt, also elektronisch entfernst?
Was passiert, wenn der Master elektrisch verbunden, aber der Slave nicht 
auf SPI initialisiert ist.

Ich versuche rauszufinden, ob es ein Softwareproblem ist, was ich mit 
meinem begrenzten Wissen bei JTAG ausschließen würde, oder ein 
elektrisches Problem, dass der Master aus irgendeinem Grund den Slave 
stört.

SPI_Slave schrieb:
> Habt Ihr Ideen, wie ich das ganze noch eingrenzen kann oder Stück für
> Stück den möglichen Fehlerraum verringern kann?
Ich würde der Reihe nach gehen.
1. Beide verbinden.
2. SPI im Slave initialisieren.
3. Daten vom Master senden und sehen.
4. Slave mit Interrupts initialisieren, ohne Daten zu senden.
5. Salve initialisieren und Daten senden.
Ab einem dieser Schritte sollte es Probleme geben (sonst wäre ja alles 
gut).

Außerdem nochmal, da es die Diskussion oben gab, sicherstellen, dass 
MOSI nicht mit MISO verbunden ist.

von SPI_Slave (Gast)


Angehängte Dateien:

Lesenswert?

Code Betrachta schrieb:
> Mir ist aufgefallen dass du für ein Ereignis zwei Interrupts
> installierst. Das müsste ja mit dem SPI Interrupt alleine
> auch funktionieren.

Ich nutze Int2, um die steigende Flanke des ChipSelect zu finden.
Sollte es einfacher gehen, sich mit AVRs im Slave-Mode auf den SPI-Frame 
zu synchronisieren, bin ich für Vorschläge offen :-)

> Könnte sein dass die beiden ISRs sich gegenseitig stören?
> Habe es nicht näher betrachtet.

Unwahrscheinlich, da sie auf unterschiedliche Events triggern, die auch 
zeitlich nicht zusammen auftreten sollten.

> Ich würde der Reihe nach gehen.
> 1. Beide verbinden.
> 2. SPI im Slave initialisieren.
> 3. Daten vom Master senden und sehen.
> 4. Slave mit Interrupts initialisieren, ohne Daten zu senden.
> 5. Salve initialisieren und Daten senden.

Es hakt schon bei 3.)
außerdem bekomme ich vom compiler diese Meldung (ist mir bislang nicht 
aufgefallen):
1
warning: 'SPI_STC_vect' appears to be a misspelled signal handler
Hab mir das auch mal im Dissassembly angeschaut (Bild im Anhang).
An diese Stelle springt er, sobald der code
1
sei();
 durchlaufen hat.
Deutet darauf hin, dass er seine Interrupt-Funktion nicht richtig auf 
die jump table der ISRs setzt.
Was mach ich da falsch?

von SPI_Slave (Gast)


Lesenswert?

also sobald der SPIE in SPCR gesetzt ist und die Interrupts mit sei() 
aktiv sind, rennt er in das Problem
(da der angeschlossene SPI Master continuierlich Frames sendet)

von SPI_Slave (Gast)


Lesenswert?

oh neee ...

ich hab des Rätsels Lösung - es ist so peinlich, dass ich es kaum zum 
besten geben möchte, aber Ihr habt alle reingeschaut und Zeit verbracht, 
da gehört es sich auch das ganz aufzulösen:
1
Atmega16A = worauf ich kompiliert und debuggt hab
2
Atmega16  = was wirklich als HW vorliegt

Dummerweise matchen aus die Signatures, sodass es mir dabei nicht 
aufgefallen ist.

Ich danke Euch für die Gedanken/Ideen!

von Dussel (Gast)


Lesenswert?

Da wundert mich, dass es in machen Fällen ging.
Aber sowas passiert halt manchmal.

von SPI_Slave (Gast)


Lesenswert?

ich hätte mal die MakeFile posten sollen ...

von spess53 (Gast)


Lesenswert?

Hi

>Atmega16A = worauf ich kompiliert und debuggt hab
>Atmega16  = was wirklich als HW vorliegt

Es gibt eine passende AppNote:

AVR522: Migrating from ATmega16 to ATmega16A

Da finde ich aber nichts drin, was deinen Fehler hervorrufen könnte.

MfG Spess

von SPI_Slave (Gast)


Lesenswert?

Der atmega16a hat den SPI interrupt auf Vector 14,
der atmega16 hat ihn auf 10

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

SPI_Slave schrieb:
> Der atmega16a hat den SPI interrupt auf Vector 14,
> der atmega16 hat ihn auf 10

 Sagt wer?
 Der SPI/STC Vektor befindet sich bei beiden auf Adresse 0x0014.
 Aber:
 ATmega16  = SPI_STC_vect.
 ATmega16A = SPISTC_vect.

 Deswegen die Warnung und der Jump nach RETI.

: Bearbeitet durch User
von SPI_Slave (Gast)


Lesenswert?

> Sagt wer?
Na ich ... war aber Quatsch, muss mich verguckt haben. In beiden 
Datenblättern steht "Program Address": $014
Danke für's Richtig-stellen.

> ATmega16  = SPI_STC_vect.
> ATmega16A = SPISTC_vect.

is aber gemein, dass es hier nicht auch so steht:
https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__avr__interrupts.html
und hier auch nicht:
https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

in beiden Links steht:
ATmega16  = SPI_STC_vect
ATmega16A = SPI_STC_vect

Wo hast Du Deine Info her?

von spess53 (Gast)


Lesenswert?

Hi

>Wo hast Du Deine Info her?

Ganz einfach: Datenblatt!

MfG Spess

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

SPI_Slave schrieb:
> Wo hast Du Deine Info her?

 Ich glaube das steht in iom16.h und iom16a.h dateien.
 Das habe ich schon vor langer Zeit geändert, aber mindestens seit 4-5
 Jahren keinen M16 oder M16A benutzt, deswegen bin ich mir auch nicht
 ganz sicher darüber.

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.