www.mikrocontroller.net

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


Autor: Nook (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();
  }

}
}

Autor: Jan M. (Gast)
Datum:

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

Autor: Nook (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
var_interrupt: dient zu erkennen über welchen PIN das Lauflicht
gestartet wird.

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nook (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ssss Ssssss (sssssss)
Datum:

Bewertung
0 lesenswert
nicht 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
char var_interrupt;
.....
if (PIND & (1<<PIND2))  {
    var_interrupt = 0;
  }else if(PIND & (1<<PIND3)){
    var_interrupt = 1;
  }else{
    var_interrupt = 2;  
    //spi_senden(0x0c,0x00);
  } 

Bye, Simon

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Nook (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();
  }
  }
}

Autor: Nook (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist der Reset-Pin denn beschaltet?

Autor: Nook (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Nook (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nook (Gast)
Datum:

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

Autor: Oje (Gast)
Datum:

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

Autor: Oje (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo. Auch lesenswert ist dazu die folgende Appnote:

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

Autor: Charles (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Nehme alles zurück und behaupte das Gegenteil."


Stimmt, der Kondensator hat zwischen Reset und zu liegen.

Autor: Nook (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.