Timer Probleme ATMEGA128

OP #3194187
Lesenswert?

Guten Abend,

Wir (Techniker Projektgruppe) programmieren gerade eine Platinen Fräse.

Nun stehen wir gerade vor einem Problem:

Wir benutzen 2 Timer Interrupts im Programm um gerber daten von der SD 
Karte einzulesen(Timer1) und möchten jetzt noch einen Timer benutzen um 
unsere Geber (Timer 0) einzulesen.
Wenn wir beide Timer mit TIMSK aktivieren stehen beide irgendwie im 
Konflikt und funktionieren nicht.

Wenn wir die Timer einzeln aktivieren funktioniert sie beide ohne 
Probleme.

Danke schonmal für eure Hilfe.

PS:Der Programmcode ist im Anhang
Angehängte Dateien:
Gast #3194203
Lesenswert?

> Wir benutzen 2 Timer Interrupts im Programm um gerber daten von der SD
> Karte einzulesen(Timer1) und möchten jetzt noch einen Timer benutzen um
> unsere Geber (Timer 0) einzulesen.

SD-Kartenzugriffe ∗in∗ der ISR? Der angehängte Code sieht sauber 
unvollständig aus, sonst würd ichs selber prüfen. Zumindest in der Main 
passiert nicht das, was passieren sollte. Also passierts vermutlich in 
der ISR.

> Wenn wir die Timer einzeln aktivieren funktioniert sie beide ohne
> Probleme.

Das sieht nur so aus.
Gast #3194209
Lesenswert?

Hi

>Wir benutzen 2 Timer Interrupts im Programm um gerber daten von der SD
>Karte einzulesen(Timer1) und möchten jetzt noch einen Timer benutzen um
>unsere Geber (Timer 0) einzulesen.

Nein, ihr benutzt nur einen:

TIMSK=1<<TOIE0;

TIMSK=1<<TOIE1;

Und das ganze Register=0 könnt ihr euch sparen. Das macht der Controller 
beim Reset automatisch.

MfG Spess
#3194586
Lesenswert?

Markus Sch schrieb:
> Thomas Eckmann schrieb:
>> Atmega103-Fuse.
>>
>> mfg.
>
>
> Erstmal danke für die Antwort, aber wie bekommen wir mit code vision avr
> das 103c fuse gesetzt bzw. nicht gesetzt.

Fuses setzen bzw. löschen ist eine Tätigkeit, die dein Brennprogramm 
unterstützt.

D.h. du musst in dem Programm nachsehen, mit dem du deine Ergüsse in den 
µC brennst.
Dabei:
  Fuses auslesen
  Wenn das Brennprogramm die Bits nicht aufschlüsselt, dann benutze
  den Fuse-Calculator
  http://www.engbedded.com/fusecalc
  um sie zu identifizieren.
  Dann verschaff dir einen Überblick, indem du zb die ausgelesenen
  Fuses mit den im Datenblatt angegebenen Default-Werten vergleichst

  Die Fuses setzen, die du gesetzt haben willst

  und brennen.


Bei den Fuses sind die Fuses über die Taktversorgung kritisch. Wenn du 
die falsch setzt, dann sperrst du dich aus dem µC aus. Daher: die 
unbedingt in Ruhe lassen, solange du daran nicht rumfummeln musst. Und 
daher solltest du auch immer die Fuses erst mal auselesen, damit du 
tatsächlich und wirklich nur die Fuses umstellst, die umgestellt werden 
sollen.

Aber so wie es aussieht, steht die M103-Fuse ohnehin korrekt. Eine 
falsche Einstellung würde zu dem Symptom führen, dass der µC beim Return 
vom ersten Funktionsaufruf abstürzt. Und den Fall habt ihr ja nicht.
#3194592
Lesenswert?

Allerdings solltet ihr auf diesen Code-Wizard verzichten, bzw. das was 
der euch generiert hat aufarbeiten.

Der COde ist extrem in die Länge gezogen und daurch extrem 
unübersichtlich. Damit ist euch auch entgangen, dass TIMSK falsch 
benutzt wird und das zweite Bit-Setzen die erste Einstellung wieder 
löscht.
Diese anfängliche Registersetzorgie (selbst von Dingen die im Programm 
gar nicht vorkommen), ist einfach nur unübersichtlich und schwer zu 
warten.
OP #3194654
Lesenswert?

Karl Heinz Buchegger schrieb:
> Allerdings solltet ihr auf diesen Code-Wizard verzichten, bzw. das was
> der euch generiert hat aufarbeiten.
>
> Der COde ist extrem in die Länge gezogen und daurch extrem
> unübersichtlich. Damit ist euch auch entgangen, dass TIMSK falsch
> benutzt wird und das zweite Bit-Setzen die erste Einstellung wieder
> löscht.
> Diese anfängliche Registersetzorgie (selbst von Dingen die im Programm
> gar nicht vorkommen), ist einfach nur unübersichtlich und schwer zu
> warten.


Hallo Karl Heinz du hast recht das der Timer 0 interuppt dadurch nicht 
funktioniert.

Nur blicken wir momentan nicht durch wie wir das Problem beseitigen und 
wo der Timer zurück gesetzt wird?

mfg
#3194677
Lesenswert?

Hallo,

ich habe noch eine Verständnis Frage, im Code wird keine der AVR 
Headerdateien geladen.

Bei avr-gcc also so etwas:
1
// avr gcc include
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5
#include <avr/wdt.h>
6

7
// std c include
8
#include <stdint.h>
9
#include <stdlib.h>
10
// :

Wie ist das Bei deinem Paket ?
Gast #3194698
Lesenswert?

Uwe S. schrieb:
> Hallo,
>
> ich habe noch eine Verständnis Frage, im Code wird keine der AVR
> Headerdateien geladen.
>
> Bei avr-gcc also so etwas:// avr gcc include
> #include <avr/io.h>
> #include <avr/interrupt.h>
> #include <avr/pgmspace.h>
> #include <avr/wdt.h>
>
> // std c include
> #include <stdint.h>
> #include <stdlib.h>
> // :
>
> Wie ist das Bei deinem Paket ?


Hi Uwe der Programmcode ist nur die Initialisierung der Timer.
Den Rest habe ich weggelassen.
Denn in diesem Teil werden die Timer gestartet bzw. die Interrupts.

mfg
#3194703
Lesenswert?

Markus Sch schrieb:

> Nur blicken wir momentan nicht durch wie wir das Problem beseitigen und
> wo der Timer zurück gesetzt wird?

Ich würd mal hergehen und alles rauswerfen, was im Projekt nicht 
gebraucht wird (zumindest jetzt noch nicht)

Kommt ein ADC vor?
Nein!
Dann weg damit

Kommt ein Timer 2 vor?
Nein!
Dann weg damit

etc. etc.
Und diese ganze ZUweisungen von Hex-Zahlen an die 
Konfigurationsregister. Mir ist bis heute rätselhaft, warum Codevision 
das so macht. Auf der einen Seite generieren sie da Kommentare, welche 
Einstellung realisiert wird (was grundsätzlich eine gute Sache ist), auf 
der anderen Seite generieren sie den (fast) schlechtest möglich lesbaren 
Code dafür.
Und den dann auch noch in die Länge gezogen.

Aufräumen!
Oder den Code noch mal neu, aber diesmal leselich(!) schreiben!

ja das geht. Die ganze Initialisierung lässt sich in ca. 10 Zeilen 
ausdrücken anstatt sich über 3 Seiten hinzuziehen.

Und dann verliert man auch nicht den Überblick, welche Komponenten mit 
welcher Konfiguration aktiviert wurden und welche nicht.


Und wie man einzelne Bits in einem Register gezielt auf 1 setzt, 
brauchen wir uns ja hoffentlich bei einer Abschlussarbeit nicht mehr 
unterhalten.
Gast #3194729
Lesenswert?

Hallo zusammen,

nein das ist natürlich nicht der vollständige Code,

Da fehlen auch noch diverse Funktionen usw... die header haben wir 
natürlich auch drin.Das ganze Programm läuft ja abgesehen von dem 
zweiten Timer.

Der fehlende Teil sollte aber nichts mit der Timerproblematik zu tun 
haben

Gruß Björn
Gast #3194767
Lesenswert?

Karl Heinz Buchegger schrieb:
> Markus Sch schrieb:
>
>> Nur blicken wir momentan nicht durch wie wir das Problem beseitigen und
>> wo der Timer zurück gesetzt wird?
>
> Ich würd mal hergehen und alles rauswerfen, was im Projekt nicht
> gebraucht wird (zumindest jetzt noch nicht)
>
> Kommt ein ADC vor?
> Nein!
> Dann weg damit
>
> Kommt ein Timer 2 vor?
> Nein!
> Dann weg damit
>
........................
>
>
> Und wie man einzelne Bits in einem Register gezielt auf 1 setzt,
> brauchen wir uns ja hoffentlich bei einer Abschlussarbeit nicht mehr
> unterhalten.


Dann werden wir das mal tun.
 TIMSK0=0b00000001

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren