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); }
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...
Patrick wrote:
> Weil er sei() nie erreicht. Setze das vor die Endlosschleife.
...und das kommt noch erschwerend dazu...
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.
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
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.
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."
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
>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).
> 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.''
Das war doch eine ganz normale Frage! "Seit wann gibts da Unterscheide im Gcc Turorial steht:" was ist da gegen den Ton einzuwenden
@Marco M. Hast Du Dir überhaput schon mal das Datenblatt des Controllers angesehen? Das hilft vielleicht.
> 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...
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.
@ 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...
Patrick wrote: > Ach, übrigens. Hat das hier jetzt funktioniert?: > Beitrag "PWM Spannung erhöhen per Taster" Selbstverständilich:-) hat alles wunderbar gefunzt
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;-)
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.
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 | }
|
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.
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.
> 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(); :-)
>aber wer verät mir denn wie ich den input interrupt aktiviere
Das Datenblatt zum ATmega16?
>>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.
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.