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