Forum: Mikrocontroller und Digitale Elektronik SPI deaktivieren, ISP trotzdem nutzen


von breenick (Gast)


Lesenswert?

Servus!

Ganz einfache Frage:
Programmiere einen ATmega8 über ISP, will aber die MISO  MOSI  SCK
Pins von PortB auch als I/O-Pins nutzen. Wenn ich nun das SPE Bit (SPI
Enable) im SPI Control Register Null setze und damit das SPI
deaktiviere, kann ich dann den Controller trotzdem weiter per ISP
beschreiben oder sperre ich mich damit aus? Reicht es, das SPI Enable
Bit zu löschen, um die Pins als normale I/O-Pins nutzen zu können?

Vielen Dank für eure Hilfe!

von Florian (Gast)


Lesenswert?

Du kannst sie normal nutzen, ohne irgendetwas zu deaktivieren.

Gruß Florian

von The Daz (Gast)


Lesenswert?

Vorrausgesetzt, die ISP Nutzung kollidiert nicht mit den externen
Komponenten.

von Hannes L. (hannes)


Lesenswert?

Während des ISP ist Reset aktiv. Daher interessiert sich der Controller
während dieser Zeit nicht um sein Programm oder um die I/O-Register,
die das Programm beeinflussen würde, wenn es laufen würde (es kann
während aktivem Reset aber nicht laufen).

Probleme kann es aber geben, wenn deine externe I/O-Beschaltung die
ISP-Signale zu stark dämpft oder wenn die ISP-Signale (statt des
Controllers per Programm) irgend etwas schalten, was Schaden anrichten
könnte.
So würde ich keine H-Brücke an die ISP-Leitungen anschließen, die bei
gleichzeitiger Ansteuerung beider Leitungen einen Kurzschluss
verursacht.

Also immer drauf achten:

- Was passiert mit der Peripherie, wenn da unkontrollierte Impulse
  auftreten?
- Kann die Peripherie die ISP-Impulse in ihrer Qualität
  beeinträchtigen?

Wenn z.B. an den ISP-Leitungen Taster gegen GND angeschlossen sind und
diese während des Programmierens nicht betätigt werden, so passiert
nix.

...

von Henry Brennig (Gast)


Lesenswert?

Ich würde die Pins die das ISP nutzt gern als High-Active-Inputs
benutzen und zu dem Zweck ein paar Taster gegen Vcc dranhängen. Hab mir
ne kleine Schaltung ausgedacht, die während des ISP-Programmiervorgangs
die Taster deaktivieren soll:



                                          MOSI
                                           o   ATMega8
                                           |     __
                                      T    |  -o|  |o-
                                     ---   |  -o|  |o-
                   VCC o-----   -----o o---o---o|  |o-
                             v /              -o|  |o-
                             ---              -o|  |o-
                              |               -o|  |o-
                              |               -o|  |o-
                             .-.              -o|  |o-
                             | |              -o|  |o-
                             | |              -o|  |o-
                             '-'              -o|  |o-
                              |               -o|  |o-
                              |               -o|  |o-      /RESET
                              |               -o|_o|o----o----o
                              |                          |
                               \|     _                |
                                |----|___|---------------'
                               <|
                              |
                              |
                              |
                              |
                             ===
                             GND
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)

Meint ihr das könnte so passen? Die R's müssen natürlich noch so
berechnet werden, dass möglichst kleine Ströme fließen, der Taster aber
trotzdem möglichst volle 5V "sieht".

von The Daz (Gast)


Lesenswert?

ISP ist nur aktiv, wenn der RESET Eingang auf low gezogen wird. Das
heisst, lass einfach die Pfoten von den Tastern waehrend du ISP benutzt
und du brauchst keine weiteren Bauelemente.

von Bri (Gast)


Lesenswert?

Äh, hast du vor während des Programmierens an den Tastern rumzuspielen?
Ansonsten ist die Abschaltung per Reset doch nutzlos, oder?

von Bri (Gast)


Lesenswert?

Du solltest außerdem den Pin des AVR am Taster mit 100k gegen Masse
ziehen, damit bei nicht gedrücktem Taster ein definiertes Potential
anliegt.

von The Daz (Gast)


Lesenswert?

Am einfachsten waehre es, im code den internen pull-up zu aktivieren und
den Eingang per Taste auf GND zu ziehen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Öhm, das ganze ist doch kein Problem. Hat hannes doch schon gesagt. Die
Schaltung oben ist imo Mist. Wofür? Unsinn!

von Henry Brennig (Gast)


Lesenswert?

Reine Vorsichtsmaßnahme. Ich mach gern alles wasserdicht... noch dazu
wenn außer mir auch andere Leute das Gerät bedienen sollen.
Ich hab ja auch nicht nach dem Sinn der Schaltung gefragt, sondern ob
das was ich vor habe so funktionieren würde. Wozu ist doch erstmal
schnuppe.

Danke für den Hinweis mit dem Pull-Down-Widerstand! Hätte ich glatt
vergessen.

Mit den internen Pull-Ups hochziehen und dann per Taster auf Masse hab
ich mir auch schon gedacht, aber denke dass ist keine so gute Idee,
denn damit wären die ISP-Pins auch alle HIGH wenn ich den
Programmier-Adapter aufstecke. Und falls dann vom Rechner ein Pin auf
Masse gezogen wird (bevor ich per Pony-Prog irgendwas sende) macht sich
das wohl stromtechnisch nicht so gut wenn kein Widerstand in der Leitung
ist.

von Henry Brennig (Gast)


Lesenswert?

Ach eh ich's vergesse: trotzdem vielen Dank für die Antworten!

von Hannes L. (hannes)


Lesenswert?

<Zitat>
Mit den internen Pull-Ups hochziehen und dann per Taster auf Masse hab
ich mir auch schon gedacht, aber denke dass ist keine so gute Idee,
denn damit wären die ISP-Pins auch alle HIGH wenn ich den
Programmier-Adapter aufstecke.
</zitat>

Das ist Quatsch...
Denn die internen Pull-Ups werden vom Programm erst aktiviert.
Das Programm kann aber während aktivem Reset nicht laufen.
Und ISP kann nur bei aktivem Reset erfolgen.
Solange Reset aktiv ist, sind alle I/O-Ports hochohmig.

Selbst MISO, also die Daten-Leitung vom Controller zum PC, wird erst
aktiv, nachdem der Programmer "sich eingeloggt" hat, also den AVR in
den Programmiermodus versetzt hat.

Ich empfehle dir dringendst, das (vollständige!!!) Datenblatt deines
AVRs zu lesen.

...

von Bri (Gast)


Lesenswert?

Falls du immer noch wissen willst, ob deine Trennung der MISO-Leitung
funktioniert, dann kannst du sie z.B. hiermit simulieren:

http://www.linear.com/company/software.jsp

Einfacher wär es, wenn du es weglässt und ein Schild ranmachst wo drauf
steht, dass du jeden eins auf die Pfoten gibst, der während des
Programmierens an den Tasten rumspielt. ;-)

von Dirk (Gast)


Lesenswert?

Hi,

falls externe Hardware am SPI Bus haengt und diese beim programmieren
aktiviert werden koennen kann man ein 4053/4052 dazwischen schalten.

Der Reset vom Programmer geht dabei auf A,B,C und schaltet somit den
Signalweg nur beim Programmieren um.

Gruß,
Dirk

von Henry Brennig (Gast)


Lesenswert?

@Hannes:
<zitat>
Denn die internen Pull-Ups werden vom Programm erst aktiviert.
Das Programm kann aber während aktivem Reset nicht laufen.
Und ISP kann nur bei aktivem Reset erfolgen.
Solange Reset aktiv ist, sind alle I/O-Ports hochohmig.
</zitat>

Korrekt! So tief hab ich dann das (vollständige) Datenblatt des AVRs
auch schon ne Weile durch.
Aber wie ich oben schon schrieb stecke ich den Programmier-Stecker
(logischerweise) erst auf, bevor ich programmiere. Der Controller wird
nicht allein durch die Anwesenheit des Steckers auf RESET gesetzt,
allerdings ist er sehr wohl dadurch schon elektrisch mit dem PC
verbunden und der bekommt dadurch die Spannung zu sehen, die gerade an
den Pins anliegt. Erst wenn ich in PonyProg den Schreibvorgang starte
wird der Controller auf RESET gesetzt, bis dahin ist er aber schon ne
ganze Weile mit dem PC verbunden. Außerdem will ich auch nicht jedes
Mal den Stecker abziehen, wenn ich ein neues Programm auf dem
Controller teste.

von A. D. (ad1)


Lesenswert?

Ein "richtiger" ISP-Programmer hat solange hochohmige Ausgänge, bis er
selbst den RESET auslöst und dann mit dem Programmieren beginnt.

von Henry Brennig (Gast)


Lesenswert?

Ich habe aber leider nur das Geld für die Low-Budget-Lösung
"Parellelkabel mit 2 Widerständen"... ;)

von Hannes L. (hannes)


Lesenswert?

Nunja, ein ISP-Adapter sollte schon hochohmig sein, wenn er außerhalb
des Programmierbetriebes ist. Wenn du die direkte Lösung bevorzugst,
dann musst du eben den Stecker abziehen. Alternativ kannst du deinen
ISP-Adapter ja mit einem (mindestens) 4-poligen Schalter nachrüsten und
dadurch hochohmig machen. Dann kann es aber auch gleich ein Bustreiber
sein, der vom PC gesteuert wird, also die Schaltung mit dem 244er. Man
muss sich eben entscheiden, ob man es billig oder komfortabel möchte.
Billig und komfortabel zusammen geht nur selten.

Mein ISP-Adapter schaltet zusätzlich zu den Ports auch noch die
Betriebsspannung das AVRs, so kann ich bei ausgeschaltetem Zielsystem
programmieren. Natürlich muss das Zielsystem dafür ausgelegt sein
(Schutzdiode am 7805 usw.). Ich benutze diese Eigenentwicklung
immernoch sehr gerne, obwohl ich inzwischen auch ein STK500 habe. Sie
unterstützt allerdings nicht alle neuen AVRs.

...

von Henry Brennig (Gast)


Lesenswert?

Aber warum dann nich einfach meine Schaltung verwenden? Was ist dagegen
einzuwänden?

von Hannes L. (hannes)


Lesenswert?

Weil deine Schaltung das Problem nicht löst.

Deine Schaltung trennt den Taster von Vcc.
Nunja, Taster an Vcc macht man nur, wenn es dafür einen triftigen Grund
gibt. Taster gehören nunmal an GND, schon wegen der internen PullUps.

Aber nehmen wir mal an, die Taster wären gegen GND greschaltet und du
würdest während des Resets den Tastenstromkreis unterbrechen. Was
bringt dir das?

Denn das Problem tritt nicht während das Reset (ISP) auf, sondern im
Betrieb des Controllers. Denn du trennst ja die ISP-Leitungen nicht vom
PC. Der PC legt aber an SCK und MOSI definierte Pegel an den AVR (das
verursacht erstmal falsche, ungewollte Eingaben).

Betätigst du nun auch noch einen Taster (egal ob gegen GND oder gegen
Vcc), dann belastest du den LPT-Port des PC und kannst diesen sogar
beschädigen.

Wenn du also etwas schützen willst, dann trenne bei laufendem Programm
(also bei nicht aktiviertem Reset) die ISP-Leitungen vom PC. Dies geht
hervorragend mit einem Bustreiber-IC auf HC- oder HCT-Basis (die
Auswahl ist abhängig von deinem LPT-Chip und dessen Pegeln).

Und damit man diese Schaltung nicht in jedes Zielsystem einbauen muss,
baut man sie nur einmal ein, und zwar in den ISP-Adapter.

Und schon sind wir wieder am Anfang...

Aber tröste dich, du bist nicht der Erste mit ISP-Problemen und wirst
auch nicht der Letzte sein. Ich hatte auch große Probleme damit, meine
Lösung kannst du auf www.hanneslux.de nachlesen.

Gruß...
...HanneS...

von Henry Brennig (Gast)


Lesenswert?

<zitat>
Denn du trennst ja die ISP-Leitungen nicht vom
PC. Der PC legt aber an SCK und MOSI definierte Pegel an den AVR (das
verursacht erstmal falsche, ungewollte Eingaben).
</zitat>

Stimmt, das hatte ich ganz vergessen. Zwei Hirne bedenken eben mehr als
eins... Da muss ich wohl doch nochmal drüber grübeln...

Dank dir erstmal!

von Hannes L. (hannes)


Lesenswert?

Wie schonmal erwähnt, den/die Taster brauchst du nicht zu trennen, da
genügt Disziplin, man betätigt während ISP nunmal keine Taster.

Und das Trennen der ISP-Leitungen außerhalb der Programmierphase ist am
ISP-Adapter besser aufgehoben als in jeder Zielschaltung.

Richtig vernünftig und zukunftsicher ist natürlich ein (aufgrund
internem AVR upgradefähiger) AVR-ISP von ATMEL. Ist aber zum Basteln
etwas Overkill.

...

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.