www.mikrocontroller.net

Forum: Compiler & IDEs Timer Input Capture durch analog comparator


Autor: Moritz Sch (mollitz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Nachdem ich den einfachen Analog-Comparator-Interrupt zum laufen 
gebracht hab, brauch ich nun den Timer-Capture-Interrupt, ausgelöst 
durch den Analog-Comparator.
Ich hab schon etliche Threads gelesen, wo das Problem besprochen wird 
aber keine Fehler in meinem Code gefunden:
#include <avr/io.h>
#include <avr/interrupt.h>

void usart_putc(uint8_t byte) {
  //Ein Byte senden
  while (!(UCSR0A&(1 << UDRE0)))
    ;//warten auf Datenregister empty
  UDR0=byte;
}

void usart_puts(char *s)
//Einen String mit Endmarke 0 senden
{

  while (*s != 0) {
    usart_putc(*s);
    s++;
  }
  usart_putc(0); //Endmarke 0 wird übertragen!
}


void usart_init_intr(uint16_t baud)
{
  sei();
  UBRR0 = F_CPU/(baud* 16L) - 1;
  UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
  UCSR0C = (1<<USBS0);
}

void timer_comp_init_intr()
{
  ACSR = (1 << ACI);//flag löschen
  ACSR = (1 << ACIC); //Input Capture interrupt enable

  TCCR1B |= ( 1<< CS11) |(1<<CS10); //1/64 timer starten
  TIFR1 |= (1<<ICF1) | (1 << TOV1);//flags löschen
}

int main(void)
{
  DDRB  = (1 << PB1) | (1 << PB0);
  PORTB |= (1 << PB1) | (1<<PB0);

  timer_comp_init_intr();
  usart_init_intr(9600);


  while (1)
  {
    if (ACSR & (1 << ACO))
      PORTB &= ~(1 << PB0);
    else
      PORTB |= (1 << PB0);
  }
}
ISR(TIMER1_CAPT_vect)
{
  usart_puts("Neuer Interrupt aus TIMER1_CAPT");
  PORTB ^= (1<<PB1);
}
/*
ISR(ANALOG_COMP_vect)
{
  usart_puts("Neuer Interrupt aus ANALOG_COMP");
  PORTB ^= (1<<PB1);
}*/

ISR(USART_RX_vect)
{
  uint8_t tmpChar = UDR0;
  //PORTB = UDR0%2;
  while ( !( UCSR0A & (1<<UDRE0))) ;
    UDR0 = tmpChar;
}
Ergebniss: PB0 tut genau das was es soll(Je nachdem ob die Flanke fällt 
oder steigt wird umgeschalten), PB1 bleibt immer an.
Ersetze ich nun
ACSR = (1 << ACIC); //Input Capture interrupt enable
mit
ACSR = (1 << ACIE); //Comparator interrupt enable
toggelt auch PB1 wenn die Flanke umschält und auf dem seriellen Port 
kommt die erwünschte nachricht (neuer interrupt aus analog_comp).

Ich bin ratlos,

Danke für Hilfe,

Moritz

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die InCapt-IRQ ist nicht aktiviert.

Wenn der µC-Typ angegeben wäre ging es einfacher dir konkrete Tipps zu 
geben.

Autor: mollitz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Wird das nicht dadurch veranlasst:
ACSR = (1 << ACIC); //Input Capture interrupt enable
?
oder meinst du die im Register vom Timer1?
Hab einen ATMega168

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit wird nur der INCAPT-Eingang von Timer1 mit dem Ausgang des AC 
verbunden.

Aktiviert wird über

TIMSK1.ICIE1 (oder so)

Autor: Moritz Sch (mollitz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void timer_comp_init_intr()
{
  ACSR = (1 << ACI);
  ACSR = (1 << ACIC);

  TIMSK1 |= (1<<ICIE1);
  TCCR1B |= ( 1<< CS11) |(1<<CS10); //1/64
  TIFR1 |= (1<<ICF1) | (1 << TOV1);
}
so siehts jetzt aus-> bringt nichts.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist die richtige Flanke ausgewählt? (ICESx)

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moritz Sch wrote:
>
> void timer_comp_init_intr()
> {
>   ACSR = (1 << ACI);    <- unnötig für Input Capture, wenn der AC Interrupt nicht benötigt wird.
>   ACSR = (1 << ACIC);
> 
>   TIMSK1 |= (1<<ICIE1);
>   TCCR1B |= ( 1<< CS11) |(1<<CS10); //1/64
>   TIFR1 |= (1<<ICF1) | (1 << TOV1); <- Die Oder Verknüpfung ist unnötig, bzw. hier sogar falsch, da damit alle Flags auf 0 gesetzt werden.
> }
> 

Autor: mollitz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ICES0=ICES1=0
->Interrupt bei fallender und steigender Flanke

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dir ist klar daß du evtl den UART verwendest bevor er initialisiert ist?

Autor: Moritz Sch (mollitz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das schlimm?

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.