Input Capture Event Atmega16

OP #902037
Lesenswert?

Morgen,

es soll ein Signal immer zum L-H Übergang erfasst werden. Zm testen will 
ich eine LED immer blinken lassen, wenn eine LH Flanke kommt, leider 
geht das noch nicht so, wie ich mir das vorstelle, als Hardware wird ein 
Atmega16 verwendet





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

int i =0;


int main()
{

TCCR1B =  (1<<ICES1);  //zu LH Flanke signal erfassen
TIMSK = TIMSK | (1<< TOIE1);

DDRD=0x00;
DDRC=0xFF;


  for(;;){


}
sei();  //glob. Interrupts freigeben
}


ISR(TIMER1_CAPTURE_vect)
{
PORTC^=(1<<PC0);

}
#902045
Lesenswert?

Klar, wenn Du den Overflow Interrupt freigibst anstelle des Capture 
Interrupt. Dann wird das nix.

BTW:
Was ist eigentlich so schwer daran, die vom Forum zur Verfügung 
gestellten Formatierungsoptionen für den Code zu benutzen? Ich rede mir 
hier echt den Mund fusselig, aber Du bist offensichtlich nicht nur in 
Sachen Mikrocontroller ziemlich lernresistent...
OP #902051
Lesenswert?

Johannes M. wrote:
> Klar, wenn Du den Overflow Interrupt freigibst anstelle des Capture
> Interrupt. Dann wird das nix.
>
> BTW:
> Was ist eigentlich so schwer daran, die vom Forum zur Verfügung
> gestellten Formatierungsoptionen für den Code zu benutzen? Ich rede mir
> hier echt den Mund fusselig, aber Du bist offensichtlich nicht nur in
> Sachen Mikrocontroller ziemlich lernresistent...

Was willst du denn ständig mit deiner Formatierung?

das macht doch hier eh keiner
#902053
Lesenswert?

Marco M. wrote:
> Was willst du denn ständig mit deiner Formatierung?
>
> das macht doch hier eh keiner
OK, dann lass Dir von anderen Deinen Scheiß zurechtbiegen! Ich bin nicht 
bereit, mir diesen Schrott noch länger durchzulesen. Wenn Du Dir nicht 
die Mühe machen willst, dann mache ich mir auch keine.
#902057
Lesenswert?

Jörg Wunsch wrote:
> Ich bin mir nicht völlig sicher, aber mir ist so, als müsste der
> Timer auch tatsächlich gestartet werden, damit er ein input capture
> event generieren kann, also einfach nur bei angehaltenem Timer den
> Interrupt freigeben wird u. U. nicht klappen.
Hmmm, Datenblatt sagt da nichts zu, zumindest nicht an der Stelle, an 
der ich es erwarten würde
"When a change of the logic level (an event) occurs on the Input Capture 
pin (ICP1), alternatively on the Analog Comparator output (ACO), and 
this change confirms to the setting of the edge detector, a capture will 
be triggered."
OP #902076
Lesenswert?

> Hmmm, Datenblatt sagt da nichts zu, zumindest nicht an der Stelle, an
> der ich es erwarten würde
> "When a change of the logic level (an event) occurs on the Input Capture
> pin (ICP1), alternatively on the Analog Comparator output (ACO), and
> this change confirms to the setting of the edge detector, a capture will
> be triggered."



--> er spricht mir aus der Seele, da steht darüber nichts, zudem steht 
im Datenblatt nicht all zu viel C-Code.


Und ja ich habe mir das schon angsehen, also bitte nicht frech werden...
Gast #902094
Lesenswert?

Mit dem Datenblatt meinte ich, Du solltest Dir mal die genauen Interrupt 
enable-bits anschauen.
Dann wüsstest Du, dass Du TIMSK so initialisieren musst:
1
TIMSK |= (1<<TICIE1);
Und im Datenblatt (S.115) steht dann auch folgendes:
When this bit is written to one, and the I-flag in the Status Register 
is set (interrupts globally enabled), the Timer/Counter1 Input Capture 
Interrupt is enabled.

Also musst Du beides setzen, damit es funktioniert.
OP #902140
Lesenswert?

Johannes M. wrote:
> @ Marco M.:
> Wenn Du mich weiter beleidigen willst, dann tu das ruhig hier im Forum.
> Brauchst mir keine unverschämten Emails zu schicken. Hier im Forum haben
> wenigstens alle was davon...


kann ich ruhig wiederholen, hab nur gesagt das du ne kleine zicke 
bist;-)
Moderator Persönliche Seite #902144
Lesenswert?

Marco M. wrote:

> was ist da gegen den Ton einzuwenden

Dass du dich wie Graf Koks von der Gasanstalt aufführst, aber zu doof
bist, auf das, was dir hier andere mitteilen, einzugehen und dir die
entsprechenden Stellen im Datenblatt anzugucken.  Dass jemandem der
Unterschied zwischen dem interrupt enable bit eines bestimmten
Features und dem globalen interrupt enable des Prozessors vielleicht
nicht klar ist, kann ja gut sein, aber dann brauchste nicht so zu tun,
als hättest du die Weisheit mit Löffeln gefressen.
OP #902146
Lesenswert?

So mein aktueller code leider tut sich noch nicht soviel

1
 
2

3

4
#include <avr/io.h>
5
#include <util/delay.h>
6
#include <avr/interrupt.h>
7

8

9
 
10
int i =1;
11

12

13
int main()
14
{
15
 
16
TIMSK |= (1<<TICIE1);
17
TIMSK = TIMSK | (1<< TOIE1);
18
TIMSK = TIMSK | (1 << OCIE1A);
19

20

21
DDRD=0b11111110;
22
DDRC=0xFF;
23

24

25
sei();
26

27
  for(;;){
28

29
}
30

31
}
32

33

34
ISR(TIMER1_CAPTURE_vect)
35
{
36
PORTD^=(1<<PD0);
37

38
}
Moderator Persönliche Seite #902149
Lesenswert?

Johannes M. wrote:

[Timer muss möglicherweise laufen für input capture]

> Hmmm, Datenblatt sagt da nichts zu, zumindest nicht an der Stelle, an
> der ich es erwarten würde

> "When a change of the logic level (an event) occurs on the Input Capture
> pin (ICP1), alternatively on the Analog Comparator output (ACO), and
> this change confirms to the setting of the edge detector, a capture will
> be triggered."

Ja, ein capture, aber wenn der Timer nicht läuft, gibt's ja auch
nichts zu capturen.

Mir sagt nur mein Bauchgefühl, dass Timerimplementierungen synchron
von einem Takt abhängen könnten...  Kann man natürlich auch mal
ausprobieren.  Falls es jemand aber nicht am realen Objekt probieren
will sondern nur simulieren, dann nehmt bitten den V2-Simulator im
AVR Studio dafür.  Der garantiert, dass die digitalen Features auch
tatsächlich exakt so wie im Chip simuliert werden.
Moderator Persönliche Seite #902150
Lesenswert?

Marco M. wrote:

> So mein aktueller code leider tut sich noch nicht soviel

Weil du immer noch den overflow und den compare match interrupt
aktivierst, aber keine ISR dafür hast.  Damit startet der ganze
Controller beim ersten Overflow oder Compare match neu (default ISR ->
JMP 0).

Btw., du scheinst die Syntax von »|=« nicht wirklich verstanden zu
haben, sonst würdest du statt »TIMSK = TIMSK | ...« diesen Operator
benutzen.  Insgesamt wäre es wohl ohnehin sinnvoller (falls du
tatsächlich alle drei Interrupts haben willst), stattdessen gleich
1
TIMSK = (1 << TICIE1) | (1 << TOIE1) | (1 << OCIE1A);

zu schreiben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren