Hallo,
Ich bin schier am verzeweifeln..
Habe einen ATMega168 und einen L293B der mit diesem gesteuert wird.
Einfaches Einschalten der Enable-Leitung und einer der Richtungsleitungen führt wie gewünscht zum fahren in die entsprechende Richtung.
Allerdings ist das ganze bei voller Spannung etwas sehr schnell für den Aufgabenbereich (Saugroboter).
Daher wollte ich wie im Motorenartikel hier im RN den L293B per PWM ansteuern und ihn dadurch langsamer fahren lassen.
Dafür benutze ich Ausgang D6(OC0A) und B2(OC1B).
Bei Ausgang B2(16-Bit Timer) funktioniert das ganze auch ganz hervorragend.
Nur Ausgang D6 gibt nichts von sich.
Hier mal das Programm:
Der untere Teil ist nicht kommentiert, da er funktioniert.Code:Reset: ldi temp,LOW(RAMEND) ; Stackpointer initalisieren out SPL,temp ldi temp,HIGH(RAMEND) ; Stackpointer initalisieren out SPH,temp ;B7= Richtung 3 ;B2= Enable1(OC1B) ;B1= LED ldi temp,0b10000110 ; Ausgänge B setzen out DDRB,temp ;D4= Richtung 4 ;D5= Richtung 2 ;D6= Enable2(OC1A) ;D7= Richtung 1 ldi temp,0b11110000 ; Ausgänge D setzen out DDRD,temp ;LED auf 1 (aus) ;Pullup an Schalter(B0) einschalten ldi temp,0b00000011 out PORTB,temp ;Richtung 2 (Bit5) und Richtung 4 (Bit4) auf 1(vorwärtsfahren) ldi temp,0b00110000 ; Alle Ausgänge auf 0 setzen out PORTD,temp /* TCCR0A COM0A1 | COM0A0 | COM0B1 | COM0B0 | - | - | WGM01 | WGM00 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | FASTPWM Clear Normal Port Fast PWM on Compare Match Operation TOP=OCRA */ ldi temp,0b10000011 sts TCCR0A,temp /* TCCR0B FOC0A | FOC0B | - | - | WGM02 | CS02 | CS01 | CS00 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | s.o Clock select ohne Prescaling */ ldi temp,0b00001001 sts TCCR0B,temp ;OCR0A=127 ldi temp,0b01111111 sts OCR0A,temp ldi temp,0b00100011 sts TCCR1A,temp ldi temp,0b00011001 sts TCCR1B,temp ldi temp,0b00000000 sts TCCR1C,temp ldi r17,0b00000000 ldi r16,0b00000000 sts OCR1BH,r17 sts OCR1BL,r16 loop: rjmp loop
Wenn jemand einen Fehler findet, wäre ich ihm schwer dankbar.
Danke im Vorraus
Mit freundlichen Grüßen
TechMo







Zitieren

Lesezeichen