Forum: Mikrocontroller und Digitale Elektronik TSOP1733 Lichtschranke unregelmäßig


von Dieter (Gast)


Lesenswert?

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
25
26
27
start:
28
    ldi     temp, LOW(RAMEND)                ; Stackpointer initialisieren
29
     out     SPL, temp
30
     ldi     temp, HIGH(RAMEND)
31
    out     SPH, temp
32
  
33
  ldi    temp, 0xFF                  ; PortB Ausgang
34
  out    DDRB, temp
35
36
    ldi   temp, 0x00                  ; PortD Eingang
37
    out   DDRD, temp
38
39
  ldi   temp,  (0 << ISC01)| (1 << ISC00)       ; INT0 konfigurieren
40
  out   MCUCR, temp
41
  
42
  ldi     temp,high(0x00)                ; Compare-Wert für Timer1               
43
    out     ocr1AH, temp
44
  ldi     temp,low(0x79)
45
     out     ocr1AL,temp 
46
  
47
  ldi   temp, (1<<com1A0)
48
    out   TCCR1A,temp
49
50
  ldi    temp, 0xCB                  ; Compare-Wert für Timer2
51
  out    OCR2, temp
52
    
53
  ldi     temp, 0b00000001                  ; Interrupt bei Timer0 Overflow
54
    out     TIMSK, temp
55
  
56
  ldi   temp, 0b01000000                ; INT0 aktivieren
57
     out   GICR, temp
58
59
    ldi     temp, 0b00000011              ; Vorteiler: Timer0
60
    out     TCCR0, temp
61
  
62
  sei
63
64
loop:
65
  
66
  ldi     temp,(1<<wgm12|0<<cs12|0<<cs11|1<<cs10)    ; Vorteiler Timer1
67
     out     tccr1B,temp
68
69
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
70
          ldi  R17, $0B
71
WGLOOP90:  ldi  R18, $CD
72
WGLOOP91:  dec  R18
73
          brne WGLOOP91
74
          dec  R17
75
          brne WGLOOP90
76
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
77
     ldi     temp,(1<<wgm12|0<<cs12|0<<cs11|0<<cs10)    ; Vorteiler Timer1 (ausschalten)
78
     out     tccr1B,temp
79
80
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
81
          ldi  R17, $0B
82
WGLOOP92:  ldi  R18, $CD
83
WGLOOP93:  dec  R18
84
          brne WGLOOP93
85
          dec  R17
86
          brne WGLOOP92
87
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
88
  rjmp   loop
89
90
91
interrupt1:
92
93
  ldi    temp, 0x00
94
  out    TCNT0, temp
95
  reti

von Dieter (Gast)


Lesenswert?

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.

von Sebastian (Gast)


Lesenswert?

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.

von Dieter (Gast)


Lesenswert?

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.

von Dieter (Gast)


Lesenswert?

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
26
27
28
start:
29
    ldi     temp, LOW(RAMEND)                ; Stackpointer initialisieren
30
     out     SPL, temp
31
     ldi     temp, HIGH(RAMEND)
32
    out     SPH, temp
33
  
34
  ldi    temp, 0xFF                  ; PortB Ausgang
35
  out    DDRB, temp
36
37
    ldi   temp, 0x00                  ; PortD Eingang
38
    out   DDRD, temp
39
40
  ldi   temp,  (0 << ISC01)| (1 << ISC00)       ; INT0 konfigurieren
41
  out   MCUCR, temp
42
  
43
  ldi     temp,high(0x00)                ; Compare-Wert für Timer1               
44
    out     ocr1AH, temp
45
  ldi     temp,low(0x79)
46
     out     ocr1AL,temp 
47
48
  ldi     temp1,(1<<wgm12|0<<cs12|0<<cs11|1<<cs10)    ; Vorteiler Timer1
49
50
  ldi   temp, (1<<com1A0)
51
    out   TCCR1A,temp
52
53
  ldi    temp, 0x82                  ; Compare-Wert für Timer2
54
  out    OCR2, temp
55
56
  ldi     temp,(0<<com20|1<<wgm21|1<<cs22|0<<cs21|0<<cs20) ;Timer2 starten (Tonausgabe)  
57
     out     tccr2,temp    
58
      
59
  ldi     temp, (1<<OCIE2 |1<<TOIE0)              ; Interrupt bei Timer1&2 Overflow
60
    out     TIMSK, temp
61
  
62
  ldi   temp, 0b01000000                ; INT0 aktivieren
63
     out   GICR, temp
64
65
    ldi     temp, (0<<cs02 | 1<<cs01 | 1<<cs00)              ; Vorteiler: Timer0
66
    out     TCCR0, temp
67
  
68
  sei
69
70
loop:
71
72
  rjmp   loop
73
74
interrupt2:
75
76
  eor    temp2, temp1
77
     out     tccr1B,temp2  
78
  reti
79
80
interrupt1:
81
82
  ldi    temp, 0x00
83
  out    TCNT0, temp
84
  reti
Achso, der Mega läuft mir 8 MHz.

mfg

von Dieter (Gast)


Lesenswert?

1
 ldi     temp, (1<<OCIE2 |1<<TOIE0)              ; Interrupt bei Timer0&2 Overflow
2
    out     TIMSK, temp
So muss es heisen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.