Forum: Mikrocontroller und Digitale Elektronik AVR und Raspberry - SPI invertieren


von LedJW (Gast)


Lesenswert?

Hallo,

an einem Raspberry Pi habe ich einen Atmega8 angeschlossen und möchte 
diesen nun programmieren. Dabei bin ich zunächst dieser Anleitung 
gefolgt:
http://kevincuzner.com/2013/05/27/raspberry-pi-as-an-avr-programmer/

Nun habe ich leider als Pegelwandler zwischen RPi (3V3) und AVR (5V) 
einen einfachen Transistor verwendet:
GPIO --- [1 K] --- BC547 ---+--- [10 K] --- 5V
                     |      |
                    GND    AVR
bzw. umgekehrt für das MISO-Signal.

Dabei dachte ich mir, dass ich die Invertierung irgendwie per Software 
aufheben könnte, was ich nun seit gut einer Stunde versuche.
Kann mir jemand dabei behilflich sein?

von Oliver J. (skriptkiddy)


Lesenswert?

Wie wärs mit nem USBasp (wenige Euro bei ebay) und avrdude zum flashen? 
Das müsste out of the Box ohne irgendwelche Kopfstände funktionieren.

Grüße Oliver

von LedJW (Gast)


Lesenswert?

Die Verbindung vom Raspberry-SPI besteht zum AVR besteht sowieso zwecks 
Datenübertragung, darüber wollte ich den Controller nun auch 
programmieren.
Die ganze Hardware dafür ist schon fertig.

von Wolfgang (Gast)


Lesenswert?

LedJW schrieb:
> Nun habe ich leider als Pegelwandler zwischen RPi (3V3) und AVR (5V)
> einen einfachen Transistor verwendet:
> GPIO --- [1 K] --- BC547 ---+--- [10 K] --- 5V
>                      |      |
>                     GND    AVR
> bzw. umgekehrt für das MISO-Signal.

... und warum keinen einfachen FET? Dann hättest du das Problem mit der 
Invertierung nicht (Philips AN97055 Fig.2).

LedJW schrieb:
> Die ganze Hardware dafür ist schon fertig.

Na, dann fehlt nur noch die passenden Software. Datenbytes invertieren, 
bevor sie über SPI rausgeschickt werden, Datenbytes bei Empfang 
invertieren, SPI Mode ändern und Reset-Steuersignal invertieren, wäre 
die Alternative zu nichtinvertierenden Pegelwandlern.

von PittyJ (Gast)


Lesenswert?

Kann man da nicht noch einen zweiten Transistor benutzen? 2 * invertiert 
== normal? Das ist doch einfacher als die Software umzuschreiben.

von Joachim R. (bastelbaer)


Lesenswert?

Du kannst den Transistor auch ganz weglassen und nur mit Widerständen 
arbeiten. Den GPIO des Raspi kannst du direkt auf den Eingang des Atmels 
legen. Der erkennt 3,3V als High. Und umgekehrt das Signal vom Atmel zum 
Raspi kannst du mit einem Spannungsteiler aus zwei Widerständen mit 3,3k 
und 1,8k realisieren. Hab SD-Karten so an nen Atmel angeschlossen, ohne 
Probleme. Also so:
1
Atmel Out ---+
2
             |
3
            +-+
4
            | |
5
            | | 1k8
6
            +-+
7
             |
8
             o------ Raspi GPIO IN
9
             |
10
            +-+
11
            | |
12
            | | 3k3
13
            +-+
14
             |
15
             |
16
 GNG --------o------ GNG
Oder nimm, wenn du mit 8Mhz auskommst, den Mega8L. Der hat eine 
Spannungsversorgung von 2,7V - 5,5V.

von LedJW (Gast)


Lesenswert?

Vielen Dank für alle Antworten!

Wolfgang schrieb:
> Datenbytes invertieren, bevor sie über SPI rausgeschickt werden,
> Datenbytes bei Empfang invertieren, SPI Mode ändern und
> Reset-Steuersignal invertieren
Das habe ich gestern versucht, aber nicht fertig gebracht.

PittyJ schrieb:
> Kann man da nicht noch einen zweiten Transistor benutzen? 2 * invertiert
> == normal?
So werde ich es jetzt wohl machen.

Joachim R. schrieb:
> Du kannst den Transistor auch ganz weglassen und nur mit Widerständen
> arbeiten. [...]
Von der Lösung habe ich gehört, allerdings war ich mir nicht sicher, ob 
das auch wirklich zuverlässig ist. Gefährlicher für den Raspberry ist es 
bei falscher Verdrahtung in jedem Fall.

von Joachim R. (bastelbaer)


Lesenswert?

LedJW schrieb:

> Von der Lösung habe ich gehört, allerdings war ich mir nicht sicher, ob
> das auch wirklich zuverlässig ist. Gefährlicher für den Raspberry ist es
> bei falscher Verdrahtung in jedem Fall.

Bei falscher Verkabelung ist alles für den Raspi gefärlich, auch die 
Transistorlösung  :-).

von LedJW (Gast)


Lesenswert?

Nun habe ich jeweils einen zweiten Transistor spendiert, es funktioniert 
jetzt einwandfrei.

                  5V --- 3K3           5V --- 10K
                          |                    |
GPIO --- 10K --- BC547 ---+--- 1K --- BC547 ---+--- AVR
                   |                    |
                  GND                  GND

Bei MISO eben andersrum, mit 3V3 an den Pullups.
Die Widerstände sind natürlich so nicht optimal, aber die Hälfte der 
Schaltung stand ja schon.
Achtung beim Reset-Pin, der wird von avrdude (nach obiger Anleitung) nur 
zwischen GND und hochohmig umgeschaltet:

       10K --- 3V3
        |
GPIO ---+---- BC547 --- ...
Reset           |
               GND

Vielen Dank für alle Antworten!

von Joachim B. (jar)


Lesenswert?

Joachim R. schrieb:
> Bei falscher Verkabelung ist alles für den Raspi gefärlich, auch die
> Transistorlösung  :-).

besonders durch die Vielzahl der beteiligten Bauelemente kann sich eher 
ein Fehler einschleifen.

LedJW schrieb:
> Nun habe ich jeweils einen zweiten Transistor spendiert, es funktioniert
> jetzt einwandfrei.

schön,

leichter finde ich bei mehr als einer Leitung Pegelwandler wie den 
74HC4050 nichtinvertierend oder  74HC4049 invertierend, bis 16V rein und 
raus kommt maximal VCC
zum PI -> Signalrichtung eben VCC vom 74HC4050/49 auf 3,3V und in 
Gegenrichtung
zum AVR o.ä. -> Signalrichtung eben VCC vom 74HC4050/49 auf 5V

lohnt natürlich bei 1 bis 2 Leitungen nicht

bei TxD RxD habe ich nur einen 470 Ohm in die Leitung gelegt und am PI 
Port eine BAT42 zu 3,3V, sämtliche über 3,3V zum PI wird nach 3,3V über 
die Diode abgeleitet, der Strom durch den 470 Ohm begrenzt

: Bearbeitet durch User
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.