ich habe jetzt den COMP Interrupt benutzt, ich möchte jetzt zum beispiel
100schritte machen dann auf einem PIN eine PWM signal ausgeben, dann
nochmal 100 Schritte, das ganze 10mal,das heißt der Motor soll sich 1000
Schritte machen und 10 mal pwm signal ausgeben. und das habe ich so
realisiert, ich bitte um Korrektur.
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint16_t zx=0,zy=0;
void motorxR(void);
void sleep_ms(unsigned int ms);
int main()
{
DDRB=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5); // PIN0-5 als Ausgang für die Motoren definieren // PortB als Ausgang definieren
DDRC = 0; //PORTC als Eingang für PCINT MASK 1 definieren
// Timer 1 einstellen
//
// Modus 15:
// Fast PWM, Top von OCR1A
//
// WGM13 WGM12 WGM11 WGM10
// 0 1 0 0
//
// Timer Vorteiler: 1
// CS12 CS11 CS10
// 0 0 1
//
// Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
// COM1A1 COM1A0
// 0 1
// OCR1A=(fclk/2*N)-1 N: Vorteiler
TCCR1A = (1<<COM1A0) | (0<<WGM11)| (0<<WGM10);
TCCR1B = (0<<WGM13) | (1<<WGM12) | (1<<CS10);
OCR1A=18432;
//****************** Interrupt initialisieren *************************************
PCMSK1 = (1 << PCINT8)|(1 << PCINT9)|(1 << PCINT10)|(1 << PCINT11)|(1 << PCINT12)|(1 << PCINT13); //Pin C0-5 für Pin Change Interrupt in Maske 1 setzen
PCICR |= (1 << PCIE1); //Pin Change Interrupt Control Register - PCIE3 setzen für PCINT30
//*********** TIMER1 COMP *****************
TIMSK1|=(1<<OCIE1A);
TCNT1=0;
sei();
while (1) {}
}
ISR(TIMER1_COMPA_vect)
{
if(zx>100)
{
PORTB&=~(1<<PB0);
}
zx++;
}
ISR(PCINT1_vect) //Interrupt Service Routine
{
sei();
//******************************* MESSUNG STARTEN ********************************************
//*****************************************************************************************************
if(!(PINC&(1<<PC0)))
{
for(unsigned int j=0;j<10;j++)
{
motorxR();
PORTB|=(1<<PB5); //
sleep_ms(5); // TRIGGERN
PORTB&=~(1<<PB5); //
sleep_ms(2);*/
zx=0; // WARTEN 2ms
}
}
void motorxR(void)
{
PORTB|=(1<<PB3);
PORTB|=(1<<PB0);
//PORTB&=~(1<<PB2);
}
void sleep_ms(unsigned int ms)
{
for (unsigned int s=0; s<ms; s++)
{
for (long int i=0; i<461; i++)
{
asm volatile("nop");
}
}
}
Lesezeichen