mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Input Capture Event Atmega16


Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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);

}

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil er sei() nie erreicht. Setze das vor die Endlosschleife.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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."

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.''

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war doch eine ganz normale Frage!

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

was ist da gegen den Ton einzuwenden

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Marco M.

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

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also back to topic oder beenden wir das Thema?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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.

Autor: Patrick (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Marco M. (marco1987)
Datum:

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

Selbstverständilich:-) hat alles wunderbar gefunzt

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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;-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So mein aktueller code leider tut sich noch nicht soviel

 


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


 
int i =1;


int main()
{
 
TIMSK |= (1<<TICIE1);
TIMSK = TIMSK | (1<< TOIE1);
TIMSK = TIMSK | (1 << OCIE1A);


DDRD=0b11111110;
DDRC=0xFF;


sei();

  for(;;){

}

}


ISR(TIMER1_CAPTURE_vect)
{
PORTD^=(1<<PD0);

}


Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
TIMSK = (1 << TICIE1) | (1 << TOIE1) | (1 << OCIE1A);

zu schreiben.

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht 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();

:-)

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>aber wer verät mir denn wie ich den input interrupt aktiviere

Das Datenblatt zum ATmega16?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und mein post von 10:28.

Du hast recht!

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

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.