www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR AT90CAN128 Timer1 Timer3 AC


Autor: Michael S. (elmsfeuer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe wieder mal eine Frage. Mein Ziel ist es "gleichzeitig" den 
Komparator mit dem Timer1 im Input-Capture-Mode an ACO und den Timer3 im 
Input-Capture-Mode an ICP3 zu betreiben.

Ich benutze das STK500 + STK501 + AT90CAN128 + JTAGICEmkII + aktl.
Version AVR-Studio + aktl. Version Win-AVR

An ICP3(PE7) liegt ein Frequenzgenerator (TTL-Out) und läuft mit 1 Hz.

Auf dem Komparatoreingang (AIN0) hab ich den Switchbutton 0 vom STK500 
angeschlossen und als Referenzsignal (AIN1) für den Komparator habe ich 
PB0/3 angelegt.
#include "config.h"
#include "uart_lib.h"
#include "uart_drv.h"

volatile unsigned int tickCounter1, tickCounter3;

void init()
{
   Uart_select(UART_0);
   uart_init(CONF_8BIT_NOPAR_1STOP,38400);

//KOMPARATOR FÜR FREQUENZMESSUNG KONFIGURIEREN INKL. TIMER1
   //Aktiviere Input-Capture (nur Timer1 möglich)
   ACSR = (1<<ACIC)|(1<<ACO);

   //Referenzsignal für den Komparator
   DDRB  |= (1<<PB0);
   PORTB |= (1<<PB0);

//Timer1
   //Timer1 für Frequenzzählung auf Input Capture Mode konfigurieren
   TCCR1B = (1<<ICES1)|(1<<CS12); //Detect on positive edge and set prescaler 256
   TIMSK1 = (1<<ICIE1); //Input-Capture-Mode aktiviert
   TIFR1 |= (1<<ICF1); //Clear Interrupt-Flag

   tickCounter1 = tickCounter1Temp = 0;

//Timer3
   //Timer3 für PWM-Messung auf Input Capture Mode konfigurieren (PE7)
   TCCR3B = (1<<ICES3)|(1<<CS32); //Set Prescaler 256 und detect on positive edge
   TIMSK3 = (1<<ICIE3); //Input-Capture-Mode aktiviert
   TIFR3 |= (1<<ICF3); //Clear Interrupt-Flag

   tickCounter3 = tickCounter3Temp = 0;

   sei(); //INTERRUPTS ENABLED (Global Flag)
}

ISR(TIMER1_CAPT_vect)
{
   tickCounter1 = 0;
   tickCounter1  = ICR1L; //Read LOW-Byte of ICR1
   tickCounter1 |= ICR1H << 8; //Read HIGH-Byte ICR1

   uart_mini_printf("\r TIMER1: %04X\n", tickCounter1);
}

ISR(TIMER3_CAPT_vect)
{
   tickCounter3 = 0;
   tickCounter3 = ICR3L; //Read LOW-Byte of ICR3
   tickCounter3 |= ICR3H << 8; //Read HIGH-Byte of ICR3

   uart_mini_printf("\r TIMER3: %04X\n", tickCounter3);
}

ISR(BADISR_vect)
{
   uart_mini_printf("\rBADISR found\n");
}

int main(void)
{   
   init();

   while(1);

   return 0;
}

Eine Ausgabe über den UART erfolg seltsamerweise erst, wenn ich den 
Button 0 drücke, aber dann werden auch Timer1 und Timer3 ausgelöst. Der 
Frequenzgenerator scheint keinen Einfluss auf Timer3 zu haben. Achja und 
Timer1 und Timer3 haben die selben Werte.
 TIMER1: 698F
 TIMER3: 698F
 TIMER1: 2E91
 TIMER3: 2E91
 TIMER1: E394
 TIMER3: E394
 TIMER1: 344C
 TIMER3: 344C
 TIMER1: 7562
 TIMER3: 7562
 TIMER1: B29B
 TIMER3: B29B
 TIMER1: F2B5
 TIMER3: F2B5

Stelle ich den Komparator ab (in init() den Bereich von //Komparator bis 
//Timer1 auskommentiert) und lege den Switchbutton auf auf ICP1(PD4) 
funktionieren die Timer unabhängig voneinander.
 TIMER3: 4606
 TIMER3: BA06
 TIMER3: 2E4A
 TIMER3: A24A
 TIMER1: C9CE
 TIMER3: 164B
 TIMER3: 8A38
 TIMER3: FE86
 TIMER3: 72D2
 TIMER3: E6D3
 TIMER3: 5AD4
 TIMER3: CE91

Was mache ich falsch im Zusammenhang mit dem Komparator? Ich seh 
wahrscheinlich den Wald vor lauter Bäumen nicht. Danke fürs Helfen!!!

MfG
Michael

Autor: Michael S. (elmsfeuer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend,

weiss vielleicht jemand Rat? Ich habe alle zugehörigen Datenblattkapitel 
x mal gelesen, kann aber keinen Hinweis finden. Mir ist nur aufgefallen, 
daß der Versuch ACO im ASCR Register zu setzen sinnfrei ist. Ich kann 
mir auch nicht wirklich erklären warum die Interrupts "verschwimmen". 
Meine eigentliche Spielerei habe ich jetzt anders gelöst, aber wieso ich 
den Komparator in der obigen Konstellation nicht benutzen kann, ist mir 
ein wenig schleierhaft und läßt mich nicht in Ruhe. Wenn jemand was 
weiss, bitte melden, danke dafür.

MfG
Michael

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.