Forum: Mikrocontroller und Digitale Elektronik Input Capture Flag Atmega16


von Chillman (Gast)


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

von Johannes M. (johnny-m)


Lesenswert?

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

von Jörg X. (Gast)


Angehängte Dateien:

Lesenswert?

@OP:
Soll dein Programm sowas wie hier im Anhang machen? ;)

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

von Chillman (Gast)


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.

von Chillman (Gast)


Lesenswert?

Danke Jörg, meins geht nun auch

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.