Genau. Wenn du nicht verrätst, was genau an den Ports hängt, ist alles andere nur stochern im Nebel...
Druckbare Version
Genau. Wenn du nicht verrätst, was genau an den Ports hängt, ist alles andere nur stochern im Nebel...
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/da...2801_03_04.pdf
Relais - http://www.produktinfo.conrad.com/da...ais_6V_12A.pdf
Grüsse Benny
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?
ja eben, dass mit der pulldown funktion softwaremäßig machen wäre die beste variante.... weißt du wie das funktioniert?
gruss benny
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.
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;
}
}
Das SFIOR = 0xff war nur ein Test zum die Pull up Widerstände auszuschalten, leider funktionierte dies nicht.
Grüsse Benny
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.Zitat:
Zitat von uwegw
@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.