Hallo Ich habe eine ATMega32 mit einen leeren Hauptprogramm (Schleife). Der Timer 1 läuft alle 100ms ab und liest bei mir nur einen Port ein. Siehe Programm unten. Habe das Problem das der Ablauf einfach stehen bleibt und nicht mehr reagiert. Als Schaltung ist an den beiden Ausgangsport über einen ULN2003 je Pin ein Relais angeschlossen. Habe gelesen das die ULN2803 interne Schutzdioden haben. Relais sind vom MC auch ca. 8cm entfernt Spannung ist über Konstantregler stabilisiert. Quarz mit 8MHz. Kann mir jemand drüberschauen? Gruß Wolf4124 #include <avr/io.h> #include <avr/interrupt.h> #include <avr/wdt.h> int Int_Merker = 0x00; int Int_Counter = 0x00; int main (void) { DDRA = 0x00; //Port A als Input schalten DDRB = 0x00; //Port B als Input schalten DDRC = 0xff; //Port C auf Output schalten DDRD = 0xff; //Port D auf Output schalten PORTC = 0x00; //Port C löschen PORTD = 0x00; //Port D löschen //Timer TCNT1H = 0xCF; //Wert für einen Timebase von 1ms TCNT1L = 0x2B; TCCR1B &=~(0<<CS12); //Einstellung des Vorteiler für den Timer 1 TCCR1B |=(1<<CS11); // 1/0/1 == durch 1025 teilen TCCR1B &=~(0<<CS10); TIMSK |=(1<<TOIE1); // Timer1 Interupt freigeben sei(); //Globale Interrups zulassen wdt_enable(7); PORTC = 0x00; PORTD = 0x00; while(1) { wdt_reset(); //Watchdog reset } return 0; } ISR (TIMER1_OVF_vect) //Interuptvektor für Timer1 { int Int_PortC = 0x00; TCNT1H = 0xCF; TCNT1L = 0x2B; if (Int_Merker != PINA) { PORTD = 0x00; Int_Merker = PINA; Int_Counter = 40; //Counter aufziehen } if (Int_Counter == 20) { PORTC = Int_Merker; } if (Int_Counter == 0) { PORTD = Int_Merker; } if (Int_Counter > 0) { --Int_Counter; } }
Hi, was schalten die Relais denn? Funktioniert die Schaltung ohne Last an den Relais bzw. ohne Relais ? Gruß Andreas
> TCCR1B &=~(0<<CS10);
So kann man kein Bit auf 0 setzen.
0 << CS10 ergibt 0. Eine 0 kann man nach links oder rechts
schieben, sooft man will, es bleibt immer noch
eine 0
~0 ergibt eine Zahl, in der alle Bits 1 sind,
also auf Byteebene 0xFF
TCCR1B & 0xFF ergibt aber wieder die Zahl in TCCR1B selbst.
Vergiss das mit dem 0 setzen. Die Register sind beim
Einschalten immer 0. Dafür sorgt die Hardware.
Wenn schon, dann schreib so:
TCCR1B |= ( 0 << CS12 ) | ( 1 << CS11 ) | ( 0 << CS10 );
Die geshifteten 0-en haben zwar keinen Zweck. Aber sie dienen
als Platzhalter, falls man dann doch mal den Vorteiler wechseln
will.
Zum Problem:
Was hängt am Port A?
Und lass um Himmels willen mal den Watchdog aus dem Spiel, solange
bis das Programm fertig ist.
Werden die Relais aus der selben Quele versorgt wie der µC ? Hast Du mal versucht die Relais abzuklemmen ? Wenn es dann funktioniert, liegt es wahrscheinlich an der Stromversorgung. Hast Du die obligatorischen Abblockkondensatoren eingebaut ? lg, Frank
>Habe das Problem das der Ablauf einfach stehen bleibt und nicht mehr >reagiert. Wo bleibt das Programm stehen?. Kann es vielleicht an der Stackgröße liegen? MW
Hallo Am PORTA liegt 12 Volt über einen Vorwiderstand (10K) am MC. Watchdog habe ich nur zum Test mit eingefügt. Habe ich vergessen zu schreiben das soger der Watchdog stehen bleibt bzw. die Schaltung nicht mehr resetet wird. Gruß
@ wolf4124 (Gast) >Habe das Problem das der Ablauf einfach stehen bleibt und nicht mehr >reagiert. Dein Programm hat mehrere massive Fehler. > DDRA = 0x00; //Port A als Input schalten > DDRB = 0x00; //Port B als Input schalten Kann man sich sparen, ist nach dem Reset automatisch so > PORTC = 0x00; //Port C löschen > PORTD = 0x00; //Port D löschen Das gleiche hier. >//Timer >TCNT1H = 0xCF; //Wert für einen Timebase von 1ms >TCNT1L = 0x2B; Greif unter C einfach auf TCNT1 zu, dann küürt sich der Compiler um den RICHTIGEN Zugriff. >TCCR1B &=~(0<<CS12); //Einstellung des Vorteiler für den Völliger Nonsense. Ein Null kannst du schieb soviel du willst, es bleibt Null. Siehe Bitmanipulation. >TCCR1B &=~(0<<CS10); Hier das gleiche. >wdt_enable(7); Lassd en Watchdog für soche Sachen erstmal aus. Da schiesst du dir eher ins Knie. >PORTC = 0x00; >PORTD = 0x00; Wozu das nochmal? >ISR (TIMER1_OVF_vect) //Interuptvektor für Timer1 >{ > int Int_PortC = 0x00; > TCNT1H = 0xCF; > TCNT1L = 0x2B; Macht man so eigentlich nicht. Nutze den CTC Modus des Timers. Ziemlich konfus das Ganze. >Als Schaltung ist an den beiden Ausgangsport über einen ULN2003 je Pin >ein Relais angeschlossen. >Habe gelesen das die ULN2803 interne Schutzdioden haben. Sicher. Die hast du hoffentlich auch an VCC vom Relais angeschlossen? Relais mit Logik ansteuern >Relais sind vom MC auch ca. 8cm entfernt Kein Problem, wenn die Freilaufdioden angeschlossen sind. MFG Falk
Hallo die Relais hängen an den gleichen 12 Volt. Die Spannung des MC geht über einen Festspannungsregler. 100µF davor und dahinter. Dazu noch 100nF genau so drin. Jeder Spannungseingang des MC mit 100nF und die ULN auch mit 100nF geblockt. Relais kann ich nicht abstecken da alles (20 Relais) auf einer gemeinsamen Platine sitzen. Gruß
wolf4124 wrote: > Hallo > > Am PORTA liegt 12 Volt über einen Vorwiderstand (10K) am MC. > Watchdog habe ich nur zum Test mit eingefügt. Wo kommen die her. Gibt es da Schalter, oder sonstwas. Worauf ich hinaus will: Am Port A sind keine Pullup Widerstände eingeschaltet. Und ich will herausfinden ob es dafür einen Grund gibt, bzw. ob die notwendig wären. > Habe ich vergessen zu schreiben das soger der Watchdog stehen bleibt > bzw. die Schaltung nicht mehr resetet wird. Das heist die Schaltung funktioniert eine Zeitlang und hört dann auf, oder wie soll man das auffassen. Hast du dir einfach mal eine Ausgabe in den Timer Interrupt eingebaut, um zu sehen, ob der noch aufgerufen wird? zb. PINA auf einem anderen Port ausgeben und dort ein paar Leds dran oder sowas in der Richtung. PS: Wir reden aber nicht von einer Schaltung die im Auto verbaut ist?
Hallo Die Eingangssignale kommen von einer Karte aus einen System das mir 0Volt oder 12Volt -Pegel ausgibt. Ich kann im Moment nur sagen das die Schaltung nach einer Weile nicht mehr auf Signaländerungen am PORTA reagiert. Erst nach Spannungsunterbrechung der ganzen PCB (Relais und MC) Gruß
Hallo Vergessen. Die Schaltung kommt in ein Prüfsystem welches KFZ-Komponenten testet. Aber nicht im Auto selber verbaut. Also ohne die Störungen. Über die Relais gehen insgesamt 3 Ampere. Gruß
wolf4124 wrote: > Hallo > > Die Eingangssignale kommen von einer Karte aus einen System das mir > 0Volt oder 12Volt -Pegel ausgibt. Alles klar. > Ich kann im Moment nur sagen das die Schaltung nach einer Weile nicht > mehr auf Signaländerungen am PORTA reagiert. > Erst nach Spannungsunterbrechung der ganzen PCB (Relais und MC) Dann werden es wohl die Relais sein. Sniffer Glieder sitzen an den Relais?
Karl heinz Buchegger wrote: > Sniffer Glieder sitzen an den Relais? Sniffer Glieder?! ;) http://de.wikipedia.org/wiki/Snubber
> Am PORTA liegt 12 Volt über einen Vorwiderstand (10K) am MC.
Woher hast du diese Schnapsidee? Ist ja fast so schlimm wie 230V über
1MOhm an Port....
@ Bensch (Gast) >> Am PORTA liegt 12 Volt über einen Vorwiderstand (10K) am MC. >Woher hast du diese Schnapsidee? Ist ja fast so schlimm wie 230V über >1MOhm an Port.... Ganz "normaler" Pegelwandler. Geht schon, die 0,7mA verkaften die die Schutzdioden. MFG Falk
Hi! >Ganz "normaler" Pegelwandler. Geht schon, die 0,7mA verkaften die >die Schutzdioden. Und soetwas entlarft Pfuscher. MFG Uwe
Hi, ich wette, dass keine Antiparalleldioden an den Relais hängen. Dann gibts nen schönen Spike und der MC hängt sich auf. Die müssen immer mit, die Dioden. Vielleicht liegts ja auch an was anderem. Gruß, Martin
Hallo Ich habe im Datenblatt nachgeschaut und die haben die Fioden schon integriert. Habe auch den Link zurate gezogen. http://www.the-starbearer.de/Roboter/Baugruppen/Leistungstreiber%20ULN2803/Leistungstreiber%20mit%20ULN2803.htm Gruß
@ Uwe (Gast) >>Ganz "normaler" Pegelwandler. Geht schon, die 0,7mA verkaften die >>die Schutzdioden. >Und soetwas entlarft Pfuscher. Unsinn. @ wolf4124 (Gast) >Ich habe im Datenblatt nachgeschaut und die haben die Fioden schon >integriert. >Habe auch den Link zurate gezogen. Ja, aber hast du Pin 10, an dem die Dioden zusammengeführt sind, auch an 12V angeschlossen? MFG Falk
Hallo >Ja, aber hast du Pin 10, an dem die Dioden zusammengeführt sind, auch an >12V angeschlossen? Ja habe ich.
Hallo habe noch weitere Erkenntnisse. Ich habe nun direkte Freilaufdioden eingebaut. Ich habe in der Schleife des Hauptprogrammes einen Port zum toggeln gebracht. while(1) { PORTB = ~PORTB; } Bei dem "Absturz" bleibt die Hauptschleife mit stehen. Habe im Eingangsport noch Pullup-Widerstände eingefügt. Also Spannungsteiler 2*10KOhm. Aus CTC-Modul reagiert ein Portpin mit den ich aber unbedingt brauche. Kann mir jemand weiterhelfen? Gruß
@ wolf4124 (Gast) > while(1) > { > PORTB = ~PORTB; > } Kannst du mir mal erklären, was diese Schleife in deinen Augen machen soll? >Bei dem "Absturz" bleibt die Hauptschleife mit stehen. Nöö, du schaltest mit voller Geschwindigkeit deine Portpins um, so ca. mit 1/4 bis 1/10 des Prozessortaktes. Das sieht man weder mit LEDs, schon gar nicht mit Relais was blinken. >Kann mir jemand weiterhelfen? Du solltest mal aufhören planlos rumzustochern und dich mal mit ein paar Grundlagen vertraut machen. MfG Falk
wolf4124 wrote: > Habe im Eingangsport noch Pullup-Widerstände eingefügt. > Also Spannungsteiler 2*10KOhm. Wenn ich das jetzt richtig interpretiere, ist das Nonsense. Ein Pullup ist ein Widerstand gegen Betriebsspannung (VCC). In Deinem Fall würde das bedeuten das du bei einem Eingangssignal von 12V/0V nach dem Spannungsteiler eine Spannung von 6V/2,5V erhalten würdest (die Eingangsschutzdioden des µCs hab ich hier mal nicht berücksichtigt). > Aus CTC-Modul reagiert ein Portpin mit den ich aber unbedingt brauche. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Ich verstehe im Moment nicht, was du damit sagen willst. Falk Brunner wrote: > @ wolf4124 (Gast) > >> while(1) >> { >> PORTB = ~PORTB; >> } > > Kannst du mir mal erklären, was diese Schleife in deinen Augen machen > soll? Ich würde sagen, dass er damit die Pins von PortB toggeln will um einen (mittels Oszi messbaren) Indikator für die Abarbeitung der while(1)-Schleife zu haben. Dies dürfte allerdings schwierig sein, da er ja PortB vorher als Eingang konfiguriert hat und somit nur die Pullups ein- und ausschaltet. >>Bei dem "Absturz" bleibt die Hauptschleife mit stehen. > > Nöö, du schaltest mit voller Geschwindigkeit deine Portpins um, so ca. > mit 1/4 bis 1/10 des Prozessortaktes. Das sieht man weder mit LEDs, > schon gar nicht mit Relais was blinken. Das mag zutreffen, aber wenn man ein Oszi bemühen würde, sollte es gehen (vorausgesetzt, man hat den Port auch als AUSGANG gesetzt [siehe oben]). Gruß, Magnetus
Hallo wolf4124 wrote: >> Habe im Eingangsport noch Pullup-Widerstände eingefügt. >> Also Spannungsteiler 2*10KOhm. >Wenn ich das jetzt richtig interpretiere, ist das Nonsense. Ein Pullup >ist ein Widerstand gegen Betriebsspannung (VCC). In Deinem Fall würde >das bedeuten das du bei einem Eingangssignal von 12V/0V nach dem >Spannungsteiler eine Spannung von 6V/2,5V erhalten würdest (die >Eingangsschutzdioden des µCs hab ich hier mal nicht berücksichtigt). Sorry. Ich meinte Pulldownwiderstände. Habe von Eingang meiner Karten gesehen zwei 10KOhm in Reihe auf Masse. Zwischen diesen zwei Widerständen gehen ich auf meinen MC-Pin. >Das mag zutreffen, aber wenn man ein Oszi bemühen würde, sollte es gehen >(vorausgesetzt, man hat den Port auch als AUSGANG gesetzt [siehe >oben]). Ich habe vorher beim Programm die Zeile auf "DDRB = 0x08;" geändert. Zum Messen verwende ich ein Oszy. > Aus CTC-Modul reagiert ein Portpin mit den ich aber unbedingt brauche. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Ich habe den Modus aktiviert gehabt. Leider toggelte mir bei jedem Überlauf auch der Pin Gruß wolf4124
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.