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(); } } }
- Was ist var_interrupt? - Deine initports() macht exakt gar nichts. Eine 0 zu schieben und zu verodern macht 0 Änderung...
var_interrupt: dient zu erkennen über welchen PIN das Lauflicht gestartet wird. initports(): Eigentlich könnte ich es weg lassen oder?
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.
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?
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
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); }
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(); } } }
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.
Was meinsten genau??? Ich weis nur das ich den auf masse legen muss da schon 5volt drauf sind.
Der Reset-Pin ist "active low". Wenn du da Masse anschließt, hängt der Controller im Reset-Zustand fest.
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.
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.
ich habe zum programmieren Pins und der Reset liegt neben den GND da muss ich immer nur mit meinen schlüssel brücken.
Mann, der Reset muss über einen Pullup auf Vcc liegen. Dazu noch einen 100n Kondensator parallel zum Widerstand.
> ...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.
> 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.
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...
Jo. Auch lesenswert ist dazu die folgende Appnote: http://www.atmel.com/dyn/resources/prod_documents/doc2521.pdf
"Nehme alles zurück und behaupte das Gegenteil." Stimmt, der Kondensator hat zwischen Reset und zu liegen.
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.