mikrocontroller.net

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


Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
.include   "m8def.inc"

.def   temp  = r16


rjmp start          ; Reset Handler                           
rjmp interrupt1       ; IRQ0 Handler                      
reti ;rjmp EXT_INT1   ; IRQ1 Handler                      
reti ;rjmp TIM2_COMP  ; Timer2 Compare Handler            
reti ;rjmp TIM2_OVF   ; Timer2 Overflow Handler           
reti ;rjmp TIM1_CAPT  ; Timer1 Capture Handler            
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler           
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler           
reti ;rjmp TIM1_OVF   ; Timer1 Overflow Handler           
rjmp interrupt        ; Timer0 Overflow Handler           
reti ;rjmp SPI_STC    ; SPI Transfer Complete Handler     
reti ;rjmp USART_RXC  ; USART RX Complete Handler         
reti ;rjmp USART_UDRE ; UDR Empty Handler                 
reti ;rjmp USART_TXC  ; USART TX Complete Handler         
reti ;rjmp ADC        ; ADC Conversion Complete Handler   
reti ;rjmp EE_RDY     ; EEPROM Ready Handler              
reti ;rjmp ANA_COMP   ; Analog Comparator Handler         
reti ;rjmp TWSI       ; Two-wire Serial Interface Handler 
reti ;rjmp SPM_RDY    ; Store Program Memory Ready Handler


start:
    ldi     temp, LOW(RAMEND)                ; Stackpointer initialisieren
     out     SPL, temp
     ldi     temp, HIGH(RAMEND)
    out     SPH, temp
  
  ldi    temp, 0xFF                  ; PortB Ausgang
  out    DDRB, temp

    ldi   temp, 0x00                  ; PortD Eingang
    out   DDRD, temp

  ldi   temp,  (0 << ISC01)| (1 << ISC00)       ; INT0 konfigurieren
  out   MCUCR, temp
  
  ldi     temp,high(0x00)                ; Compare-Wert für Timer1               
    out     ocr1AH, temp
  ldi     temp,low(0x79)
     out     ocr1AL,temp 
  
  ldi   temp, (1<<com1A0)
    out   TCCR1A,temp

  ldi    temp, 0xCB                  ; Compare-Wert für Timer2
  out    OCR2, temp
    
  ldi     temp, 0b00000001                  ; Interrupt bei Timer0 Overflow
    out     TIMSK, temp
  
  ldi   temp, 0b01000000                ; INT0 aktivieren
     out   GICR, temp

    ldi     temp, 0b00000011              ; Vorteiler: Timer0
    out     TCCR0, temp
  
  sei

loop:
  
  ldi     temp,(1<<wgm12|0<<cs12|0<<cs11|1<<cs10)    ; Vorteiler Timer1
     out     tccr1B,temp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
          ldi  R17, $0B
WGLOOP90:  ldi  R18, $CD
WGLOOP91:  dec  R18
          brne WGLOOP91
          dec  R17
          brne WGLOOP90
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ldi     temp,(1<<wgm12|0<<cs12|0<<cs11|0<<cs10)    ; Vorteiler Timer1 (ausschalten)
     out     tccr1B,temp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          ldi  R17, $0B
WGLOOP92:  ldi  R18, $CD
WGLOOP93:  dec  R18
          brne WGLOOP93
          dec  R17
          brne WGLOOP92
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  rjmp   loop


interrupt1:

  ldi    temp, 0x00
  out    TCNT0, temp
  reti

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
.include   "m8def.inc"

.def   temp  = r16
.def   temp1 = r20
.def   temp2 = r21

rjmp start          ; Reset Handler                           
rjmp interrupt1       ; IRQ0 Handler                      
reti ;rjmp EXT_INT1   ; IRQ1 Handler                      
rjmp interrupt2  ; Timer2 Compare Handler            
reti ;rjmp TIM2_OVF   ; Timer2 Overflow Handler           
reti ;rjmp TIM1_CAPT  ; Timer1 Capture Handler            
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler           
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler           
reti ;rjmp TIM1_OVF   ; Timer1 Overflow Handler           
rjmp interrupt        ; Timer0 Overflow Handler           
reti ;rjmp SPI_STC    ; SPI Transfer Complete Handler     
reti ;rjmp USART_RXC  ; USART RX Complete Handler         
reti ;rjmp USART_UDRE ; UDR Empty Handler                 
reti ;rjmp USART_TXC  ; USART TX Complete Handler         
reti ;rjmp ADC        ; ADC Conversion Complete Handler   
reti ;rjmp EE_RDY     ; EEPROM Ready Handler              
reti ;rjmp ANA_COMP   ; Analog Comparator Handler         
reti ;rjmp TWSI       ; Two-wire Serial Interface Handler 
reti ;rjmp SPM_RDY    ; Store Program Memory Ready Handler


start:
    ldi     temp, LOW(RAMEND)                ; Stackpointer initialisieren
     out     SPL, temp
     ldi     temp, HIGH(RAMEND)
    out     SPH, temp
  
  ldi    temp, 0xFF                  ; PortB Ausgang
  out    DDRB, temp

    ldi   temp, 0x00                  ; PortD Eingang
    out   DDRD, temp

  ldi   temp,  (0 << ISC01)| (1 << ISC00)       ; INT0 konfigurieren
  out   MCUCR, temp
  
  ldi     temp,high(0x00)                ; Compare-Wert für Timer1               
    out     ocr1AH, temp
  ldi     temp,low(0x79)
     out     ocr1AL,temp 

  ldi     temp1,(1<<wgm12|0<<cs12|0<<cs11|1<<cs10)    ; Vorteiler Timer1

  ldi   temp, (1<<com1A0)
    out   TCCR1A,temp

  ldi    temp, 0x82                  ; Compare-Wert für Timer2
  out    OCR2, temp

  ldi     temp,(0<<com20|1<<wgm21|1<<cs22|0<<cs21|0<<cs20) ;Timer2 starten (Tonausgabe)  
     out     tccr2,temp    
      
  ldi     temp, (1<<OCIE2 |1<<TOIE0)              ; Interrupt bei Timer1&2 Overflow
    out     TIMSK, temp
  
  ldi   temp, 0b01000000                ; INT0 aktivieren
     out   GICR, temp

    ldi     temp, (0<<cs02 | 1<<cs01 | 1<<cs00)              ; Vorteiler: Timer0
    out     TCCR0, temp
  
  sei

loop:

  rjmp   loop

interrupt2:

  eor    temp2, temp1
     out     tccr1B,temp2  
  reti

interrupt1:

  ldi    temp, 0x00
  out    TCNT0, temp
  reti
Achso, der Mega läuft mir 8 MHz.

mfg

Autor: Dieter (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.