Dr.Nokill
30.10.2004, 18:13
Habe da ein Problem, der Atmel hängt sich bei der RC5 Routine scheinbar immer auf. Er Läuft jedenfalls nicht mehr zum Schleifenanfang. Mit einem ATMEGA8515 (auf 8515 kompatibilität gesetzt) läufts...
Empfänger ist in beiden fällen ein TSOP1736
$regfile = "2313def.dat"
$crystal = 4000000
CONFIG PinB.2 = OUTPUT
CONFIG RC5 = PortD.6
DIM Wert AS WORD
DIM Eichwert1 AS WORD
DIM Eichwert2 AS WORD
DIM Eichwert3 AS WORD
DIM Eichwert4 AS WORD
DIM Merker AS WORD
DIM Adresse AS Byte
DIM Kommando AS Byte
CONST Solladresse = 20
CONST Einschalten = 129
CONST Ausschalten = 128
Eichwert1 = GETRC(PinB , 3)
Wait 3
Eichwert2 = GETRC(PinB , 3)
Wait 2
Eichwert3 = GETRC(PinB , 3)
Wait 3
Eichwert4 = GETRC(PinB , 3)
SELECT CASE Eichwert1
CASE IS < 15 :
Eichwert1 = Eichwert1 + Eichwert2
Eichwert1 = Eichwert1 + Eichwert3
Eichwert1 = Eichwert1 + Eichwert4
Eichwert1 = Eichwert1 / 4 ' Mittelwert
Eichwert2 = Eichwert1 - 2
Eichwert3 = Eichwert1 + 2
CASE ELSE :
Eichwert1 = Eichwert1 / 4
Eichwert2 = Eichwert2 / 4
Eichwert3 = Eichwert3 / 4
Eichwert4 = Eichwert4 / 4
Eichwert1 = Eichwert1 + Eichwert2
Eichwert1 = Eichwert1 + Eichwert3
Eichwert1 = Eichwert1 + Eichwert4 ' Mittelwert
Eichwert2 = Eichwert1
SHIFT Eichwert2 , RIGHT , 6 ' /16
Eichwert2 = Eichwert1 - Eichwert2 '-1/16
Eichwert3 = Eichwert1 + Eichwert2 '+1/16
END SELECT
Merker = 0
DO
Wert = GETRC(PinB , 3)
WAITms 250
IF Wert < Eichwert1 THEN
IF Merker = 0 THEN
TOGGLE PortB.2
Merker = 1
ENDIF
ELSEIF Wert > Eichwert1 THEN
IF Merker = 0 THEN
TOGGLE PortB.2
Merker = 1
ENDIF
ELSE
Merker = 0
ENDIF
TOGGLE PortB.2
WAIT 2
TOGGLE PortB.2
GETRC5(Adresse , Kommando)
IF Adresse = 20 THEN
SELECT CASE Kommando
CASE 129:
SET PortB.2
CASE 128:
RESET PortB.2
END SELECT
ENDIF
WAITMS 250
LOOP
END
Empfänger ist in beiden fällen ein TSOP1736
$regfile = "2313def.dat"
$crystal = 4000000
CONFIG PinB.2 = OUTPUT
CONFIG RC5 = PortD.6
DIM Wert AS WORD
DIM Eichwert1 AS WORD
DIM Eichwert2 AS WORD
DIM Eichwert3 AS WORD
DIM Eichwert4 AS WORD
DIM Merker AS WORD
DIM Adresse AS Byte
DIM Kommando AS Byte
CONST Solladresse = 20
CONST Einschalten = 129
CONST Ausschalten = 128
Eichwert1 = GETRC(PinB , 3)
Wait 3
Eichwert2 = GETRC(PinB , 3)
Wait 2
Eichwert3 = GETRC(PinB , 3)
Wait 3
Eichwert4 = GETRC(PinB , 3)
SELECT CASE Eichwert1
CASE IS < 15 :
Eichwert1 = Eichwert1 + Eichwert2
Eichwert1 = Eichwert1 + Eichwert3
Eichwert1 = Eichwert1 + Eichwert4
Eichwert1 = Eichwert1 / 4 ' Mittelwert
Eichwert2 = Eichwert1 - 2
Eichwert3 = Eichwert1 + 2
CASE ELSE :
Eichwert1 = Eichwert1 / 4
Eichwert2 = Eichwert2 / 4
Eichwert3 = Eichwert3 / 4
Eichwert4 = Eichwert4 / 4
Eichwert1 = Eichwert1 + Eichwert2
Eichwert1 = Eichwert1 + Eichwert3
Eichwert1 = Eichwert1 + Eichwert4 ' Mittelwert
Eichwert2 = Eichwert1
SHIFT Eichwert2 , RIGHT , 6 ' /16
Eichwert2 = Eichwert1 - Eichwert2 '-1/16
Eichwert3 = Eichwert1 + Eichwert2 '+1/16
END SELECT
Merker = 0
DO
Wert = GETRC(PinB , 3)
WAITms 250
IF Wert < Eichwert1 THEN
IF Merker = 0 THEN
TOGGLE PortB.2
Merker = 1
ENDIF
ELSEIF Wert > Eichwert1 THEN
IF Merker = 0 THEN
TOGGLE PortB.2
Merker = 1
ENDIF
ELSE
Merker = 0
ENDIF
TOGGLE PortB.2
WAIT 2
TOGGLE PortB.2
GETRC5(Adresse , Kommando)
IF Adresse = 20 THEN
SELECT CASE Kommando
CASE 129:
SET PortB.2
CASE 128:
RESET PortB.2
END SELECT
ENDIF
WAITMS 250
LOOP
END