Forum: Mikrocontroller und Digitale Elektronik Problem mit AVR OCA Interrupt


von Manfred Schön (Gast)


Lesenswert?

ATMEGA88  programmiert on BASCOM  ( mit Inline Assembler )

Ich verwende den Timer0 als einstellbaren Taktgenerator.
Diesen Takt führe ich Timer1 zu.

Timer1 verwende ich zum messen der Zeit zwischen zwei Digitalimpulsen.
Wenn der erste Impuls auftritt, wird Timer 1 auf Null gesetzt und der 
Takt freigeben
Wenn nun der zweite Impuls auftritt, wird der Timer gestoppt und der 
Zählerwert ausgelesen.
Ich schreibe nun den Zählerwert in das OCR1A-Register, setze den Timer1 
auf 0 und geben dan Takt wieder frei.
Gleichzeitig sende ich über die serielle schnittstelle diverse Daten zu 
einem PC.
Wenn nun der Zählerstand den Wert des OCR1A-Registers erreicht, wird ein 
Interrupt ausgelöst der einen Digitalausgang schaltet.

Dies funktionert am Schreibtisch auch einwandfrei.
Wenn ich das ganze nun aber Vorort ausprobiere wird der Interrupt nicht 
ausgelöst, obwohl das restliche Programm einwandfrei funktionert.

Da das restliche Programm einwandfrei funktionert, kann ich feststellen, 
dass der Timer1 beim ausmessen des Zeitabstandes der beiden 
Digitalsignale einwanfrei funktionert.
Es wird nur der Interrupt nicht aufgerufen.
Der uC hängt sich nicht auf und führt auch keinen RESET durch. Dies 
könnte ich feststellen.
Ich habe die BrownOut-detection mit 4.3V aktiviert.


Kann es sein, dass der uC beim Einschalten nicht ordentlich initialisert 
wird ?

Bin nun echt schon am verweifeln.
Könnt Ihr mir helfen ?
Würde mir die entscheidente Hilfe auch was kosten lassen.

hmg
Mandi

von michael (Gast)


Lesenswert?

hallo manfred.

natürlich kann es es sein, dass der uC beim einschalten nicht ordentlich 
initialisert wird.
du könntest z.b. vergessen haben, die timer-interrupts zu enablen 
(register TIMSK1).
mit sicherheit kann ich das aber erst sagen, wenn ich den quellcode 
gesehen hab ;-)

gruß

michael

von Manfred Schön (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Michael

>>du könntest z.b. vergessen haben, die timer-interrupts zu enablen
>>(register TIMSK1).

Am Schreibtisch im Büro funktioniert ja alles. Also sollte ich nichts 
vergessen haben ?

Ich denke eher dass der uC keinen ordentlichen Reset beim PowerUp macht 
und daher stellenweise tut was er will ?

Beiliegend der Code. Wäre echt toll wenn Du mal drauf schaun könntest.
Ab Zeile 331 befindet sich der Bereich wo das Problem auftritt.


Vielen Dank im voraus.

hmg
Mandi

von Manfred Schön (Gast)


Lesenswert?

Hallo

Niemand da der mir weiterhelfen kann ?   :-(

hmg
Mandi

von Andreas K. (a-k)


Lesenswert?

Manfred Schön wrote:

> ATMEGA88  programmiert on BASCOM  ( mit Inline Assembler )

Nicht wundern, wenn wenig Antworten kommen. "BASCOM" klingt für viele 
hier wie "Zahnarzt" ;-).

> Ich verwende den Timer0 als einstellbaren Taktgenerator.
> Diesen Takt führe ich Timer1 zu.

Da fängt's schon an wunderlich zu werden. Wozu dieses Konstrukt?

> Timer1 verwende ich zum messen der Zeit zwischen zwei Digitalimpulsen.

Normalerweise verwendet man für sowas Timer Capture.

> Kann es sein, dass der uC beim Einschalten nicht ordentlich initialisert
> wird ?

Sowas kann man durchaus erreichen, beispielsweise durch falsche 
Startup-Time bei Quarz, schnarchlangsam ansteigende Spannungsversorgung.

Üblicherweise sind solche Hardwareprobleme aber in Wahrheit 
Softwareprobleme.

von Manfred Schön (Gast)


Lesenswert?

Hallo Andreas Kaiser

>Nicht wundern, wenn wenig Antworten kommen. "BASCOM" klingt für viele
>hier wie "Zahnarzt" ;-).

Hab mich auch schon über Bascom geärgert. Aber für Kleinigkeiten ist es 
einge güntige schnell zu erlernende Möglichkeit....

>> Ich verwende den Timer0 als einstellbaren Taktgenerator.
>> Diesen Takt führe ich Timer1 zu.
> Da fängt's schon an wunderlich zu werden. Wozu dieses Konstrukt?

Der Zeitintervall kann sehr stark variieren.
Muss bei kurzen Intervallen eine hohe Genauigkeit erreichen.
Bei langen Intervallen ist die Genauigkeit nicht so wichtig. Es würde 
aber bei hoher Taktrate der Zähler überlaufen.

>> Timer1 verwende ich zum messen der Zeit zwischen zwei Digitalimpulsen.
>Normalerweise verwendet man für sowas Timer Capture.

Wenn immer so einfach wäre. würde wohl auch mit Timer Capture gehen.
Wäre aber eben nicht so einfach.... Habe mich daher für die 
Softwareversion entschieden.

>> Kann es sein, dass der uC beim Einschalten nicht ordentlich initialisert
>> wird ?
>Sowas kann man durchaus erreichen, beispielsweise durch falsche
>Startup-Time bei Quarz, schnarchlangsam ansteigende Spannungsversorgung.

>Üblicherweise sind solche Hardwareprobleme aber in Wahrheit
>Softwareprobleme.

Auf ein Softwareproblem hab' ich auch erst getippt, da ich noch nicht 
soviel Erfahrung mit dem AVR habe. Da es aber am Schreibtisch 
einwandfrei läuft, kann's das wohl nicht sein.

hmg
Mandi

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.