PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : großes Projekt Großes PROBLEM Gebäudesteuerung



demlinger
17.03.2008, 21:10
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)

demlinger
17.03.2008, 21:15
Wie fügt man code ein?

stefan_Z
18.03.2008, 02:06
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)

Hessibaby
18.03.2008, 08:14
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ß

python_rocks
18.03.2008, 08:52
die i²c leitungen haben eine gesammtlänge von ca 15 m 2,5kOhm abschluss
Hallo 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

'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/viewtopic.php?p=360112#360112

.

peterfido
18.03.2008, 17:10
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:


$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



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.

Den Code habe ich aus dem Datenblatt des m644.

demlinger
18.03.2008, 22:08
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 ?

python_rocks
19.03.2008, 10:01
@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
[...]
da smit dem fehlerprotokoll such ich schon lange hab aber nie irgend einen verwendbaren code gefunden
Hallo 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/datasheet-pdf/pdf/82015/PHILIPS/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
19.03.2008, 10:41
@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ß

peterfido
19.03.2008, 16:27
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.

demlinger
19.03.2008, 17:14
@python_rocks
sry ich meine kabel also 2 mal die gesammte verbindung
ich verwende CAT 6E kabel

wegen ERR
also
i2cstart
i2cwrite (adresse)
i2cread (irgendwelche daten)
i2cstop (Fehlercode?)
oder nach dem stop also
i2cread (Fehlercode?)


@Hessibaby
ja ich schalte über transitoren erst kleine relais die dan auf die Stromstoßschalter gehen
hab schon mal die 12V für die relais abgeklemmt der fehler bleibt
die stromstoßschalter haben eine ander versorgung 24VAC

python_rocks
19.03.2008, 18:26
wegen ERR
Hallo demlinger!

Wie in diesen Beispielen: https://www.roboternetz.de/wissen/index.php/Bascom_I2C_Master

mfg
Gerold
:-)