Hallo, wollte mir eine Lichtschranke mit TSOP1733 bauen, doch leider
funktioniert sie ziemlich unregelmäßig:
mal werden Gegenstände erkannt die durchgehn und mal nicht.
Hier ist der Code:
Wo liegt das Problem?
1
.include "m8def.inc"
2
3
.def temp = r16
4
5
6
rjmp start ; Reset Handler
7
rjmp interrupt1 ; IRQ0 Handler
8
reti ;rjmp EXT_INT1 ; IRQ1 Handler
9
reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
10
reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
11
reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
12
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
13
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
14
reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
15
rjmp interrupt ; Timer0 Overflow Handler
16
reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
17
reti ;rjmp USART_RXC ; USART RX Complete Handler
18
reti ;rjmp USART_UDRE ; UDR Empty Handler
19
reti ;rjmp USART_TXC ; USART TX Complete Handler
20
reti ;rjmp ADC ; ADC Conversion Complete Handler
21
reti ;rjmp EE_RDY ; EEPROM Ready Handler
22
reti ;rjmp ANA_COMP ; Analog Comparator Handler
23
reti ;rjmp TWSI ; Two-wire Serial Interface Handler
24
reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler
Achso, den ISR für den Timer0 habe ich jetzt weggelassen, aber daran
kann es ja normalerweise ja nicht liegen, weil er manchmal da hin kommt
und manchmal nicht.
Das kann am TSOP1733 selbst liegen. Diese Fernbedienungsempfänger sind
für Dauersignal nur bedingt geeignet. Vielleicht empfiehlt es sich, den
Sender zusätzlich zur 33 kHz-Modulation ein und aus zu schalten, um
Pseudodaten zu senden.
Naja über in dem Hauptprogramm schalte ich ja den Timer 1 immer an und
aus, mit Timer0 wird das ganze dannn überwacht (wenn überlauf, dann wird
im ISR des Timers die bestimmte Aktion ausgeführt. Über INT0 wird dann
der Timer0 immer gelöscht, wenn er nicht mehr gelöscht wird, dann ist ja
logischerweise die Lichtschranke unterbrochen und die Aktion wird
ausgeführt.
Hallo, habe das Programm mal umgebaut, sodass es nur mit Timer
funktioniert. Prinzip ist folgendes:
Timer1 erzeugt das 33 khz Signal für den TSOP. Damit das Signal mit
einer Frequenz von ca. 600Hz kommt schalte ich den Timer1 mit dem Timer2
immerwieder an und aus. Timer0 überwacht das ganze: Er zählt die ganze
Zeit und wird vom INTO gelöscht, da ja bei jeder Änderung am PIN ein
Interrupt ausgelöst wird(-> die passiert ja immer wenn der Timer1
ein-und ausgeschaltet wird). wird der Timer0 nicht geklöscht, tritt der
Überlauf auf und somit wird dann im ISR die Aktion durchgeführt, weil
die Lichtschranke unterbrochen wurde. ISR von Timer0 habe ich jetzt
rausgelassen, aber dort springt er jetzt immer sofort rein.
Woran liegt das?
1
.include "m8def.inc"
2
3
.def temp = r16
4
.def temp1 = r20
5
.def temp2 = r21
6
7
rjmp start ; Reset Handler
8
rjmp interrupt1 ; IRQ0 Handler
9
reti ;rjmp EXT_INT1 ; IRQ1 Handler
10
rjmp interrupt2 ; Timer2 Compare Handler
11
reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
12
reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
13
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
14
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
15
reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
16
rjmp interrupt ; Timer0 Overflow Handler
17
reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
18
reti ;rjmp USART_RXC ; USART RX Complete Handler
19
reti ;rjmp USART_UDRE ; UDR Empty Handler
20
reti ;rjmp USART_TXC ; USART TX Complete Handler
21
reti ;rjmp ADC ; ADC Conversion Complete Handler
22
reti ;rjmp EE_RDY ; EEPROM Ready Handler
23
reti ;rjmp ANA_COMP ; Analog Comparator Handler
24
reti ;rjmp TWSI ; Two-wire Serial Interface Handler
25
reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler