21

Montag, 21. Dezember 2009, 12:58

Hallo Rolf,

die 302-Warnung kommt immer, wenn man auf ein Register in einer anderen Bank zugreift. Der Assembler analysiert den Code-Abschnitt nicht darauf, ob da vorher irgendwann mal das Bank-Select Bit gesetzt wurde. Ich schalte diese Warnmeldung ggf. in Abschnitten, wo das RP0-Bit gesetzt ist, aus, z.B. so:

Quellcode

1
2
3
4
5
6
        bsf	STATUS,RP0	;select bank 1
 errorlevel -302		
        movlw	B'111101'	
        movwf	TRISC		;RC1 = output 
        bcf	STATUS,RP0	;bank 0
 errorlevel +302


Grüße,

Thomas

ro.heg

RCLine User

  • »ro.heg« ist der Autor dieses Themas

Wohnort: Quickborn

  • Nachricht senden

22

Mittwoch, 6. Januar 2010, 09:09

Hallo Thomas,
mein Krahnprogramm gibt mir ab und zu Probleme auf. Meist habe ich es
einfach ignoriert, aber jetzt zu dieser Jahreszeit, wo kein Modell in den
Himmel fliegt, will ich mich in die Software hinein vertiefen.
Fakt ist: tagelang läuft alles wunderbar. Und dann, meißt zu Beginn vor
den Pausen (call pause) steigt es aus. Ich muß schnell die Versorgung
wegnehmen, damit der Krahn mit seinen Endlagen-Schaltern nicht Schaden
erleitet.
Nach erneuter Zuschaltung von Ubatt bleibt alles in Ruhe.
Der Krahn wird über ULN2803 und 5 Relais angesteuert, die ich aber
auch über Tasten betätigen kann, um den Krahn in seine Anfangsposition
zu bringen. Das darf ich aber jetzt nicht machen, der Pic will sofort loslegen,
ohne das ich die Starttaste betätige.
Ich werde das Gefühl nicht los, daß im Ablauf der Initialisierung etwas nicht
stimmt. Habe Dein servostop.asm vor mir und entdecke den Befehl
clrwdt, h.d. das W-Register wird zu 0 gesetzt?
In einem Buch wurde auf clrf INTCON hingewiesen
Als Versorgung dienen 3x Lipos, und 78S05 mit 10yF Tantal, also daran kanns
nicht liegen


Als Anlage: pic16fkrahn_03.zip


Viel Grüße

Rolf
»ro.heg« hat folgende Datei angehängt:

23

Mittwoch, 6. Januar 2010, 14:42

Hallo Rolf,

an der Software kann ich nicht wirklich ein Problem erkennen.
Der Befehl "clrwdt" hat nichts mit dem W-Register zu tun, sondern setzt den Watchdog-Timer zurück ("Clear WatchDog Timer"). Sollte hier aber keine Auswirkungen haben, da der WDT in der Configuration ausgeschaltet wurde ("_WDT_OFF").
Kannst ja mal testweise einen "clrwdt"-Befehl an den Anfang des Programms setzen (bei "reset"), aber ich denke nicht, daß sich dadurch etwas ändert.

Wie ist der "MCLR"-Pin (Pin 4) beschaltet?

INTCON sollte auch kein Problem machen, da es beim Reset automatisch auf 0 gesetzt wird.

Zum Abblocken der Versorgungsspannung: hast Du nur einen 10µ Tantal da eingebaut, oder zusätzlich noch keramische Cs? Grundsätzlich sollte über den Versorgungs-Pins (hier: 5,14) ein 100nF Keramik-Kondensator liegen, möglichst direkt am Chip, ohne lange Zuleitungen.

Verbesserungs-Vorschläge (ob das Problem damit zusammenhängt, ist aber reine Spekulation):
"Brown Out Detection" sollte eingeschaltet werden. So wird bei evtl. Spannungseinbrüchen zuverlässig ein ordnungsgemäßer Reset durchgeführt. Also:
__config _BODEN_ON statt _BODEN_OFF

Den Befehl "clrf PORTB" würde ich vor dem Umschalten des Ports auf Ausgang platzieren, d.h. hier am Besten vor dem Befehl "bsf STATUS,RP0". Der Inhalt des PORTB-Registers ist nach dem Einschalten nämlich undefiniert, und im ungünstigsten Fall (alle auf "1") ziehen alle Relais für ein paar Mikrosekunden an, wenn der Port B auf Ausgang geschaltet wird, bis der "clrf PORTB"-Befehl ausgeführt wird. Das ist zwar eigentlich zu kurz, um irgendetwas auszulösen, aber unschön ist es trotzdem. Vielleicht summieren sich die Induktions-Störspitzen aller Relais hierbei, so daß der Prozessor aussteigt?

Apropos Induktion: ich nehme an, Du hast den Pin 10 vom ULN2803 richtig angeschlossen?
Wie siehts mit den Induktiven Lasten aus, die durch die Relais geschaltet werden? Müsste hier evtl. noch was entstört werden (Freilaufdioden!)?

Viele Grüße,

Thomas

ro.heg

RCLine User

  • »ro.heg« ist der Autor dieses Themas

Wohnort: Quickborn

  • Nachricht senden

24

Donnerstag, 7. Januar 2010, 10:28

Hallo Thomas,
danke für Deine ausführlichen Hinweise!
Folgende Änderungen werde ich heute ausführen:

1. 100 nF an Pin 5/14
2. BODEN_OFF auf BODEN_ON stellen
3. clrf PORTB vor bsf STATUS.RP0 setzen

4. Pin 10 vom ULN2803 hängt wahrhaftig in der Luft, oh weia!!
(an Freilaufdioden hatte ich gedacht)

MCLR Pin 4 liegt über 10K an +5 Volt

Viele Grüße

Rolf

25

Donnerstag, 7. Januar 2010, 15:34

Hallo Rolf,

Zitat

Original von ro.heg
4. Pin 10 vom ULN2803 hängt wahrhaftig in der Luft, oh weia!!
(an Freilaufdioden hatte ich gedacht)

Wenn Du externe Freilaufdioden eingebaut hast, sollte das aber auch egal sein!

Grüße,

Thomas