katzenschreck continued..

wie es das schicksal so will, war natürlich alles mögliche kaputt an meinem fernlenkauto: 2 transistoren der motorbrücke hatten die 8V attacke nicht überstanden, und das empfangsteil (evtl. oben erwähnter superchip) hatten bleibenden schaden erlitten.

auf fernsteuerung musste also verzichtet werden, aber es gelang mir nach einigen tagen planlosen herumlötens, die motorbrücke durch austausch 2er transistoren (standard-typen) wieder in gang zu bekommen. der atmega hatte wie durch ein wunder alles schadlos überstanden. echt robust die dinger.

nun wurde also eine IR-diode über einen weiteren transistor (samt vorwiderstand) am OC1A angeschlossen, die mittels timer mit 32kHz getaktet wird. dazu kam ein "TSOP-1733" IR-empfänger, dessen ausgang an ADC0 hängt.

tests ergaben völlig unbrauchbare werte, bis ich, wie im datenblatt erwähnt, einen 4,7µF elko parallel zur versorgung hinzufügte.

sensor und diode wurden nun mehr schlecht als recht an der front des fahrzeugs befestigt, und nach einigen bemühungen war es soweit:

wenn man eine hand vor das fahrzeug hielt, kehrte es die fahrtrichtung für 1 sekunde um, und das dickie sollte damit theoretisch hindernissen ausweichen können. genau so war es ja gedacht.

praktisch ergab sich leider, dass das ding viel zu schnell ist, und erst einmal voll in das hindernis reindonnert, bevor es merkt, dass es wo angestossen ist.

damit nicht genug, reflektieren schwarze flächen (meine möbel sind nun mal schwarz) das IR signal nicht, sondern absorbieren es. das heisst das dickie kracht gegen die wand, bemerkt nichts davon, und versucht weiterhin vorwärts zu fahren.

man kann also sagen, dass dieses projekt theoretisch prima funktioniert hat, in der praxis aber völlig untauglich ist. (ich denke nicht daran, alle meine möbelstücke in bodennähe mit reflektorstreifen zu versehen.)

vielleicht hat jmd. eine idee, wie man diese probleme lösen kann? ich dachte als nächstes an "bumper" (also schalter, die beim "wo dagegenbrettern" ausgelöst werden) oder daran, den motorstrom zu messen (motorstrom hoch -> hindernis -> rückwärts fahren).

sonderlich elegant ist das zwar nicht, aber meine anforderung ist ja nur, dass das fahrzeug weiterfährt.

bevor jetzt jmd "ultraschall" ruft: das mag meine katze nicht.

hier noch der ASM code:
Code:
   .NOLIST                
   .INCLUDE <m8def.inc> 
   .LIST                    

   ; MCU Takt für diverse Berechnungen festlegen 
   .equ      tosc      = 1000000       

   ; Ausgabefreq festlegen 
   .equ      fout      = 33000 
    
   ; Timer 1 Ladewert 
   .equ      ladewert    = (tosc / (2 * fout)) - 1 

   .def temp = r20 
   .def Ergebnis1 = r21 
   .def Ergebnis2 = r22 

   .CSEG                    
   .org 0 

   ; Interupt Vektoren 
   rjmp    init             ; Reset Handler 
   reti                   ; IRQ0 Handler 
   reti                   ; IRQ1 Handler 
   reti                   ; Timer2 Compare Handler 
   reti                   ; Timer2 Overflow Handler 
   reti                   ; Timer1 Capture Handler 
   reti                   ; Timer1 CompareA Handler 
   reti                   ; Timer1 CompareB Handler 
   reti                   ; Timer1 Overflow Handler 
   reti                   ; Timer0 Overflow Handler 
   reti                   ; SPI Transfer Complete Handler 
   reti                   ; USART RX Complete Handler 
   reti                   ; UDR Empty Handler 
   reti                   ; USART TX Complete Handler 
   rjmp ADCfertig         ; ADC Conversion Complete Handler 
   reti                   ; EEPROM Ready Handler 
   reti                   ; Analog Comparator Handler 
   reti                   ; Two-wire Serial Interface Handler 
   reti                   ; Store Program Memory Ready Handler

init: 
;Stackpointer 
   ldi temp, LOW(RAMEND) 
   out SPL, temp 
   ldi temp, HIGH(RAMEND) 
   out SPH, temp 
;Aus/Eingänge 
   clr temp 
   out DDRC, temp                  ; Eingang 
   ser temp 
   out DDRB, temp                  ; Ausgang 
   out DDRD, temp                  ; Ausgang 

   ldi    r17,   (1<<COM1A0)   ; Timer 1 konfigurieren (Mode 4 -> CTC) 
   ldi    r16,   (1<<WGM12)|(1<<CS10) 
   out    TCCR1A,   r17 
   out    TCCR1B,   r16 

   ldi    r16,   high(ladewert) 
   out    OCR1AH,r16 
   ldi    r16,   low(ladewert) 
   out    OCR1AL,r16 

;Interrupts aktivieren 
   sei                           ; Generelle Interruptfreigabe 

Main: 
   ldi temp, (1<<ADLAR)   ; Vref=5V ; Linksbündig in Register geschrieben (ADLAR=1) ; ADC Eingang = ADC0 (MUX4-0...00000) 
   out ADMUX, temp
   ldi temp, (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (5<<ADPS0) 
   out ADCSRA, temp 

   rcall Warten 
   mov Ergebnis1, temp 

   cpi Ergebnis1, 64
   brlo backward 

; forward, pd 5+7

   ldi    r24,   160
   out    PORTD,   r24
   ldi    r24,   0
   out    PORTB,   r24

; delay

   ldi      r17,   0x09      ; delay loop, 1Hz 
WGLOOP0:  
   ldi      r18,   0xBC 
WGLOOP1: 
   ldi      r19,   0xC4 
WGLOOP2: 
   dec      r19 
   brne   WGLOOP2 
   dec      r18 
   brne   WGLOOP1 
   dec      r17 
   brne   WGLOOP0 
   nop 

   rjmp Main    

backward: ; pb 0 + pd 6

   ldi      r24,   64
   out      PORTD,   r24
   ldi      r24,   1
   out      PORTB,   r24

; delay

   ldi      r17,   0x09      ; delay loop, 1Hz 
WGLOOP3: 
   ldi      r18,   0xBC 
WGLOOP4: 
   ldi      r19,   0xC4 
WGLOOP5: 
   dec      r19 
   brne WGLOOP5 
   dec      r18 
   brne   WGLOOP4 
   dec      r17 
   brne   WGLOOP3 
   nop 

   rjmp Main

Warten: 
   brie PC+2 
   reti 
   rjmp Warten

ADCfertig: 
   in temp, ADCH
   ret
gruesse von der katz