Atmega32 hängt sich auf bei Sprung in Subroutine

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • djmsc schrieb:

      Bei einiger Hardware die am ISP/SPI dran hängt, lässt sich der AVR nicht brennen (wird dann nicht mehr erkannt) erst wenn die HW weg ist geht es. (aber auch nicht immer, manchmal geht es auch mit HW)
      ja, weil viele Schaltungen, besonders bei Einsteigern, nicht SPI-geeignet aufgebaut sind.
      Wird CS von jedem Slave korrekt beschaltet (also auch mit Pullup, weil der AVR beim Reset kein High ausgibt) dann gibt es auch keine Probleme beim Programmieren.
    • ceperiga schrieb:

      Trenn mal dir R´s / C´s ab (wenn möglich) und leg den ISP- Anschluß direkt auf Reset und den Taster ohne Beiwerk von GND auf den Resetpin. Die Controller haben die Beschaltung des Resetpins Onboard.

      Gruß Christian
      Ohne RC Beschaltung ändert sich nichts. Die gezeigte Beschaltung ist einer Application Note von Atmel entnommen.

      tschoeatsch schrieb:

      @128er woher weißt du eigentlich, das der Kontroller/Programm sich aufhängt? Wenn ich deinen 1. Post lese, dann sollte nach einer Minute die Minutenanzeige auf 1 schnappeln und tut das nicht. Kann die das? In einem Versuch probiert? Hast du die Led mal am Anfang der vermuteten sub ein und vor dem return mal ausschalten lassen?
      Bei deinem spiout bedienst du vorher und danach den chipselect. Brauchst du keinen clockpuls, um die eingeschobenen Daten zum Ausgang zu schalten?
      Also die Anzeigen funktionieren alle prima. Wenn es denn mal funktioniert werden auch auf allen Anzeigestellen alle Ziffern durchgetackert. Nach der Spannungswieder werden ja sowieso die Anzeigestellen alle von links nach rechts einmal aktualisiert und zeigen 00:00. Da zu dem Zeitpunkt die Systemvariablen "_hour" und "_min" noch = 0 sind. Bedeutet also, Treiber funktionieren, Anzeigen sind i.O.

      "Brauchst du keinen clockpuls, um die eingeschobenen Daten zum Ausgang zu schalten?"

      Wie meinst du das? Die generierung des Clocksignals (CLK) für den SPI übernimmt ja BASCOM selber. Oder meinst du sowas wie einen "Latch Befehl" für die Treiber. Das die dann die reingeschobenen Bits zu den Treiberausgängen schalten? Wenn ich mich recht erinnere, geschieht das durchschalten der reingeclockten Bits auf die Ausgänge mit der fallenden Flanke des Chipselecteingangs am betreffenden Treiber.

      tschoeatsch schrieb:

      djmsc schrieb:

      @128er hat aber auch geschrieben dass es schon mal lief und seit einiger Zeit nicht mehr. Ich könnte mir aber auch vorstellen dass sich einer von den Treibern verabschiedet hat und den Mega jetzt blockt.
      Er hat aber auch schon geschrieben, dass es keinen Unterschied macht, ob Verbraucher (Anzeigen) dran hängen oder nicht. Gut, wenn die Treiber dran bleiben, aber wie kann man bei reinen Ausgaben mit der Peripherie den Kontroller blockieren?
      Das ein defekter Treiber das ganze verursacht halte ich für unwarscheinlich. Falls ein Lastausgang defekt sein sollte würde halt Segmente nicht flippen. Sollte ein Lastausgang Kurzschluss schalten, sollte das den Treiber auch wenig jucken. Der Würde dann abgeschaltet werden. Über die MISO Leitung könnte man sollche Zustände auswerten. Der Treiber meldet sowas über SPI. Ok, habe ich nicht implementiert zur Zeit, geb ich zu :)

      Dann kann man noch an so doofe Effekte wie EMV Probleme denken. Der ganze Experimentieraufbau ist in der Hinsicht weit weg von perfekt. Allerdings tritt der Fehler zeitlich zu gut reproduzierbar auf, um es darauf zu schieben. Ich hab Reseteingang und auch die 5VDC Schiene ja schon oszilloskopiert. Da sind keine bösen Einbrüche oder Überspannungen sichtbar.




      Aaaaaaber . . .

      Was ich vorhin nochmal gemacht habe. Ich hab diese ganze Uhrzeitgeschichte aus der Hauptschleife rausgeschmissen. Dafür lasse ich jetzt einfach gleichzeitig alle vier Anzeigestellen von 0-9 durchlaufen. Das ganze bleibt dann hängen bei 66:66 oder 77:77 (nach ca 1,4 - 1,6 Sekunden). Dann muss ich ja das Netzteil ausschalten weil Reset nicht möglich. Allerdings muss ich echt relativ lange warten bis zum wiedereinschalten. Weil es sonst nicht anläuft oder der Hänger noch früher auftritt. Also alle Kapazitäten müssen sich erstmal entladen haben.

      Ich hab das mal als Video festgehalten. Da kann man gut sehen wie es ausschaut.

    • tschoeatsch schrieb:

      128er schrieb:

      'Setzen der Treiberausgänge zum löschen der bisher angezeigten Ziffer
      Cshsr = 0
      Spiout Cleardig0hsr , 1
      Cshsr = 1


      Cslsc = 0
      Spiout Cleardig0lsc , 1
      Cslsc = 1


      'Alle zuvor gesetzten Ausgänge wieder abschalten. Anzeige ist bistabil.
      'Ansonsten thermische Zerstörung der Spulen.
      Cshsr = 0
      Spiout Lowbyte , 1
      Cshsr = 1

      Cslsc = 0
      Spiout Lowbyte , 1
      Cslsc = 1
      wo lässt du dem display die Zeit zu reagieren? Diese Sequenz geht fei ratzfatz, beim folgenden Setzen der neuen Segmente das Gleiche. Da tut sich einfach nix an der Anzeige, auch wenn die sub durch läuft.
      Ja, die Routine läuft ratz fatz durch, stimmt. Das sich an der Anzeige nichts tut stimmt so nicht. Und da es so ging, habe ich auf Wartezeiten verzichtet. Werde den Ansatz aber auch nochmal verfolgen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von 128er ()

    • Du solltest vielleicht doch mal dein ganzes Programm umbauen.
      Anstelle der ganzen einzelnen Subs nur eine Sub für die Ausgabe auf die Displays.
      Die Muster für die Segmente kannst du in einer Datentabelle anlegen.
      Die Zeit (_hour und _min) kannst du in Zehner und Einer zerlegen und somit das richtige Muster dafür aus der Tabelle ziehen.

      BASCOM-Quellcode

      1. HourZehner = _hour / 10
      2. HourEiner = _hour Mod 10
      3. DatenOut = Lookup(HourEiner, Segmentdaten)
      4. Segmentdaten:
      5. Data &B1000000010000000% , ... 'Hier kommen deine Daten für die Segmente für 16 Bit
      6. 'oder für 8 Bit
      7. Data &B11111100 , ...
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo 128er,

      habe aus Zeitgründen jetzt nicht alles gelesen, wenn ich mir dein Video anschaue dann schein der Fehler bei Stunden zu liegen.
      Habe mir mal dein Programm angeschaut und siehe da stimmt etwas bei stunden nicht.

      BASCOM-Quellcode

      1. Select Case _hour
      2. Case &B00000000 : Call Dig1char0
      3. Call Dig2char0
      4. Case &B00000001 : Call Dig1char0
      5. Call Dig2char1
      6. Case &B00000010 : Call Dig1char0
      7. Call Dig2char2
      8. Case &B00000011 : Call Dig1char0
      9. Call Dig2char3
      10. Case &B00000100 : Call Dig1char0
      11. Call Dig2char4
      12. Case &B00000101 : Call Dig1char0
      13. Call Dig2char5
      14. Case &B00000110 : Call Dig1char0
      15. Call Dig2char6
      16. Case &B00000111 : Call Dig1char0
      17. Call Dig2char7
      18. Case &B00001000 : Call Dig1char0
      19. Call Dig2char8
      20. Case &B00001001 : Call Dig1char0
      21. Call Dig2char9
      22. Case &B00001010 : Call Dig1char1
      23. Call Dig2char0
      24. Case &B00001011 : Call Dig1char1
      25. Call Dig2char1
      26. Case &B00001100 : Call Dig1char1
      27. Call Dig2char2
      28. Case &B00001101 : Call Dig1char1
      29. Call Dig2char3
      30. Case &B00001110 : Call Dig1char1
      31. Call Dig2char4
      32. Case &B00001111 : Call Dig1char1
      33. Call Dig2char5
      34. Case &B000100000 : Call Dig1char1 'Fehler !!!
      35. Call Dig2char6
      36. Case &B00010001 : Call Dig1char1
      37. Call Dig2char7
      38. Case &B00010010 : Call Dig1char1
      39. Call Dig2char8
      40. Case &B00010011 : Call Dig1char1
      41. Call Dig2char9
      42. Case &B00010100 : Call Dig1char2
      43. Call Dig2char0
      44. Case &B00010101 : Call Dig1char2
      45. Call Dig2char1
      46. Case &B00010110 : Call Dig1char2
      47. Call Dig2char2
      48. Case &B00010111 : Call Dig1char2
      49. Call Dig2char3
      50. End Select
      Alles anzeigen

      Gruß
      Businski
    • 128er schrieb:

      Seit einiger Hab ich aber das Problem, dass der Controller einfach hängen bleibt. Das Programm wird einfach nicht weiter ausgeführt. Reset funktioniert dann auch nichtmehr.
      Der Reset greift direkt in die Hardware des Controllers ein und zwingt diesen in jedem Falle zum Neustart. Das trifft auch auf "hängende" Programme zu. Ich vermute dass hier ein Hardwareproblem vorliegt. Was macht denn die LED am Port C.3 ? Die sollte etwa im Sekundentakt blinken.
      Gruß
      Chris
    • Sowas kommt mir bekannt vor, leider steht hier nirgends deine SPI config zeile.
      Ich würde schätzen das du den ss pin falsch konfiguriert bzw nicht konfiguriert hast. Genau dann passiert sowas in der art da dann der SPI auf slave umschaltet und bis zum Sankt nimmerleinstag auf daten wartet.
      Variante b währen fehlende freilaufdioden an induktiver last, die spikes bringen gerne Prozessoren aus dem tritt.

      Tobias
    • hubertg schrieb:

      Reset ohne Kondensator, nur mit 10K zu +.
      Den 10K Widerstand kannst du weg lassen. Denn der ist schon im AVR eingebaut.

      Schraubbaer schrieb:

      fehlende freilaufdioden an induktiver last
      Die sind bei dem Treiber nicht erforderlich.
      Allerdings finde ich die Schaltung auch nicht gerade von Vorteil, da die Ausgabe in Zeilen und Spalten erfolgt.
      Da ist der Aufwand halt etwas größer.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Schraubbaer schrieb:

      Sowas kommt mir bekannt vor, leider steht hier nirgends deine SPI config zeile.
      Ich würde schätzen das du den ss pin falsch konfiguriert bzw nicht konfiguriert hast. Genau dann passiert sowas in der art da dann der SPI auf slave umschaltet und bis zum Sankt nimmerleinstag auf daten wartet.
      Variante b währen fehlende freilaufdioden an induktiver last, die spikes bringen gerne Prozessoren aus dem tritt.

      Tobias
      In meinem Eröffnungsbeitrag ist das Programm angehangen! SPI Config sieht dort so aus:

      BASCOM-Quellcode

      1. Config Spi = Hard , Interrupt = Off , Data Order = Lsb , Master = Yes , Polarity = Low , Phase = 1 , Clockrate = 128 , Noss = 1 , Spiin = 0
      Dort habe ich extra "Noss = 1" eingetragen. Oder sollte ich extra nochmal "ss = none" eintragen? Oder nutzt das nur etwas wenn ich Soft SPI nutze?



      Hier ist der teilfertige Schaltplan:
      fs5.directupload.net/images/170713/pmdomcxj.png

      Ich weiß, der wird wenig helfen um meine derzeitige Hardware zu debuggen.

      djmsc schrieb:

      hubertg schrieb:

      Reset ohne Kondensator, nur mit 10K zu +.
      Den 10K Widerstand kannst du weg lassen. Denn der ist schon im AVR eingebaut.

      Schraubbaer schrieb:

      fehlende freilaufdioden an induktiver last
      Die sind bei dem Treiber nicht erforderlich.Allerdings finde ich die Schaltung auch nicht gerade von Vorteil, da die Ausgabe in Zeilen und Spalten erfolgt.
      Da ist der Aufwand halt etwas größer.
      Die vorteilhaftere Ausführung sähe wie aus?

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von 128er ()

    • Du hast ja jetzt jedes gleiche Segment zusammen geschaltet, also alle A zusammen, alle B zusammen usw.
      Jetzt wäre es aber günstiger die andere Seite der Spulen pro Ziffer zusammen zu schalten (wie bei Multiplexanzeigen).
      Somit steuerst du nur die Ziffer an die geändert werden soll und du sparst auch noch einen Treiber ein.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Scheint meine vermutung war richtig, zumindest finde ich nicht das du b.4 auf Ausgang gesetzt hast, versuch dich mal den Port als Ausgang und setz ihn auf 1. Oder config so lassen un einen externen pullup Widerstand dran. Bei null schaltet der hw spi auf slave mode. Wie gesagt, ich hatte ähnliche symtome ganz am anfang meiner spi Karriere. Ich glaub sogar deswegen wurde der Hilfe Text danach nochmal überarbeitet und mit einer Warnung versehen
      Siehe Hilfe:

      One big difference with software SPI, is that in order to use the SPI in master mode, the SS pin must be set to output mode. Even if you do not use the dedicated SS pin to control a SPI slave chip !
      When the SS pin is in input mode, a logic 0 at the input will turn the master mode into slave mode. A pull up resistor could do the same but our advise : use the SS pin as an output pin.
      The SS pin is set to output mode when the MASTER mode is selected. So even if NOSS=1, the SS pin is set to output mode when MASTER=YES.

      When using NOSS=1 : In order to use the Hardware SPI in master mode, you need to set the SS pin to output. In input mode, this pin can be used to set the SPI bus into slave mode. You only need to set the pin to output when you use the NOSS=1 option. With NOSS=0, the compiler will set the SS pin to output and makes SS pin logic 1.
      When NOSS=1 is used, the SS pin is only made an output pin in MASTER mode. No logic level is set when NOSS=1.

      Tobias
    • Schraubbaer schrieb:

      Scheint meine vermutung war richtig, zumindest finde ich nicht das du b.4 auf Ausgang gesetzt hast, versuch dich mal den Port als Ausgang und setz ihn auf 1. Oder config so lassen un einen externen pullup Widerstand dran. Bei null schaltet der hw spi auf slave mode. Wie gesagt, ich hatte ähnliche symtome ganz am anfang meiner spi Karriere. Ich glaub sogar deswegen wurde der Hilfe Text danach nochmal überarbeitet und mit einer Warnung versehen
      Siehe Hilfe:

      One big difference with software SPI, is that in order to use the SPI in master mode, the SS pin must be set to output mode. Even if you do not use the dedicated SS pin to control a SPI slave chip !
      When the SS pin is in input mode, a logic 0 at the input will turn the master mode into slave mode. A pull up resistor could do the same but our advise : use the SS pin as an output pin.
      The SS pin is set to output mode when the MASTER mode is selected. So even if NOSS=1, the SS pin is set to output mode when MASTER=YES.

      When using NOSS=1 : In order to use the Hardware SPI in master mode, you need to set the SS pin to output. In input mode, this pin can be used to set the SPI bus into slave mode. You only need to set the pin to output when you use the NOSS=1 option. With NOSS=0, the compiler will set the SS pin to output and makes SS pin logic 1.
      When NOSS=1 is used, the SS pin is only made an output pin in MASTER mode. No logic level is set when NOSS=1.

      Tobias
      HEUREKA! :thumbsup:

      Das war es tatsächlich. Vielen Dank Schraubbaer!

      Verteufelt noch eins. Irgendwann muss ich die Konfiguration von SS (PB.4) als Ausgang mal gelöscht haben. Mehr oder weniger bewusst. Und danach hat es dann wohl nichtmehr funktioniert. :S