Forum: Mikrocontroller und Digitale Elektronik Atmega 48 Timer Interrupt C


von HansD. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich möchte mit Hilfe eines ATMEGA48 µC nach exakt 60µs einen Sensor 
einlesen.
Dieser wird von einem Pin von PORTD versorgt.
Um mich nocheinmal genauer auszudrücken: Ich will PORTD als Ausgang 
verwenden und ihn eine Spannung ausgeben lassen. Danach muss ich, wenn 
der Sensor 60µs-65µs Spannung bekommen hat, mit Hilfe des ADC vom Sensor 
die Spannung einlesen.

Das ist mein Ansatz:
OCR1A = 60;
TCCR1B |= (1<<WGM12)|(1<<CS10);  // CTC MODE | CLK/8 -> Prescaler
TCCR1A |= (1<<COM1A0);    // Toggle OC1A/OC1B on Compare Match
TIMSK1 |= (1<<OCIE1A);    // Output CompareA Interrupt Enable bei Timer1
sei();
PORTD = 0xff;

Mein Problem liegt nun beim genauen Zeitpunkt. Ich habe es mit dem 16 
bit Timer versucht jedoch bekomme ich den genauen Zeitpunkt nicht hin.

Ich programmiere mit AVRStudio und habe das ganze Programm angehängt.

Ich habe mir bereits alle Tutorials angeschaut und bekomme es einfach 
nicht hin, wäre also super wenn Ihr mir helfen könntet.

Danke im voraus Hans

von HansD. (Gast)


Lesenswert?

Bin nochmal ich.
Tut mir leid hab das mit der Formatierung übersehen!

Also der Code:
1
OCR1A = 60;
2
TCCR1B |= (1<<WGM12)|(1<<CS10);  // CTC MODE | CLK/8 -> Prescaler
3
TCCR1A |= (1<<COM1A0);    // Toggle OC1A/OC1B on Compare Match
4
TIMSK1 |= (1<<OCIE1A);    // Output CompareA Interrupt Enable bei Timer1
5
sei();
6
PORTD = 0xff;

Mfg Hans

von Spess53 (Gast)


Lesenswert?

Hi

Wozu brauchst du 'CTC MODE' und 'Toggle OC1A/OC1B on Compare Match' wenn 
du nur den ADC starten willst?

Dein Timer ist spätestens nach der 1.Messung unbestimmt. Du solltest 
TCNT auf Null setzen.

Der ADC-Start kann übrigens auch direkt durch Compare Match B getriggert 
werden(Autotrigger).

MfG Spess

von dreimalsoviel (Gast)


Lesenswert?

Lauft der μC wirklich mit 8MHz oder ist da noch ein Vorteiler in den 
Fuse Bits aktiviert?

Wie viel liegst Du denn daneben, zeitlich gesehen?

von HansD. (Gast)


Lesenswert?

Also schon mal danke dass so schnell Antworten gekommen sind!

Spess53 schrieb:
> Wozu brauchst du 'CTC MODE' und 'Toggle OC1A/OC1B on Compare Match' wenn
> du nur den ADC starten willst?

Benötige ich dass nicht um auf den richtigen Wert raufzuzählen? Ich hab 
da gerade ein kleines Verständnisproblem da ich noch nicht so viel mit 
Timern gearbeitet habe und noch nie mit dem Atmega48.

Spess53 schrieb:
> Dein Timer ist spätestens nach der 1.Messung unbestimmt. Du solltest
> TCNT auf Null setzen.

Wieso ist der Timer dann unbestimmt? Er zählt doch rauf bis OCR1A = 60 
und wird dann wieder auf 0 gesetzt oder nicht?

Wie funktioniert das Autotriggern? Kann ich das so verstehen dass dann 
der ADC automatisch angestartet wird?

dreimalsoviel schrieb:
> Lauft der μC wirklich mit 8MHz oder ist da noch ein Vorteiler in den
> Fuse Bits aktiviert?

Der müsste mit 8Mhz laufen, ich habe jedoch gerade nicht die Möglichkeit 
nachzusehen und werde das nachholen.

Mfg Hans

von Spess53 (Gast)


Lesenswert?

Hi

>Benötige ich dass nicht um auf den richtigen Wert raufzuzählen? Ich hab
>da gerade ein kleines Verständnisproblem da ich noch nicht so viel mit
>Timern gearbeitet habe und noch nie mit dem Atmega48.

Ich muss doch besser lesen. CTC ja, aber Pin-Togglen nicht

>Wieso ist der Timer dann unbestimmt? Er zählt doch rauf bis OCR1A = 60
>und wird dann wieder auf 0 gesetzt oder nicht?

Ja, aber du hältst den Timer nicht an. Der läuft immer bis 60 und fängt 
wieder bei Null an.

>Wie funktioniert das Autotriggern? Kann ich das so verstehen dass dann
>der ADC automatisch angestartet wird?

Ja.

Übrigens sind die 1MHz für den ADC recht sportlich.

MfG Spess

von HansD. (Gast)


Lesenswert?

Hi

Also lass ich dass hier einfach weg und lass das TCCRIA Register in 
Ruhe?
1
TCCR1A |= (1<<COM1A0);    // Toggle OC1A/OC1B on Compare Match

Spess53 schrieb:
> Ja, aber du hältst den Timer nicht an. Der läuft immer bis 60 und fängt
> wieder bei Null an.

Das heisst der Timer sollte immer wieder einen Interrupt auslösen? Denn 
das tut er nicht, sondern löst 1 mal den Interrupt aus und stoppt dann 
(zumindest sieht es so aus).

Eigentlich will ich ja nur dass der Interrupt einmal ausgelöst wird und 
dass ich nach 60µs nachdem PORTD eine Spannung ausgibt den ADC einlese.
Hättest du da vielleicht einen Vorschlag für mich bitte denn wenn ich 
dass Programm im AVRStudio Simuliere wird der ADC öfter ausgelöst. Am µC 
sieht dass jedoch nicht so aus.

Danke schonmal Hans

von Karl H. (kbuchegg)


Lesenswert?

HansD. schrieb:
> Hi
>
> Also lass ich dass hier einfach weg und lass das TCCRIA Register in
> Ruhe?
>
1
> TCCR1A |= (1<<COM1A0);    // Toggle OC1A/OC1B on Compare Match
2
>

Ja.
Denn das der Timer automatisch einen Pin toggeln könnte interessiert 
dich ja nicht. Du bist ja nur daran interessiert, dass du nach 60µC 
einen Aufruf der ISR bekommst.


Der passiert allerdings, wie Spess53 schon geschrieben hat laufend. Denn 
nur deswegen, weil der Timer im CTC Modus auf 0 zurückgesetzt wird, hört 
er ja nicht zu laufen auf.

>> Ja, aber du hältst den Timer nicht an. Der läuft immer bis 60 und fängt
>> wieder bei Null an.
>
> Das heisst der Timer sollte immer wieder einen Interrupt auslösen? Denn
> das tut er nicht, sondern löst 1 mal den Interrupt aus und stoppt dann
> (zumindest sieht es so aus).

Der läuft garantiert weiter.

> Eigentlich will ich ja nur dass der Interrupt einmal ausgelöst wird

dann musst du den Timer auch wieder stoppen.
Ist ganz einfach:
Sobald der Timer einen Vorteiler zugewiesen bekommt, läuft er.
Nimmt man ihm den Vorteiler wieder weg, läuft er nicht mehr.
Ausnahmen gibts keine.

> und
> dass ich nach 60µs nachdem PORTD eine Spannung ausgibt den ADC einlese.
> Hättest du da vielleicht einen Vorschlag für mich bitte denn wenn ich
> dass Programm im AVRStudio Simuliere wird der ADC öfter ausgelöst. Am µC
> sieht dass jedoch nicht so aus.

Dann misst du falsch.

von HansD. (Gast)


Lesenswert?

Hi
Danke für die schnelle Hilfe!
Hatte jetzt leider keine Zeit meinen Dank reinzuschreiben.
Jetzt funktioniert meines erachtens nach alles prima!

Karl heinz Buchegger schrieb:
> Dann misst du falsch.

Da hattest du recht denn bei mir war das CKDIV8 Bit gesetzt deshalb hat 
der Zeitpunkt nicht gepasst.

Nachmal Danke Leute!!

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.