Forum: Compiler & IDEs ATMEGA8 hängt sich auf nach X zeit


von Nook (Gast)


Lesenswert?

Hi,

ich hab mir mir einem Atmega8 und einen Max7221 ein Lauflicht gebaut.
Nun folgendes es wenn bei PIN D 2 und 3 eine Spannung anliegt läuft das
Unterprogramm mit dem Lauflicht los. Sonsten nichts. Jetzt ist aber das
komische wenn ich nach längerer zeit Spannung anlege an einen von
diesen Pins passiert nichts mehr. Wenn ich aber längere Zeit das
Lauflicht laufen lasse in dem ich Spannung an ein pin hänge hängt es
sich nicht auf daher meine Vermutung, dass es in der schleife (MAIN)
seinen muss. nun habe ich das problem das ich kein notebook habe und
das ganze schon fest montiert ist.daher meine frage was kann es sein
gibt es schon bekannte dinge die es sein könnten.
Wie schon gesagt es kann die Schleife in der Main sein oder das die
Ports verloren gehen Funktion "init_Ports();" sonsten die Variable
"var_interrupt" das dort was net geht. Ist es möglich das sich der
Atmega aufhängt wenn er zu lange die schleife durchläuft?

init_Ports()
{
DDRD |= (0<<PD2);
DDRD |= (0<<PD3);
DDRD |= (0<<PD4);
}


int main()
{
init_Ports();


while(1){
  if (PIND & (1<<PIND2))  {
    var_interrupt = "zv";
  }else if(PIND & (1<<PIND3)){
    var_interrupt = "schalter";
  }else{
    var_interrupt = "";
    //spi_senden(0x0c,0x00);
  }

  if (var_interrupt != ""){
    max7220_start();
    leds_loeschen();
    lauflicht();
    leds_loeschen();
  }

}
}

von Jan M. (Gast)


Lesenswert?

- Was ist var_interrupt?
- Deine initports() macht exakt gar nichts. Eine 0 zu schieben und zu
verodern macht 0 Änderung...

von Nook (Gast)


Lesenswert?

var_interrupt: dient zu erkennen über welchen PIN das Lauflicht
gestartet wird.

initports(): Eigentlich könnte ich es weg lassen oder?

von Rolf Magnus (Gast)


Lesenswert?

Ja. Egal, um wieviele Bits du 0 verschiebst, das Ergebnis ist wieder nur
0. Und für ein beliebiges X restultiert ein  X |= 0 in keinerlei
Änderung an X. Also unambhängig davon, was in DDRD gerade steht, wird
der Wert niemals verändert durch deine Operation.

von Nook (Gast)


Lesenswert?

Hmm. Okay alles kalr muss ich anders machen.
das wird aber nicht das problem sein wieso es nach paar stunden nicht
mehr géht doer?

von Ssss S. (sssssss)


Lesenswert?

Hi!

Wie ist denn var_interrupt deklariert ?
Und warum benutzt du einen String um festzustellen was die int quelle
war ?

var_interrupt = "schalter";

Einfacher und codespeicher sparender wäre doch
1
char var_interrupt;
2
.....
3
if (PIND & (1<<PIND2))  {
4
    var_interrupt = 0;
5
  }else if(PIND & (1<<PIND3)){
6
    var_interrupt = 1;
7
  }else{
8
    var_interrupt = 2;  
9
    //spi_senden(0x0c,0x00);
10
  }

Bye, Simon

von Rolf Magnus (Gast)


Lesenswert?

Abgesehen davon kann man Strings nicht einfach so vergleichen. Was da
gemacht wird, ist ein Zeigervergleich, kein zeichenweiser Vergleich des
Inhalts.

@Ssss ssssss:
Dann doch am besten gleich einen enum. Außerdem würde ich PIND nur
einmal lesen und in eine Variable eintragen. Ist auch schneller und
kleiner und dazu noch atomar.

enum quelle
{
   zv, schalter, wasanderes
};

volatile quelle var_interrupt;
...

uint8_t pin = PIND;
if (pin & (1<<PIND2))
{
    var_interrupt = zv;
}
else if (pin & (1<<PIND3))
{
    var_interrupt = schalter;
}
else
{
    var_interrupt = wasanderes;
    //spi_senden(0x0c,0x00);
}

von Nook (Gast)


Lesenswert?

Hi,

Danke für eure Hilfe. Wollt noch erwähnen, dass ich noch nie was mit
microprozessoren gemacht habe. Ist das erstemal und programmiere nur
software eigentlich. daher nicht wundern wenn ich ne komische art und
weise beim proggen habe.

Hier mein neuer Code ist der so gut?


int var_port_check;
int var_interrupt;

uint8_t var_PortD;


int main()
{

while(1){
  var_PortD = PIND;
  if (var_PortD & (1<<PIND2))  {
    var_interrupt = 1;
  }else if(var_PortD & (1<<PIND3)){
    var_interrupt = 2;
  }else{
    var_interrupt = 0;

  }
  if (var_interrupt != 0){
    max7220_start();
    leds_loeschen();
    lauflicht();
    leds_loeschen();
  }
  }
}

von Nook (Gast)


Lesenswert?

Achso nochwas. wenn ich den atmega stromlose mache in dem ich die
sicherung ziehe und kurz warte (max. 3 std.) das auch auch alle
kondensatoren leer sind und dann die sicherung wieder reinstecke geht
es auch net. ich muss dann den Reste auf Masse ziehen.

von Rolf Magnus (Gast)


Lesenswert?

Wie ist der Reset-Pin denn beschaltet?

von Nook (Gast)


Lesenswert?

Was meinsten genau??? Ich weis nur das ich den auf masse legen muss da
schon 5volt drauf sind.

von Rolf Magnus (Gast)


Lesenswert?

Der Reset-Pin ist "active low". Wenn du da Masse anschließt, hängt der
Controller im Reset-Zustand fest.

von Nook (Gast)


Lesenswert?

ja genau. was mir aufgefallen ist was jetzt noch viel komischer ist. ich
hatte ja das problm das der hängen geblieben ist und wenn ich den
spannungslos gemacht habe ging er danach nicht ich musste immer reset
machen. der hat sich wieder aufgehängt nun habe ich spannungslos
gemacht aber kein reset als ich später zum spaß den mal wieder
eingeschaltet habe (der so ca. 1 std an spannung hing) ging es wieder.
das find ich schon komisch. liegt das am code oder??? ich weiss net
mehr weiter die verdrahtung stimmt und auch kein wackelkontakt oder so
ist alles fest.

von Rolf Magnus (Gast)


Lesenswert?

Ja, wie hast du den Reset-Pin denn nun beschaltet? An GND hängt er wohl
nicht, sonst würde der Controller ja gar nicht laufen.

von Nook (Gast)


Lesenswert?

ich habe zum programmieren Pins und der Reset liegt neben den GND da
muss ich immer nur mit meinen schlüssel brücken.

von Oje (Gast)


Lesenswert?

Mann, der Reset muss über einen Pullup auf Vcc liegen. Dazu noch einen
100n Kondensator parallel zum Widerstand.

von Oje (Gast)


Lesenswert?


von johnny.m (Gast)


Lesenswert?

> ...der Reset muss über einen Pullup auf Vcc liegen...

Im Prinzip reicht der integrierte Pull-Up aus. Ein Kondensator parallel
zum Widerstand ist ziemlich überflüssig.

Wenn man ne externe Beschaltung macht, dann einen Kondensator von RESET
gegen Masse (!) und (wenn man eine bestimmte Zeitverzögerung einstellen
will) einen entsprechenden Widerstand gegen VCC.

von Rolf Magnus (Gast)


Lesenswert?

> Im Prinzip reicht der integrierte Pull-Up aus. Ein Kondensator
> parallel zum Widerstand ist ziemlich überflüssig.

Das kommt drauf an, wie gut die Stromversorgung ist und ob irgendwelche
externen Störer da sind. Es kann ohne funktionieren, muß aber nicht.

von johnny.m (Gast)


Lesenswert?

Richtig. Aber der Kondensator gegen VCC (also parallel zum Widerstand,
wie von Oje propagiert) ist wirkungslos. Er hat ja mittlerweile selber
den Link gepostet, wo es richtig steht...

von Rolf Magnus (Gast)


Lesenswert?

Jo. Auch lesenswert ist dazu die folgende Appnote:

http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf

von Charles (Gast)


Lesenswert?

"Nehme alles zurück und behaupte das Gegenteil."


Stimmt, der Kondensator hat zwischen Reset und zu liegen.

von Nook (Gast)


Lesenswert?

Hi,

danke für eure Antworten, dass mit dem Reset muss ich umbedingt machen.
Das könnte es echt sein. Da bei Resset die Leds immer stehen bleiben.
Wenn ich den Pin auf Reset ziehe. Vielleicht stört dort was im Auto.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Vielleicht stört dort was im Auto.

Jehova!

Ein Auto ist EMV-mäßig so ziemlich die schlimmste Umgebung, die
man sich vorstellen kann.  Die saubere Reset-Beschaltung ist dort
das Minimum, aber sehr wahrscheinlich musst du noch einiges mehr
tun, vor allem in der Betriebsspannungsabblockung.  Die FAQ der
Newsgruppe de.sci.electronics hat meiner Erinnerung nach ein
eigenes Kapitel über Elektronik im Kfz, gugele mal nach "DSE FAQ".

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.