Einfangen eines Eingangssignals mit Attiny2313 C-sprache

Gast #2403672
Lesenswert?

Señoras y Señores,
sorry aber mein Deutsch  ist nicht so gut!!

Ich habe eine Fernsteuerung und ihr Empfänger für ein kleines Flugzeug 
dann bekomme ich ein PWM signal ich möchte das einfangen und dann ein 
paar sachen mit dem steuern.

Ich habe nicht viel erfahrung mit dem und ich wäre sehr dankbar wenn 
jemand mir helfen kann.

gruss

////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
/* uC: Attiny2313 */
#include <avr/io.h>
#include <avr/interrupt.h>
#include "regdef.h"
#include <stdlib.h>


volatile unsigned int counter;

int main(void)  {

  DDRB  = 0xfc;    //  Eingänge
  PORTB = 0x00;   // Pullups an Eingängen

  DDRD  = 0xbf;     // Eingänge,
  PORTD = 0x00;  // Pullups
  // Timer1 initialisieren:///////////////////////////////////////

  TCCR1A = 0;       // normal mode, keine PWM Ausgänge
  TCCR1B = (1<< ICNC1) + (1 << CS11)  // start Timer mit Systemtakt
    + (1 << ICES1);            // steigende Flanke auswählen
  TIMSK = (1<<TOIE0) + (1<<ICIE1) + (1<<TOIE1); // overflow und
Input-capture aktivieren,
  TIFR = (1<<ICF1);

  while(1)  {

    counter=0;
    ICR1=0;
    while(REG.xPORTB.BIT.B1!=0){REG.xPORTB.BIT.B6=1;}
    //if(ICR1>=5000){REG.xPORTB.BIT.B6=1;}
      }

}
ISR(TIMER1_CAPT_vect) {
  uint16_t tval;
  tval=ICR1;
}

ISR(TIMER1_OVF_vect)        // Timer1 Überlauf
  {
    ++counter;        //
  }
Gast #2405031
Lesenswert?

Sorry, jetzt ich schreibe besser



1.-Eingänge definieren

wenn ich  eine signal mit PD6(ICP1) einfangen möchte MUSS ich PD6 als 
eingang definieren (DDRD  = 0xBF;)??

  DDRB  = 0xfc;    // Eingänge
  PORTB = 0x00;
  DDRD  = 0xbf;   // Eingäang
  PORTD = 0x00;
///////////////////////////////////////////////////
/////////////////////////////////////////////////////
////////////////////////////////////////////////////

2.-Timer1 initialisieren(input capture)

so  habe ich richtig der Timer1  initialisieren??

// normal mode,
  TCCR1A = 0;

// start Timer mit Systemtaktsteigende Flanke auswählen
TCCR1B = (1<< ICNC1)+(1 << CS11)+(1 << ICES1);

// overflow und Input-capture aktivieren,
TIMSK = (1<<TOIE0) + (1<<ICIE1) + (1<<TOIE1);

TIFR = (1<<ICF1);



3.-
INTERRUPT

muss ich mit diese Interrupt arbeiten? das bedeutet wenn ich ein 1 
bekomme, in ICR1 kann ich wissen wie lange es hat gedauert??

ISR(TIMER1_CAPT_vect) {
  capture=ICR1;
}


|----|____|----|____|----|____|----|____|----|
\    /
 \  /
  \/
 ICR1


4.-

kann ich etwas so machen??

ICR1=0;
while(ICP1!=0){}
if(ICR1>>100){led_grun=1;}

ich hoffe, dass ihr mir verstehen und helfen könnt

gruss

ed

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren