PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Portzustand kurz nach Start des Microkontrollers



VODKACITY
10.12.2006, 20:23
Hallo zusammen!

Ich habe folgendes Problem:
Wenn ich den Microkontroller ( RN Control Mega32 ) starte werden kurzzeitig ALLE Ports auf einen Zustand zwischen 0 und 5V geschalten.

An meinen Ausgängen hängen verstärker Endstufen und an deren Ausgangen wiederum Relais, welche Elektrozünder ( für die Pyrotechnik ) zünden sollten.

Das Problem ist, dass diese bei Microkontroller start kurzzeitig durchgeschalten werden. ( Bruchteil einer Sekunde ) und dann wieder auf einen im Programm festgelegten Pegel ( 0V ) gesetzt werden.

Dann wird das eigentliche Programm abgespielt.

Wie kann ich diese Problem beheben? ( Das zu beginn die Ports auf irgenwelchen Spannungen sind )?

PS: Programmiert wird in C.

Danke im Voraus, für eure Antworten.

Gruss Benny

uwegw
10.12.2006, 20:33
Wärend eines Resets bzw. ab dem Einschalten, bis die Pins konfiguriert wurden, sind alle Pins als hochohmige Eingänge geschaltet. Du müsstest also an allen relevanten Pins Pulldown-Widerstände einbauen, die für einen definierten 0V-Pegel sorgen, solange der Ausgang nicht auf high geschaltet wird.

VODKACITY
10.12.2006, 20:48
Kannst du mir prinzipiell mal so eine Schaltung aufzeichen?

Danke

Schöne Grüsse

Benny

uwegw
10.12.2006, 21:02
Ganz einfach: An allen problematischen Pins einen Widerstand von etwa 1k bis 100k (der genau Wert ist nebensächlich) nach Masse anschließen.

VODKACITY
11.12.2006, 15:54
Ok ich werde es versuchen, danke erstmals

VODKACITY
14.12.2006, 18:55
Hallo zusammen!

Habe das nun mit den Widerständen versucht, leider ohne Erfolg :(
Weiß hier jemand weiter?

Muss ich im Programm irgendetwas spezielles beachten, aktivieren oder deaktivieren?

Danke für eure Infos.

Gruss Benny

uwegw
14.12.2006, 20:16
Aber die Endstufen haben wirklich 0V als Ruhepegel, bei dem nichts passiert? Oder doch 5V Ruhepegel, zum auslösen auf Masse ziehen?

VODKACITY
14.12.2006, 21:20
Hallo

Wie ziehen beim auslösen ( 5V am port ) den Ausgang auf Masse

Grüsse Benny

uwegw
16.12.2006, 12:16
Hast du nen Datenblatt/Anleitung/wasauchimmer für die Geräte, die du am AVR angeschlossen hast?

VODKACITY
16.12.2006, 12:46
Du meinst für meine Verstärkerschaltung? Die an den einzelnen Ports hängt?

Lg Benny

uwegw
16.12.2006, 12:57
Genau. Wenn du nicht verrätst, was genau an den Ports hängt, ist alles andere nur stochern im Nebel...

VODKACITY
16.12.2006, 13:16
Es hängt an den Ports eine sogenannte ULN Schaltung dran... welche mir dann schlussendlich aus den 5V welche beim Port rauskommt 12V macht und dies weiter schickt an meine Relais.

Hier wären die Artikel:

ULN2803 - http://www.produktinfo.conrad.com/datenblaetter/150000-174999/171824-da-01-en-ULN_2801_03_04.pdf

Relais - http://www.produktinfo.conrad.com/datenblaetter/500000-524999/502642-da-01-de-Relais_6V_12A.pdf

Grüsse Benny

uwegw
16.12.2006, 16:08
Dann muss es mit dem Pulldown funktionieren. Eigentlich sogar ohne exteren Widerstand, es sind nämlich schon interne vorhanden.

Wie sind die Relais angeschlossen? 12V-Quelle->Relais->Ausgangspin des ULN?

Tritt das Problem nur beim einschalten der Stromversorgung auf, oder auch, wenn du den Controller resettest?

VODKACITY
16.12.2006, 16:44
ja eben, dass mit der pulldown funktion softwaremäßig machen wäre die beste variante.... weißt du wie das funktioniert?

gruss benny

uwegw
16.12.2006, 18:06
Die von mir angesprochenen Widerstände befinden sich im ULN, nicht im AVR. Sie sind dort fest eingebaut und können nicht abgeschaltet werden.

Die Eingangsstufe des ULN2803 ist so gebaut, dass sein Ausgang abgeschaltet ist, wenn der Eingangspin nicht verbunden oder auf Masse geschaltet ist. Nur wenn am Eingang 5V angelegt werden, wird der Ausgang aktiviert.

Poste mal dein Programm für den AVR. Die Hardware müsste nämlcih eigentlich stimmen, wenn es im Normalbetrieb funktioniert. Veilleicht machst du ja irgendwas bei der Initialisierung der Ports falsch.

VODKACITY
17.12.2006, 11:34
Das wäre unser Programm:


#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <inttypes.h>

volatile uint16_t timer = 0;

#define TIMER1_RELOAD 0x85ee
//#define TIMER1_RELOAD 0xfffe

int main (void)
{
// berlauf alle 500 ms bei 16 MHz
TCNT1 = TIMER1_RELOAD;

// Timerberlauf Interrupt aktivieren
TIMSK = (1<<TOIE1);

// Prescaler = 256, Timer1 starten
TCCR1B = (1<<CS12);

// Interrupts aktivieren
sei();

// Port C als Ausgang schalten
SFIOR=0xff;
PORTC = 0x00;
DDRC = 0xff;



while(1) {


//PORTC
if ((timer >= 1) && (timer < 3)) {
//port 1 wird geschaltet--> znden
// der zustand bleibt 500 ms erhalten
PORTC |= (1<<PC0);
}

if ((timer >= 4) && (timer < 6)) {
//port 2 wird geschaltet--> znden
// der zustand bleibt 500 ms erhalten
PORTC |= (1<<PC1);
}

if ((timer >= 7) && (timer < 9)) {
//port 3 wird geschaltet--> znden
// der zustand bleibt 500 ms erhalten
PORTC |= (1<<PC2);
}
if ((timer >= 10) && (timer < 12)) {
//port 3 wird geschaltet--> znden
// der zustand bleibt 500 ms erhalten
PORTC |= (1<<PC3);
}
if ((timer >= 13) && (timer < 15)) {
//port 3 wird geschaltet--> znden
// der zustand bleibt 500 ms erhalten
PORTC |= (1<<PC4);
}
if ((timer >= 16) && (timer < 18)) {
//port 3 wird geschaltet--> znden
// der zustand bleibt 500 ms erhalten
PORTC |= (1<<PC5);
}
if ((timer >= 19) && (timer < 21)) {
//port 3 wird geschaltet--> znden
// der zustand bleibt 500 ms erhalten
PORTC |= (1<<PC6);

}
if ((timer >= 22) && (timer < 24)) {
//port 3 wird geschaltet--> znden
// der zustand bleibt 500 ms erhalten
PORTC |= (1<<PC7);
}

//if ((timer >= 25) && (timer < 27)) {
//port 3 wird geschaltet--> znden
// der zustand bleibt 500 ms erhalten
//PORTC |= (1<<PC8);
//}
if(timer==28) {
timer=0;
PORTC=0x00;

}

}

return 0;
}

// -----------------------------------------
// Timerberlauf Interrupt
SIGNAL(SIG_OVERFLOW1)
{
// Timer neu laden
TCNT1 = TIMER1_RELOAD;

timer++;
PORTC=0x00;


if (timer == 0xffff) {
// Timer stoppen
TCCR1B = 0;
}
}

VODKACITY
17.12.2006, 11:36
Das SFIOR = 0xff war nur ein Test zum die Pull up Widerstände auszuschalten, leider funktionierte dies nicht.

Grüsse Benny

uwegw
17.12.2006, 13:41
Das einzige, was mir daran auffällt ist, dass die Befehle
PORTC = 0x00;
DDRC = 0xff;
vertauscht und direkt an den Beginn von main verschoben werden sollten. In der jetzigen Anordnung wird nämlich erst auf Eingang mit Pullup geschaltet, und erst dann auf Ausgang low, wodurch für zwei Taktzyklen 5V am Pin anliegen würden. Aber um ein Relais zu schalten, sollte ein Impuls von 1,25µs normalerweise nicht ausreichen.

dennisstrehl
17.12.2006, 14:55
Das einzige, was mir daran auffällt ist, dass die Befehle
PORTC = 0x00;
DDRC = 0xff;
vertauscht und direkt an den Beginn von main verschoben werden sollten. In der jetzigen Anordnung wird nämlich erst auf Eingang mit Pullup geschaltet, und erst dann auf Ausgang low, wodurch für zwei Taktzyklen 5V am Pin anliegen würden. Aber um ein Relais zu schalten, sollte ein Impuls von 1,25µs normalerweise nicht ausreichen.

Wenn PORTC = 0 sind die Pullups meines Wissens aus. Das Datenblatt vom Mega48 stimmt mir zu.

VODKACITY
17.12.2006, 15:10
@dennis dadurch, dass wir die Ports zu beginn als Ausgang initialisieren, werden damit die Pull ups automatisch ausgeschaltet, dass Problem besteht allerdings vor der initialisierung, da die Pull ups eingeschaltet sind und mir kurzzeitig einen High Pegel am Ausgang liefern, und die Endstufen dadurch durchschalten.

uwegw
17.12.2006, 15:44
Ja, ich merke es auch gerade: es müsste auch in der von VODKACITY benutzten Reihenfolge laufen.

Nach dem Einschalten/Reset stehen sämtliche DDR- und PORT-Register auf 0x00. Somit ergibt sich: Eingang ohne Pullup. Also ein hochohmiger Eingang, das Potential am Pin wird nur von der Außenbeschaltung bestimmt. In der aktuelle Schaltung: der TTL-Eingang des ULN zieht den Pin über Widerstände auf Masse.

Nun wird das PORT-Register auf 0x00 gesetzt. Da es diesen Wert schon enthält, ändert sich nichts.

Schließlich wird das DDR-Register auf 0xFF gesetzt. Die Pins werden damit zu Ausgängen. Weil das PORT-Register auf 0x00 steht, werden alle Pins auf Masse gezogen. Damit ist die Initalisierung abgeschlssen. Die Pins wurden bisher nie auf high geschaltet. Die Treiber wurden also noch nicht aktivert, ebensowenig die internen Pullups.

Füg mal ein paar Verzögerungen hinzu, um zu prüfen, an welcher Stelle des Programms der unerwünschte Impuls tatsächlich auftritt. Das geht am einfachsten mit einer Funktion aus <util/delay.h>.

Füge in das Programm folgende Funktion ein, und rufe sie dann an den interessanten Stelle per warte(1000) auf.


#include <util/delay.h>
void warte (int loop) //loop: wartezeit in ms
{
int i;
for(i=0;i<loop;i++) _delay_ms(1);
}

VODKACITY
17.12.2006, 15:53
wenn ich das versuche, die funktion zu implementieren, kann er die header-datei delay.h nicht finden.

uwegw
17.12.2006, 15:55
Welche avrgcc-Version? Bei älteren Versionen war es <avr/delay.h>

VODKACITY
17.12.2006, 17:43
Ich habe mir das ganze bezüglich den externen pull down widerständen zwischen Portausgang und Masse nochmals überlegt.
Nach meiner Meinung kann das ganze nicht funktionieren, da am anfang die internen Pullup widerstände deaktiviert sind ( niederohmig ) und durch meine Zusätzlichen Pull down widerstände würde das Potential am ausgang wiederum durch meine 10k Ohm widerstände auf ca. 5V bleiben würde. ---> Endstufen schalten durch.

Denkt jemand genauso, oder habe ich hier ein Fehler in der Denkweise?

Danke nochmals für eure Infos.

Lg Benny

dennisstrehl
17.12.2006, 18:16
Wenn die internen Pull-Ups deaktiviert sind, ist der Port hochohmig und nicht niederohmig.
Den Satz danach kann ich in seinem Sinn nicht ganz überblicken.

VODKACITY
17.12.2006, 20:41
@uwe ich denke ich hab die neuste version, hab sie von der CD.... und diese hab ich erst seit Aug. 2006


Gruss Benny

VODKACITY
19.12.2006, 23:11
kann mir keiner weiterhelfen???

:(

Hubert.G
20.12.2006, 10:57
IN deinem letzten Beitrag hast du Pull-Down mit Pull-Up verwechselt. Ich hoffe du hast da nicht einen generellen Gedankenfehler drin.

VODKACITY
20.12.2006, 11:49
Hallo Hubert.

Ja weißt du wie wir unser Problem lösen können? --> Softwaremäßig?

Danke für deine Hilfe

Benny

Hubert.G
20.12.2006, 12:16
Hast du schon Pull-Down-Widerstände probiert, also etwa 5k nach GND von jedem Port?
Welche Ports verwendest du?
Machen das alle Ports oder nur einige?

Hubert.G
20.12.2006, 12:21
Die LED auf Port C hast du doch abgeschaltet

VODKACITY
20.12.2006, 12:22
Hallo Hubert, ja das mit den Widerständen einbauen haben wir auch schon versucht. Wir haben 10k Widerstände direkt an die Ports gehängt.
Ich verwende die Ports B bis D... also 24Kanäle.
Und ja es passiert leider bei allen Ports das gleiche.

Gruss Benny

VODKACITY
20.12.2006, 12:22
nein die LED hab ich nicht abgeschalten, müssen wir das?

Gruss Benny

Hubert.G
20.12.2006, 12:46
Ohne Pull-Down würde ich es auf keinen Fall machen, aber ich probiere das mal auf meinem Testboard aus, wird ein bisschen dauern.
Auf PC0 und 1 hängen 10k PullUp vom I2C, die passen da nicht dazu und einige andere ICs hängen noch auf den diversen Ports, die sollte man ansehen ob sie nichts zurückliefern.

Hubert

Hubert.G
20.12.2006, 13:59
Ich habe dein Programm auf meinem Testboard probiert und den PortC mit dem Oszi überprüft. Auf keinen Pin bekomme ich nach einen Reset ein High-Signal.
Zu den LED, diese liegen nach +5V, der Eingang des ULN nach GND, das reicht locker um den ULN durchzuschalten. Also auf jeden Fall LED abschalten.

Hubert

Hubert.G
20.12.2006, 14:09
Du hast übrigends noch einen ältere Version des GCC. Das delay heisst dort #include <avr/delay.h>
und dann z.B. _delay_ms(5000); für 5sec warten wenn du das mal ausprobieren möchtest wie dir @uwegw vorgeschlagen hat.

VODKACITY
21.12.2006, 00:05
ok danke erstmals.... ich werde das ganze am Wochenede mal versuchen :)

Ich gebe euch dann bescheid

Grüsse Benny