ATMEGA8 hängt sich auf nach X zeit

Gast #367406
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();
  }

}
}
Gast #367409
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.
#367411
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
Gast #367412
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);
}
Gast #367413
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();
  }
  }
}
Gast #367414
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.
Gast #367418
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.
Gast #367423
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.
Gast #367424
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.
Gast #367428
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.
Moderator Persönliche Seite #367429
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".

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren