Forum: Mikrocontroller und Digitale Elektronik ICP-Pulsdauer


von Lukas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich muss die Pulsdauer eines Rechtecksignals messen über den ICP - Pin.
Mein Problem ist, dass ich zum testen ein Oszi an einen Ausgang gehängt 
habe und in der Interrupt routine jedes mal wenn der ICP - PIn ausgelöst 
wird den Pin Ein und Ausschalte. Aber es wird nur blödsinn am 
OSzilloskop angezeigt.

Habe im Anhang meinen Programmcode vllt. kann mal jemand schaun ob ich 
iwas flasch initialisiert habe.

System: Atmega32 @1Mhz intern

Lg

Lukas

von spess53 (Gast)


Lesenswert?

Hi

Each half period of the external clock applied must be longer than one
system clock cycle to ensure correct sampling. The external clock must 
be
guaranteed to have less than half the system
clock frequency (fExtClk < fclk_I/O/2) given a 50/50% duty cycle.

MfG Spess

von Lukas (Gast)


Lesenswert?

My System Clock is as far as i know 1Mhz and de Frquenzy @ ICP - Pin is 
between 300Hz and 1300Hz. The Prescaler of the Timer is 8.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

>   PORTD |= (1 << ICP_PIN);        //Input Capture Pin als Eingang

Der Kommentar stimmt nicht. Du schaltest damit den Pullup ein. 
Verkraftet das Signal den Pullup?

>        StartTime = ICR1;        //  Timerwert wird in StartTime gesichert
>        EndTime = ICR1;                //End Wert sicehrn

Du kannst der Empfehlung von Atmel ("ICR1 so früh wie möglich lesen") 
besser nachkommen, wenn du ICR1 vor dem If-then-else liest und später 
auf StartTime und EndTime aufteilst.

> if (TCCR1B & (1<<ICES1))

Du kannst das beschleunigen, wenn du das Bit ohne Abfragen einfach 
toggelst. Du weisst ja, wie du gestartet bist. Dito PA0 ans PORTA.

>       TIFR |= (1 << ICF1 );       // Interrupt Flag löschen

Das würde ich nicht machen. Die ISR alleine löscht schon ihr 
Interruptflag. Wenn du reinfummelst, löschst du vielleicht den nachsten 
anstehenden ICP IRQ. Bei 300Hz and 1300Hz und 1 MHz/8 vielleicht 
unkritisch, bei schnelleren Signalen vielleicht tödlich.

> Aber es wird nur Blödsinn am OSzilloskop angezeigt.

Das hört sich nach einem Bedienerfehler an. Masseleitung vergessen? 
Oszilloskop falsch eingestellt?

von Lukas (Gast)


Lesenswert?

Stefan B. schrieb:
> Der Kommentar stimmt nicht. Du schaltest damit den Pullup ein.
> Verkraftet das Signal den Pullup?

Hy, also ich schließe an den ICP - Pin derzeit einen Rechteckgenerator 
an. Wie meinst du ob der den PUllup verkraftet? Sollte ich diese Zeile 
komplett löschen?


Also beim Oszilloskop habe ich die Massen verbunden und wenn ich mich 
mit dem Oszi auf den Rechteckgenerator hänge bekomme ich auch das 
korrekte Signal.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Lukas schrieb:

> Hy, also ich schließe an den ICP - Pin derzeit einen Rechteckgenerator
> an. Wie meinst du ob der den PUllup verkraftet? Sollte ich diese Zeile
> komplett löschen?

Schafft es deine Signalquelle gegen einen Pullup-Widerstand zu arbeiten?

                         Vcc
                          |
                          #
                          # Pullup-Widerstand
                          |
Rechteckgenerator o-------+-------o Oszi
              GND o---------------o GND


Wenn ein Pullup-Widerstand in der Größenordnung der internen Pullups 
deines AVR vorhanden sind: Sind die Rechtecke noch Rechtecke und werden 
die Kenndaten der LOW/HIGH Pegel aus dem AVR Datenblatt noch erreicht? 
Wenn nicht, internen Pullup des AVRs nicht einschalten. Wenn ja, dann 
schadet die Zeile nicht.

> Also beim Oszilloskop habe ich die Massen verbunden und wenn ich mich
> mit dem Oszi auf den Rechteckgenerator hänge bekomme ich auch das
> korrekte Signal.

Du kannst am PA0 Pin beobachten:

1. ein regelmäßiges (im Bezug aufs Eingangssignal) LOW/HIGH - die ICP 
ISR arbeitet

2. ein konstantes LOW -  der AVR arbeitet, aber deine ICP ISR wird nie 
angesprungen.

3. ein konstantes HIGH -  der AVR arbeitet, aber deine ICP ISR wurde nur 
einmal angesprungen.

4. ein unregelmäßiges LOW/HIGH - die ICP ISR arbeitet falsch oder der 
AVR resettet sich regelmäßig.

5. Keine LOW/HIGH Signale - Rauschen. Elektrische Verbindung fehlerhaft. 
AVR konstant im RESET (PA0 Tristate)

von Lukas (Gast)


Lesenswert?

Hallo,

Ich habe jetzt die Zeile:

 PORTD |= (1 << ICP_PIN);

weggegeben. D.h der Rechteckgenerator hängt jetzt dirket am Eingang ICP.

Die Register für den ICP Eingang habe ich folgendermaßen gesetzt:

int main()
{
  DDRD   =  0x00;
  DDRA   =  0xff;


Wenn ich nun in der ISR alles auskommentiere und nur folgenden Code 
einfüge:

ISR( TIMER1_CAPT_vect )
{

  PORTA  = 0xff ;
  TIFR |= (1 << ICF1 );
}


bekomme ich nur ein Rauschen am Oszilloskop. Heißt das, dass er gar 
nicht in die ISR hineinkommt bzw. kannst du mir sagen wie ich es sonst 
Lösen könnte bzw. testen.

VIELEN DANK FÜR DEINE HILFE.

LG

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Lukas schrieb:

> bekomme ich nur ein Rauschen am Oszilloskop. Heißt das, dass er gar
> nicht in die ISR hineinkommt bzw. kannst du mir sagen wie ich es sonst
> Lösen könnte bzw. testen.

>> 5. Keine LOW/HIGH Signale - Rauschen. Elektrische Verbindung fehlerhaft.
>> AVR konstant im RESET (PA0 Tristate)

1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
int main(void)
5
{
6
  DDRA = (1<<PA0); //PA0 als Testausgang
7
  while(1)
8
  {
9
    _delay_us(500);
10
    PORTA ^= (1<<PA0);
11
  }
12
}

sollte ein 1 kHz Rechtecksignal auf dem Oszi ergeben. Wenn das nicht 
funktioniert, liegt es nicht an ICP_Measure.c

von spess53 (Gast)


Lesenswert?

Hi

>ISR( TIMER1_CAPT_vect )
>{
>  PORTA  = 0xff ;
>  TIFR |= (1 << ICF1 );
>}

>bekomme ich nur ein Rauschen am Oszilloskop. Heißt das, dass er gar
>nicht in die ISR hineinkommt bzw. kannst du mir sagen wie ich es sonst
>Lösen könnte bzw. testen.

Beim ersten Interrupt werden die Ausgänge H. Und da bleiben sie auch

>TIFR |= (1 << ICF1 );

Die Zeile ist überflüssig.

Ein sei() hast du aber noch im Programm?

MfG Spess

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Kontrolliere am Atmega32 auch, ob GND (Pin 31) und AVcc (Pin 30) 
angeschlossen sind. Ohne die arbeitet PORTA nicht richtig!

Den

    _delay_us(500);
    PORTA ^= (1<<PA0);

Block kannst du mit einem anderen Testpin ruhig im ICP Programm drin 
lassen. Den brauchst du beim späteren Debuggen vielleicht noch als 
"Pulsschlag", ob der AVR regelmäßig durch die Hauptschleife rattert.

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.