TechMo
17.09.2012, 12:47
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:
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
Der untere Teil ist nicht kommentiert, da er funktioniert.
Wenn jemand einen Fehler findet, wäre ich ihm schwer dankbar.
Danke im Vorraus
Mit freundlichen Grüßen
TechMo
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:
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
Der untere Teil ist nicht kommentiert, da er funktioniert.
Wenn jemand einen Fehler findet, wäre ich ihm schwer dankbar.
Danke im Vorraus
Mit freundlichen Grüßen
TechMo