Code://Besseres Programm #include "asuro.h" void vorwaerts() { //Motor links auf vorwärts PORTD |=(1<<PD5); PORTD &=~(1<<PD4); //Motor rechts auf vorwärts PORTB |=(1<<PB5); PORTB &=~(1<<PB4); } void rueckwaerts() { //Motor links auf rueckwaerts PORTD |=(1<<PD4); PORTD &=~(1<<PD5); //Motor rechts auf rueckwaerts PORTB |=(1<<PB4); PORTB &=~(1<<PB5); } void bremsen() { //Motor links bremsen (den Motor kurzschliessen) PORTD &=~(1<<PD4); PORTD &=~(1<<PD5); //Motor links bremsen (den Motor kurzschliessen) PORTB &=~(1<<PB4); PORTB &=~(1<<PB5); } void leerlauf() { //Motor kein Transistor öffnet PORTD |=(1<<PD4); //T1 geschlossen PORTD |=(1<<PD5); //T3 geschlosen OCR1A=0; //T2 und T4 geschlossen //Motor rechts auf leerlauf PORTB |=(1<<PB4); //T1 geschlossen PORTB |=(1<<PB5); //T3 geschlosen OCR1B=0; //T2 und T4 geschlossen } void schneller() { //Wichig: 255 ist das Maximum if(OCR1A<=245) OCR1A += 10; else OCR1A=255; if(OCR1B<=245) OCR1B += 10; else OCR1B=255; } void langsamer() { //keinen negativen wert if(OCR1A>=10) OCR1A -= 10; else OCR1A=0; if(OCR1B>=10) OCR1B -= 10; else OCR1B=0; } int main() { Init(); char zeichen; // Motorrichtung einstellen // PD4, PD5 für linken Motor, PB4, PB5 für rechten motor // als erstes die Pins als Ausgang setzten DDRD|=(1<<PD4) | (1<<PD5); DDRB |=(1<<PB4) | (1<<PB5); // PB1 und PB2 sind für die Ansteuerung der H-Brücken zuständig und werden von der PWM erzeugt // Jedoch müssen die Pins erst als Ausgang gesetzt weden. DDRB |= (1<<PB1) | (1<<PB2); //PWM einheit einstellen //Da wir jedes Bit in den Registern TCCR1A und TCCR1B aendern wollen koennen wir hier "=" benutzen und muessen nicht "|=" bzw "&=" benutzen //Wir setzen also nicht nur WGM10, COM1A1, COM1B1 und CS11 sondern löschen auch alle anderen Bits!!! TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1); //PWM phase correct 8-Bit, clear on match when upcounting TCCR1B = (1<<CS11); //nur CS11 etzen alles andere 0, fuer Takt/8 //Startrichtung vorwaerts(); //Startgeschwindigkeit 100 OCR1A=100; OCR1B=100; SerWrite("Eingabe:",7); while(1) { SerRead(&zeichen,1,0); switch(zeichen) { case 'V': vorwaerts(); SerWrite("v",1); break; case 'R': rueckwaerts(); SerWrite("r",1); break; case 'S': schneller(); SerWrite("s",1); break; case 'L': langsamer(); SerWrite("l",1); break; case 'B': bremsen(); SerWrite("b",1); break; case 'A': leerlauf(); SerWrite("a",1); break; default: SerWrite("*",1); } } } /* //Beispiele von Studenten DDRB |= 54; //PB1,PB2,PB4,PB5 setzen => alle 4 als Ausgang DDRD |= 48; //PD4,PD5 auf Ausgang TCCR1A |= 161; //TCCR1A/B setzen wie in Vorlesungsfolien angegeben //ist das gleiche wie DDRB |=(1<<PB4) | (1<<PB5) | (1<<PB1) | (1<<PB2); DDRD|=(1<<PD4) | (1<<PD5); // Jedoch ist die schreibweise DDRB |= 54; deutlich unübersichtlicher und Fehleranfällig //Mann kann sich auch Macros definieren um den COde strukturierter zu gestalten / Beispiel: //********* MACROS ********** #define setBit(Byte, BitNo) (Byte |= (1<<BitNo)) // sets the BitNo in Byte #define clrBit(Byte, BitNo) (Byte &= ~(1<<BitNo)) // clears the BitNo in Byte #define chkBit(Byte, BitNo) (Byte & (1<<BitNo)) // true (!=0) , if Bit is set. //Beisüiel aus der AVR Library: // In ./avr/include/avr/sfr_defs.h steht folgendes: #define _BV(bit) (1 << (bit)) // Hier ein Beispiel wie die Motorensteuerung in der Asuro Bibliothek realisiert wird inline void MotorDir ( unsigned char left_dir, unsigned char right_dir) { PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir; PORTB = (PORTB &~ ((1 << PB4) | (1 << PB5))) | right_dir; } //als Eingabe dienen die Makros: #define FWD _BV(PB5) #define RWD _BV(PB4) #define BREAK 0x00 #define FREE _BV(PB4) | _BV(PB5) */
Lesezeichen