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
Lesezeichen