mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Input Capture Flag Atmega16


Autor: Chillman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab mit der Input Capture Fuktion Probleme. Bei der Simulation 
funktioniert alles einwandfrei, aber auf dem Controller läuft es nicht.
Ich möchte Pulsweiten von rechteckimpulsen messen, die ich dann im 
weiteren Programmverlauf analysiere. leider wird das Input Capture Flag 
nicht gesetzt und auch kein Wert in die ICR1 abgelegt, wenn es auf dem 
Controller ausgeführt wird, dies hab ich mit incircuit debuggen 
rausgefunden. das Programm hängt dadurch dann in der Warteschleife fest.


#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdlib.h>

int timer();


int main(void)
{
unsigned short dif;     /* 2Byte Datenformat */
DDRD =0x00;          /* PORTD als Eingang nutzen */
PORTD =0x00;    /* Pull-up Widerstände nicht aktivieren */
TIMSK =0b00100000; /* Freischalten des Interrupt der Input Capture
                      Funktion*/

DDRB =0xff;
PORTB =0b11111010;
while (1)
{ TCCR1B = 0b01000001; /* Timer startet, Input Capture reagiert auf
                       steigende Flanke */
if ( PIND & (1<<PIND6)) /* Starte Auswertung, wenn Bit Nr. 6 in PIND
                       gesetzt (1) ist*/
  {
  uint16_t icr1_1= ICR1;   /*schreibt den Wert aus ICR1 in icr1_1 (bei
                           steigender Flanke ausgelöst) */
  TIFR =0b00100000;   /* setzt das Input Capture Flag zurück */
  TCCR1B =0b00000010; /* Input Capture reagiert auf fallende Flanke */
  while (TIFR <0b00100000) /*Warteschleife bis fallende Flanke kommt */
      {}
  uint16_t icr1_2= ICR1;   /* schreibt den Wert ICR1 in icr1_2 (bei
                           fallender Flanke ausgelöst) */
  TIFR =0b00100000;  /* setzt das Input Capture Flag zurück */
  dif = icr1_2 - icr1_1;   /* Impulslänge in 16Bit angegeben*/

ich bau auf eure Hilfe

Gruß Chillman

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu hat die Capture-Einheit eigentlich einen Interrupt? Ich kann 
allerdings sowieso nicht ganz nachvollziehen, was dieses 
Programmfragment genau machen soll...

Autor: Jörg X. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@OP:
Soll dein Programm sowas wie hier im Anhang machen? ;)

hth. Jörg (jaja, hab grad zuviel Zeit)

Autor: Chillman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das mit dem Interrupt aktivieren ist überflüssig, ist mir auch schon 
aufgefallen. hab auch rausgefunden, dass im Incirciut debugmodus, wenn 
man schritt für schritt durchgeht flanken nicht erkannt werden, wenn man 
aber auf run drückt schon, beim simulator erkennt er flanken selbst im 
step modus. naja so ist das wohl.

Autor: Chillman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jörg, meins geht nun auch

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.