Wie fügt man code ein?
HI
Hab mir eine Steuerung für meine wohnug zusammengelötet
1 X Mega644 Haupt MCU
1 X Mega16 Touch Screen auswertung
2 X mega8 Aktoren für licht und netzwerk
m644 ext quartz 8 mhz
m16 int 8mhz
m8 int 1 mhz (geht sonst nicht mehr nach fusebit einstellung auf 8 mhz)
alles über I²C verbunden (ausser der m16 mit dem m644 direkt über 8bit port)
die I²C leitungen haben eine gesammtlänge von ca 15 m 2,5kOhm abschluss
touch = am mega644 = portd
es hängen noch D/A A/D und tempsensoren dran.
so problem is jetzt nach einiger zeit hängt sich der Bus auf.
watchdog hat auch nix gebrach (läuft dan gar nicht mehr)
Wie fügt man code ein?
Die Tags für Code sind (Überraschung!) [code ] [/code ] (jeweils ohne Leerzeichen vor dem hinteren Bracket...)
Oder auch ctrl-c im Browser (auf dem Mac zumindest)
Wann hängt sich der Bus auf ?
Im langandauerndem Ruhezustand ?
Das Gegenteil vom Watchdog ist keepaliving, ist z.B. im LAN realisiert ( deshalb blinken die LED´s Deiner Netzwerkkarte zyklisch )
Gruß
Planung ersetzt Zufall durch Irrtum
Gruß aus dem Ruhrgebiet Hartmut
Hallo demlinger!Zitat von demlinger
I²C ist nicht für diese Länge gedacht. Verwendest du I²C Extender?
- http://www.alldatasheet.com/view.jsp?Searchword=P82B715
- http://www.alldatasheet.com/view.jsp?Searchword=P82B96
mfg
Gerold
:-)
PS: Du verwendest Software-I²C statt das in den Controller eingebaute TWI. Probiere es mal mit
Code:'TWI (I²C) $lib "i2c_twi.lbx" 'Hardware TWI einschalten 'Config Scl = Portc.5 'Config Sda = Portc.4 Config Twi = 100000 I2cinit
PS2: ``Waitms 1`` nach I²C-Schreiboptionen des Masters ist meist zu wenig. Erhöhe zum Testen mal auf ``Waitms 5`` oder sogar auf ``Waitms 10``.
PS3: Nach einer Lese- oder Schreibaktion des Masters steht in der Variable "err" ob dabei ein Fehler aufgetreten ist. Du könntest diese Variable auswerten und dementsprechend eine Fehlermeldung auf dem Display ausgeben. Dann weißt du wer oder was den Fehler verursacht. -- Aber ich denke mal, dass du mit ``waitms 1`` einfach zu wenig lang wartest. Bei meinen Tests mit I²C-EEPROMs wurde das System erst bei ``waitms 5`` stabil. Siehe: https://www.roboternetz.de/phpBB2/vi...=360112#360112
.
Wie hast du den WatchDog eingebaut? Beim 644 musste ich am Anfang des Programmes innerhalb 4 Taktzyklen den Watchdog deaktiveren, sonst hat er gleich wieder angeschlagen.
So fängt mein Programm an:
wobei das letzte Stop Watchdog noch ein Überbleibsel aus ersten Versuchen ist. Kurz vor der Hauptschleife starte ich den Watchdog wieder und in der Hauptschleife wird er regelmäßig zurückgesetzt.Code:$asm Wdt_off: ; Turn off global interrupt cli ; Reset Watchdog Timer wdr ; Clear WDRF in MCUSR in r16, MCUSR andi r16, wdrf;(0xff & (WDRF)) Out Mcusr , R16 ; Write logical one to WDCE and WDE ; Keep old prescaler setting to prevent unintentional time-out in r16, WDTCSR ori r16,wdce; (1<<WDCE) | (1<<WDE) Out Wdtcsr , R16 ; Turn off WDT ldi r16,wde; (0<<WDE) Out Wdtcsr , R16 $end Asm $regfile = "m644def.dat" $crystal = 16000000 $loadersize = 2048 Stop Watchdog Config Watchdog = 2048
Den Code habe ich aus dem Datenblatt des m644.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
schon mal thx @ all
@Hessibaby
hab den fehler schon ziehmlich auf die aktoren begrentzt der der das Licht Steuert hängt sich teilweiße nach dem audführen des EIN befehls auf und bleibt dann auf 1 (solte aber nur für eine zeit <1sec 1 sein hab Stromstoßschalter ) und blokiert den Bus
@python_rocks
es sind eigentlich nur zwei lange leitungen die von der steuereinheit weggehen je ca. 4-5 m muss ich dann beide mit den extendern P82B715 versehen?
also insgesamt dann 4 extender das mit den waitms werd ich mal ausprobieren
der bus ist auch noch ziehmlich ungenau bei der temperatur springt die zahl immer 2 Grad hin und her
da smit dem fehlerprotokoll such ich schon lange hab aber nie irgend einen verwendbaren code gefunden
port c ist voll mit dem display I2C muss also software sein
@peterfido
also muss ich den watchdog auch in jeder anderen schleife starten und vor dem loop reseten oder ?
Hallo demlinger!Zitat von demlinger
Du schreibst von *zwei* Leitungen. I²C braucht aber *drei* Leitungen. SCL, SDA und **GND**.
4-5 m ist ziemlich viel. Wenn man bedenkt, dass I²C ursprünglich nur für die geräteinterne Verbindung von ICs gedacht war, würde ich ab ein paar Meter dringende dazu raten, vor jedes weiter entfernte I²C-Gerät einen P82B96 zu schalten. Das sagt mir zumindest mein Gefühl. Belege dafür habe ich keine. Die Leitungen sollten auch miteinander verdrillt sein. Ein geschirmtes CAT.5 Netzwerkkabel (SFTP) wäre ideal.
Nähere Informationen stehen im Datenblatt: http://www.alldatasheet.com/datashee...PS/P82B96.html
Und was die ERR-Variable betrifft. Diese Variable brauchst du nicht extra definieren. Diese kannst du direkt nach dem I2CSTOP z.B. mit PRINT ausgeben lassen. Wenn ERR nicht 0 ist, dann ist ein Fehler aufgetreten.
mfg
Gerold
:-)
@Hessibaby
hab den fehler schon ziehmlich auf die aktoren begrentzt der der das Licht Steuert hängt sich teilweiße nach dem audführen des EIN befehls auf und bleibt dann auf 1 (solte aber nur für eine zeit <1sec 1 sein hab Stromstoßschalter ) und blokiert den Bus
Schaltest Du ein Relais ?
Wenn ja, welche Stromaufnahme hat das, und wie tief bricht die Spannung ein ?
Löte mal versuchsweise einen Elko mit 470µF parallel zur Spannungsversorgung am Aktormodul ein, denn wahrscheinlich bricht die Spannung bein Relaiseinschalten so weit zusammen, das der µC sich aufhängt.
Gruß
Planung ersetzt Zufall durch Irrtum
Gruß aus dem Ruhrgebiet Hartmut
Wenn der Watchdog einmal gestartet ist, dann muss er nur innerhalb seiner Ansprechzeit zurückgesetzt werden, damit er keinen Reset auslöst. Dieses mache ich normal innerhalb der Hauptschleife, denn diese sollte recht häufig durchlaufen werden. Vorsicht ist bei Befehlen wie input und wait angesagt, denn diese halten das Programm evtl länger an, als der Watchdog wartet.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Lesezeichen