Forum: Mikrocontroller und Digitale Elektronik ATMega 32 bleibt stehen


von wolf4124 (Gast)


Lesenswert?

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;
  }



}

von UBoot-Stocki (Gast)


Lesenswert?

Hi,

was schalten die Relais denn? Funktioniert die Schaltung ohne Last an 
den Relais bzw. ohne Relais ?

Gruß

Andreas

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Frank B. (frank_b) Benutzerseite


Lesenswert?

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

von Michael Wilhelm (Gast)


Lesenswert?

>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

von wolf4124 (Gast)


Lesenswert?

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ß

von Falk B. (falk)


Lesenswert?

@ 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

von wolf4124 (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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?

von wolf4124 (Gast)


Lesenswert?

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ß

von wolf4124 (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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?

von Simon K. (simon) Benutzerseite


Lesenswert?

Karl heinz Buchegger wrote:
> Sniffer Glieder sitzen an den Relais?

Sniffer Glieder?! ;) http://de.wikipedia.org/wiki/Snubber

von Bensch (Gast)


Lesenswert?

> 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....

von Falk B. (falk)


Lesenswert?

@ 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

von Uwe (Gast)


Lesenswert?

Hi!
>Ganz "normaler" Pegelwandler. Geht schon, die 0,7mA verkaften die
>die Schutzdioden.
Und soetwas entlarft Pfuscher.

MFG Uwe

von Martin (Gast)


Lesenswert?

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

von wolf4124 (Gast)


Lesenswert?

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ß

von Falk B. (falk)


Lesenswert?

@ 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

von wolf4124 (Gast)


Lesenswert?

Hallo

>Ja, aber hast du Pin 10, an dem die Dioden zusammengeführt sind, auch an
>12V angeschlossen?


Ja habe ich.

von wolf4124 (Gast)


Lesenswert?

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ß

von Volker (Gast)


Lesenswert?

Mal probehalber CKOPT gesetzt?


Gruß, Volker

von wolf4124 (Gast)


Lesenswert?

Hallo

habe ich gerade probiert.
Bring keine Änderung.

Gruß

von Falk B. (falk)


Lesenswert?

@ 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

von Magnus Müller (Gast)


Lesenswert?

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

von wolf4124 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.