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!
Du kannst sie normal nutzen, ohne irgendetwas zu deaktivieren. Gruß Florian
Vorrausgesetzt, die ISP Nutzung kollidiert nicht mit den externen Komponenten.
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. ...
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".
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.
Äh, hast du vor während des Programmierens an den Tastern rumzuspielen? Ansonsten ist die Abschaltung per Reset doch nutzlos, oder?
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.
Am einfachsten waehre es, im code den internen pull-up zu aktivieren und den Eingang per Taste auf GND zu ziehen.
Öhm, das ganze ist doch kein Problem. Hat hannes doch schon gesagt. Die Schaltung oben ist imo Mist. Wofür? Unsinn!
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.
Ach eh ich's vergesse: trotzdem vielen Dank für die Antworten!
<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. ...
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. ;-)
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
@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.
Ein "richtiger" ISP-Programmer hat solange hochohmige Ausgänge, bis er selbst den RESET auslöst und dann mit dem Programmieren beginnt.
Ich habe aber leider nur das Geld für die Low-Budget-Lösung "Parellelkabel mit 2 Widerständen"... ;)
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. ...
Aber warum dann nich einfach meine Schaltung verwenden? Was ist dagegen einzuwänden?
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...
<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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.