Tonerzeugung über Toggle-Ausgängen im CTC-Mode
(EN google-translate)
(PL google-translate)
Ausgangspunkt: Scheduler (s.o.). Ergänzung:
//Toggle auf OC1A: TCCR1A &= ~(1<<COM1A1); TCCR1A |= (1<<COM1A0); pinMode(9,OUTPUT);
Code 0-1: Ergänzende Codezeilen, um auf dem digitalen Ausgang 9 (OC1A) die gleiche Frequenz zu haben, wie auf Pin 12 (über Interrupt-Funktion).
Programm insgesamt:
#include<avr/interrupt.h> volatile bool AN=false; volatile bool ZUSTAND=false; //SIGNAL(SIG_OUTPUT_COMPARE1) //ISR(SIG_OUTPUT_COMPARE1) //ISR(TIMER1_COMP_vect) ISR(TIMER1_COMPA_vect) { digitalWrite(12,ZUSTAND); ZUSTAND=!ZUSTAND; } void setup() { // TCCR1B |= (1<<WGM13); //Mode 12 TCCR1B &= ~(1<<WGM13); //Mode 4 TCCR1B |= (1<<WGM12); TCCR1A &= ~(1<<WGM11); TCCR1A &= ~(1<<WGM10); //Vorteilung 1: 16000000Hz TCCR1B &= ~(1<<CS12); TCCR1B &= ~(1<<CS11); TCCR1B |= (1<<CS10); //f = fclk/(2*N*(OCR1A+1)) //OCR1A = (fclk/(f*2*N))-1 //OCR1A = 8000000/440 - 1 == 18181 OCR1A=18181; TIMSK1 |= (1<<OCIE1A); //Mode 4 sei(); //Toggle auf OC1A: TCCR1A &= ~(1<<COM1A1); TCCR1A |= (1<<COM1A0); pinMode(9,OUTPUT); //durch Interrupt gesteuert: pinMode(12,OUTPUT); } void loop() { }
Code 0-2: CTC mit Timer 1 auf digitalem Ausgang 9.
int zustand = 0; //A0 = D18 //A1 = D19 //A2 = D20 //A3 = D21 //A4 = D22 //A5 = D23 //A6 = D24 //A7 = D25 //A8 = D26 //A9 = D27 //A10 = D28 //A11 = D29 void setup() { pinMode(18,OUTPUT); pinMode(19,OUTPUT); //pinMode(3,OUTPUT); //tone(3,710); } void loop() { digitalWrite(18,1); digitalWrite(19,1); delay(800); digitalWrite(18,0); digitalWrite(19,0); delay(800); }
Code 0-3: Testweise Pin A0 und A1 als digitale Ausgänge verwenden.
Basisprogramm - alles inaktiv, LED D13 blinkt
int zustand = 0; //A0 = D18 //A1 = D19 //A2 = D20 //A3 = D21 //A4 = D22 //A5 = D23 //A6 = D24 //A7 = D25 //A8 = D26 //A9 = D27 //A10 = D28 //A11 = D29 void setup() { pinMode(18,INPUT); //A0 pinMode(19,INPUT); //A1 pinMode(20,INPUT); //A2 pinMode(21,INPUT); //A3 pinMode(22,INPUT); //A4 pinMode(23,INPUT); //A5 pinMode(2,INPUT); //D2 pinMode(3,INPUT); //D3 pinMode(4,INPUT); //D4 pinMode(5,INPUT); //D5 pinMode(6,INPUT); //D6 pinMode(7,INPUT); //D7 pinMode(8,INPUT); //D8 pinMode(9,INPUT); //D9 pinMode(13,OUTPUT); //LED } void loop() { digitalWrite(13,1); delay(500); digitalWrite(13,0); delay(500); }
Code 0-4: Basisprogramm - alles inaktiv, LED D13 blinkt
Analoge Werte lesen und auf die serielle Schnittstelle schreiben
int sensorwert=0; //A0 = D18 //A1 = D19 //A2 = D20 //A3 = D21 //A4 = D22 //A5 = D23 //A6 = D24 //A7 = D25 //A8 = D26 //A9 = D27 //A10 = D28 //A11 = D29 void setup() { pinMode(18,INPUT); //A0 pinMode(19,INPUT); //A1 pinMode(20,INPUT); //A2 pinMode(21,INPUT); //A3 pinMode(22,INPUT); //A4 pinMode(23,INPUT); //A5 pinMode(2,INPUT); //D2 pinMode(3,INPUT); //D3 pinMode(4,INPUT); //D4 pinMode(5,INPUT); //D5 pinMode(6,INPUT); //D6 pinMode(7,INPUT); //D7 pinMode(8,INPUT); //D8 pinMode(9,INPUT); //D9 pinMode(13,OUTPUT); //LED Serial.begin(9600); //LINKER MOTOR: } void loop() { sensorwert = analogRead(11); Serial.write(48+(sensorwert/1000)%10); Serial.write(48+(sensorwert/100)%10); Serial.write(48+(sensorwert/10)%10); Serial.write(48+(sensorwert/1)%10); Serial.write(' '); Serial.write(' '); digitalWrite(13,1); delay(250); digitalWrite(13,0); delay(250); }
Code 0-5: Analoge Werte lesen und auf die serielle Schnittstelle schreiben
Vorwärtsfahrt-Test
int sensorwert=0; //A0 = D18 //A1 = D19 //A2 = D20 //A3 = D21 //A4 = D22 //A5 = D23 //A6 = D24 //A7 = D25 //A8 = D26 //A9 = D27 //A10 = D28 //A11 = D29 void setup() { pinMode(18,INPUT); //A0 pinMode(19,INPUT); //A1 pinMode(20,INPUT); //A2 pinMode(21,INPUT); //A3 pinMode(22,INPUT); //A4 pinMode(23,INPUT); //A5 pinMode(2,INPUT); //D2 pinMode(3,INPUT); //D3 pinMode(4,INPUT); //D4 pinMode(5,INPUT); //D5 pinMode(6,INPUT); //D6 pinMode(7,INPUT); //D7 pinMode(8,INPUT); //D8 pinMode(9,INPUT); //D9 pinMode(13,OUTPUT); //LED Serial.begin(9600); //Rechte Motorseite: pinMode(10,OUTPUT); //Enable 1, L293_PIN1 pinMode(8,OUTPUT); //Input 2, L293_PIN7 pinMode(3,OUTPUT); //Input 1, L293_PIN2 digitalWrite(3,1); digitalWrite(8,0); analogWrite(10,0); //Linke Motorseite: pinMode(13,OUTPUT); //Enable 2, L293_PIN9 pinMode(19,OUTPUT); //A1 Input 3, L293_PIN15 pinMode(11,OUTPUT); //Input 4, L293_PIN10 digitalWrite(19,1); digitalWrite(11,0); analogWrite(13,0); } void loop() { sensorwert = analogRead(11); Serial.write(48+(sensorwert/1000)%10); Serial.write(48+(sensorwert/100)%10); Serial.write(48+(sensorwert/10)%10); Serial.write(48+(sensorwert/1)%10); Serial.write(' '); Serial.write(' '); digitalWrite(13,1); analogWrite(10,0); analogWrite(13,255); delay(250); digitalWrite(13,0); analogWrite(10,255); analogWrite(13,0); delay(250); }
Code 0-6: Vorwärtsfahrt-Test
An einer Wand entlang fahren
int sensorwert=0; int regler=0; //A0 = D18 //A1 = D19 //A2 = D20 //A3 = D21 //A4 = D22 //A5 = D23 //A6 = D24 //A7 = D25 //A8 = D26 //A9 = D27 //A10 = D28 //A11 = D29 void setup() { pinMode(18,INPUT); //A0 pinMode(19,INPUT); //A1 pinMode(20,INPUT); //A2 pinMode(21,INPUT); //A3 pinMode(22,INPUT); //A4 pinMode(23,INPUT); //A5 pinMode(2,INPUT); //D2 pinMode(3,INPUT); //D3 pinMode(4,INPUT); //D4 pinMode(5,INPUT); //D5 pinMode(6,INPUT); //D6 pinMode(7,INPUT); //D7 pinMode(8,INPUT); //D8 pinMode(9,INPUT); //D9 pinMode(13,OUTPUT); //LED // Serial.begin(9600); //Rechte Motorseite: pinMode(10,OUTPUT); //Enable 1, L293_PIN1 pinMode(8,OUTPUT); //Input 2, L293_PIN7 pinMode(3,OUTPUT); //Input 1, L293_PIN2 digitalWrite(3,1); digitalWrite(8,0); analogWrite(10,0); //Linke Motorseite: pinMode(13,OUTPUT); //Enable 2, L293_PIN9 pinMode(19,OUTPUT); //A1 Input 3, L293_PIN15 pinMode(11,OUTPUT); //Input 4, L293_PIN10 digitalWrite(19,1); digitalWrite(11,0); analogWrite(13,0); } void loop() { sensorwert = analogRead(11); regler = 250-sensorwert; if(regler>100) regler=100; else if(regler<-100) regler=-100; regler/=32; /* Serial.write(48+(sensorwert/1000)%10); Serial.write(48+(sensorwert/100)%10); Serial.write(48+(sensorwert/10)%10); Serial.write(48+(sensorwert/1)%10); Serial.write(' '); Serial.write(' '); */ //digitalWrite(13,1); analogWrite(13,255-regler); //digitalWrite(13,0); analogWrite(10,255+regler); delay(10); }
Code 0-7: An einer Wand entlang fahren
void setup() { TCCR1B &= ~(1<<WGM13); //Mode 4 TCCR1B |= (1<<WGM12); TCCR1A &= ~(1<<WGM11); TCCR1A &= ~(1<<WGM10); //Vorteilung 1: 16000000Hz TCCR1B &= ~(1<<CS12); TCCR1B &= ~(1<<CS11); TCCR1B |= (1<<CS10); //f = fclk/(2*N*(OCR1A+1)) //OCR1A = (fclk/(f*2*N))-1 //OCR1A = 8000000/440 - 1 == 18181 OCR1A=18181; //0,5Hz == 4 Schläge! //Toggle auf OC1A: TCCR1A &= ~(1<<COM1A1); TCCR1A |= (1<<COM1A0); pinMode(9,OUTPUT); } void loop() { }
Code 0-8: Nur CTC-Toggle ohne Interrupt.
void setup() { // TCCR1B |= (1<<WGM13); //Mode 12 TCCR3B &= ~(1<<WGM33); //Mode 4 TCCR3B |= (1<<WGM32); TCCR3A &= ~(1<<WGM31); TCCR3A &= ~(1<<WGM30); //Vorteilung 1: 16000000Hz TCCR3B &= ~(1<<CS32); TCCR3B &= ~(1<<CS31); TCCR3B |= (1<<CS30); //f = fclk/(2*N*(OCR1A+1)) //OCR1A = (fclk/(f*2*N))-1 //OCR1A = 8000000/440 - 1 == 18181 OCR3A=18181; //0,5Hz == 4 Schläge! //Toggle auf OC1A: TCCR3A &= ~(1<<COM3A1); TCCR3A |= (1<<COM3A0); pinMode(5,OUTPUT); //OC3A } void loop() { }
Code 0-9: Das Gleiche für Timer 3 (ebenfalls 16Bit).
void setup() { //Vorteilung 8: 2000000Hz TCCR4B &= ~(1<<CS43); TCCR4B |= (1<<CS42); TCCR4B &= ~(1<<CS41); TCCR4B &= ~(1<<CS40); //f = fclk/(2*N*(OCR1A+1)) //OCR1A = (fclk/(f*2*N))-1 //OCR1A = 1000000/1760 - 1 == 568 OCR4A=568; //Toggle auf OC1A: TCCR4A &= ~(1<<COM4A1); TCCR4A |= (1<<COM4A0); pinMode(13,OUTPUT); //OC4A } void loop() { }
Code 0-10: Das Gleiche für Timer 4 (allerdings 10 Bit, darum höhere Frequenz ausgewählt, da unempfindlicher bzgl. kleinerer Abweichungen.)