Forum: Mikrocontroller und Digitale Elektronik Input Capture Event Atmega16


von Marco M. (marco1987)


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);

}

von Patrick (Gast)


Lesenswert?

Weil er sei() nie erreicht. Setze das vor die Endlosschleife.

von Johannes M. (johnny-m)


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...

von Johannes M. (johnny-m)


Lesenswert?

Patrick wrote:
> Weil er sei() nie erreicht. Setze das vor die Endlosschleife.
...und das kommt noch erschwerend dazu...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Marco M. (marco1987)


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

von Johannes M. (johnny-m)


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.

von Johannes M. (johnny-m)


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."

von Marco M. (marco1987)


Lesenswert?

Johannes M. wrote:
> Klar, wenn Du den Overflow Interrupt freigibst anstelle des Capture
> Interrupt. Dann wird das nix.
>

Seit wann gibts da Unterscheide im Gcc Turorial steht:

> sei();
>   // Interrupts global aktiviert


und nciht von verschiedenen Interrupt Befehlen

von Patrick (Gast)


Lesenswert?

>das macht doch hier eh keiner
Du hast vielleicht ne Ahnung. Setz doch einfach mal Deinen Code zwischen 
die dafür vorgesehenen Formatierungshilfen (eckige Klammer, c, eckige 
Klammer).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Seit wann gibts da Unterscheide im Gcc Turorial steht:

Mit dem Ton wirst du dir keine Freunde machen.

Oder um mit dem letzten sächsischen König zu sprechen, als er
gegangen worden ist: ,,Dann macht doch eiern Dreck alleene.''

von Marco M. (marco1987)


Lesenswert?

Das war doch eine ganz normale Frage!

"Seit wann gibts da Unterscheide im Gcc Turorial steht:"

was ist da gegen den Ton einzuwenden

von Patrick (Gast)


Lesenswert?

@Marco M.

Hast Du Dir überhaput schon mal das Datenblatt des Controllers 
angesehen? Das hilft vielleicht.

von Marco M. (marco1987)


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...

von Marco M. (marco1987)


Lesenswert?

Also back to topic oder beenden wir das Thema?

von Patrick (Gast)


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.

von Patrick (Gast)


Lesenswert?

Ach, übrigens. Hat das hier jetzt funktioniert?:
Beitrag "PWM Spannung erhöhen per Taster"

von Johannes M. (johnny-m)


Lesenswert?

@ 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...

von Marco M. (marco1987)


Lesenswert?

Patrick wrote:
> Ach, übrigens. Hat das hier jetzt funktioniert?:
> Beitrag "PWM Spannung erhöhen per Taster"

Selbstverständilich:-) hat alles wunderbar gefunzt

von Marco M. (marco1987)


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;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Marco M. (marco1987)


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
}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Marco M. (marco1987)


Lesenswert?

> Weil du immer noch den overflow und den compare match interrupt
> aktivierst, aber keine ISR dafür hast.

Danke für den Hinweis, aber wer verät mir denn wie ich den input 
interrupt aktiviere, anscheinend ja nicht mit sei();

:-)

von AVRFan (Gast)


Lesenswert?

>aber wer verät mir denn wie ich den input interrupt aktiviere

Das Datenblatt zum ATmega16?

von Patrick (Gast)


Lesenswert?

>>aber wer verät mir denn wie ich den input interrupt aktiviere
>
>Das Datenblatt zum ATmega16?
Und mein post von 10:28. Die anderen Zuweisungen zu TIMSK kannst Du 
löschen.

von AVRFan (Gast)


Lesenswert?

>Und mein post von 10:28.

Du hast recht!

@Marco: Warum stellst Du eine Frage, auf die Du schon eine Antwort 
bekommen hast?

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.