Hallo Grave80
ich hab mahl was zusammen gebastelt.
grussCode://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 */
Henk







Zitieren

Lesezeichen