Hallo Grave80
ich hab mahl was zusammen gebastelt.
Code:
//NICHT VERGESSEN DIE asuro.c DATEI LEER ZU MACHEN!
//denn die MAKEFILE will asuro.c auch compilieren, und
//weil 'asuro.h' nicht 'included' ist entstehen compilerfehler
//wenn 'asuro.c' leer ist gibts kein fehler und daurt das flashen mahl ganz kurz!
#include <avr/io.h>
int main(void){
//linker motor forwarts/ruckwarts signalen als ausgang schalten
DDRD|=(1<<PD5)|(1<<PD4);
//linker motor forwarts/ruckwarts signalen hoch schalten (inaktief)
PORTD|=(1<<PD5)|(1<<PD4);
//rechter motor forwarts/ruckwarts signalen als ausgang schalten
DDRB|=(1<<PB5)|(1<<PB4);
//rechter motor forwarts/ruckwarts signalen hoch schalten (inactief)
PORTB|=(1<<PB5)|(1<<PB4);
//geschwindigkeits kontrol beider motoren als ausgang schalten
DDRB|=(1<<PB2)|(1<<PB1);
//timer/counter1 prescaler faktor 64 einstellen (nur fur die deutlichkeit bit fur bit programmiert)
TCCR1B&=~(1<<CS12); //CS12 niedrich
TCCR1B|= (1<<CS11); //CS11 hoch
TCCR1B|= (1<<CS10); //CS10 hoch
//ausgang OC1A hoch/niedrich schalten (wie die ausgang auf timer1 reagieren soll)
TCCR1A|=(1<<COM1A1)|(1<<COM1A0);
//ausgang OC1B hoch/niedrich schalten (wie die ausgang auf timer1 reagieren soll)
TCCR1A|=(1<<COM1B1)|(1<<COM1B0);
//timer1 mode 5 selektieren (nur fur die deutlichkeit bit fur bit programmiert)
TCCR1B&=~(1<<WGM13); //WGM13 niedrich
TCCR1B|= (1<<WGM12); //WGM12 hoch
TCCR1A&=~(1<<WGM11); //WGM11 niedrich
TCCR1A|= (1<<WGM10); //WGM10 hoch
//linker motor forwarts
PORTD&=~(1<<PD4);
//rechter motor forwarts
PORTB&=~(1<<PB4);
//linker moter ungefahr ein drittel von maximale geschwindigkeit (0x00 = full speed, 0xFE = am langsahmsten)
OCR1A=0xA0;
//rechter motor ungefahr ein drittel von maximale geschwindigkeit (0x00 = full speed, 0xFE = am langsahmsten)
OCR1B=0xA0;
//UND LOS GEHT'S!!!
//warte hier
while(1);
//verlasse die function (wird niemahl ausgefurt, sonst kompilierer warnung)
return 0;
}
/*
Einige bemerkungen:
- allein bits hoch programmieren ist ganz gefahrlich weil mann nicht da von ausgehen sollte
dass bits die niedrich sein sollten dass schon vorher sind!
Mann weiss nie wie das boot-programm die bits hinterlasst.
Hat mich schon mache stunde gekostet!
- timer1 kent 15 verschiedene modes (mode 5 is gewahlt)
mode 5 lass timer1 hochzahlen von 0 bis 255 und wieder zurck zahlen nach 0 und wieder hoch zahlen, usw.
mode 5:
COM1A0/COM1A1 beide hoch heisst: (OC1A = linker motor geschwindigkeits reglung)
- wenn timer1 hoch zahlt und gleich OCR1A ist wird ausgang OC1A hoch
- wenn timer1 zuruck zahlt und gleich OCR1A ist wird ausgang OC1A niedrich
COM1B0/COM1B1 beide hoch heisst: (OC1B = rechter motor geschwindigkeits reglung)
- wenn timer1 hoch zahlt und gleich OCR1B ist wird ausgang OC1B hoch
- wenn timer1 zuruck zahlt und gleich OCR1B ist wird ausgang OC1B niedrich
Wie hoher die OC1A/OC1B wert je kurzer ist die ausgang OC1A/OC1B hoch und lauft die motor langsamer
Die prescaler ist auf 64 gewahlt dass macht die taktfrequenz vom timer1 gleich:
8MHz (externen oszillator) geteilt durch 64 macht 488Hz aber weil die timer1 hochzahl und zuruck zahlt
bleiben 488Hz/2 = 244Hz ubrich, dass ist die frequenz womit die IC1A/OC1B pinnen pulsieren.
PORTD PD5 PD4
hoch hoch = linker motor beide anschliessungen hochohmig/unterbrochen
hoch niedrich = linker motor vorwarts
niedrich hoch = linker motor zuruckwarts
niedrich niedrich = linker motor beide anschliessungen mit plus verbunden
PORTB PB5 PB4
hoch hoch = rechter motor beide anschliessungen hochohmig/unterbrochen
hoch niedrich = rechter motor vorwarts
niedrich hoch = rechter motor zuruckwarts
niedrich niedrich = rechter motor beide anschliessungen mit plus verbunden
gruss
Arexx-Henk
*/
gruss
Henk
Lesezeichen