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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.