komischerweise hatten die defines mit channel 1 also pin0 wunderbar alleine funktioniert.
Naja mein neuer Code is jetzt:
Code:
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/signal.h>
#include <string.h>
#include <compat/deprecated.h>
#include <inttypes.h>
#include <myheader.h>
#define SYSCLK 16000000
void init(void);
// Initialisierung
void init(void)
{
DDRD= (1<<PD4) | (1<<PD5); // PWM Pins als ausgang
DDRC= (1<<PC6) | (1<<PC7); // 6=Motor 1 Kanal 1 7= Motor 1 Kanal 2
DDRB= (1<<PB0) | (1<<PB1); // 0=Motor 2 Kanal 1 1= Motor 2 Kanal 2
TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10);
// 10 Bit Pwm, invertierend
TCCR1B = (1<<CS11) | (1<<CS10); // Prescaler 64
OCR1A=1; // Mindestzeit für PWM1
OCR1B=1; // Mindestzeit für PWM2
}
void warte(unsigned int ms) // Wartet um x ms
{
unsigned int zaehler;
while (ms)
{
zaehler = SYSCLK / 20000;
while (zaehler)
{
asm volatile ("nop");
zaehler--;
}
ms--;
}
}
void R_Motor_r() // Rechter Motor rückwärts
{
sbi(PORTC,6);
cbi(PORTC,7);
}
void R_Motor_v() // Rechter Motor vorwärts
{
sbi(PORTC,7);
cbi(PORTC,6);
}
void R_Motor_s() // Rechter Motor stop
{
cbi(PORTC,7);
cbi(PORTC,6);
}
void L_Motor_r() // Linker Motor rückwärts
{
sbi(PORTB,0);
cbi(PORTB,1);
}
void L_Motor_v() // Linker Motor vorwärts
{
sbi(PORTB,1);
cbi(PORTB,0);
}
void L_Motor_s() // Linker Motor stop
{
cbi(PORTB,1);
cbi(PORTB,0);
}
uint16_t readADC(uint8_t channel) //Funktion um ADC-Wert auszulesen an Pin channel
{
uint8_t i;
uint16_t result = 0;
// Den ADC aktivieren und Teilungsfaktor auf 64 stellen
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
// Kanal des Multiplexers waehlen
ADMUX = channel;
// Interne Referenzspannung verwenden (also 2,56 V)
ADMUX |= (1<<REFS1) | (1<<REFS0);
// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
// Jetzt 3x die analoge Spannung and Kanal channel auslesen
// und dann Durchschnittswert ausrechnen.
for(i=0; i<3; i++) {
// Eine Wandlung
ADCSRA |= (1<<ADSC);
// Auf Ergebnis warten...
while(ADCSRA & (1<<ADSC));
result += ADCW;
}
// ADC wieder deaktivieren
ADCSRA &= ~(1<<ADEN);
result /= 3;
return result;
}
int main(void) // Main-Funktion, d.h. dass was der Roboter macht!
{
init();
warte(2000);
unsigned int r; // ADC-Wert für rechten Sensor
unsigned int l; // ADC-Wert für linken Sensor
for(;;)
{
r = readADC(0); //Auslesen der analogen Spannungen an Pin 0
l = readADC(1); //Auslesen der analogen Spannungen an Pin 1
if (r>0 && r<32) // wenn schwarzer Untergrund
R_Motor_v();
if (r>=32) // wenn weißer Untergrund
R_Motor_r();
if (l>0 && l<32) // wenn schwarzer Untergrund
L_Motor_v();
if (l>=32) // wenn weißer Untergrund
L_Motor_r();
warte(10);
}
return 0;
}
Lesezeichen