Forum: Mikrocontroller und Digitale Elektronik Timer Probleme ATMEGA128


von Markus S. (schabbi)


Angehängte Dateien:

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

von Thomas E. (thomase)


Lesenswert?

Atmega103-Fuse.

mfg.

von g457 (Gast)


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.

von holger (Gast)


Lesenswert?

>PS:Der Programmcode ist im Anhang

Das kann nicht der Code sein den du verwendest.
Der geht so durch keinen Compiler.

von Spess53 (Gast)


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

von Markus S. (schabbi)


Lesenswert?

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.

mfg

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Markus S. (schabbi)


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

von spess53 (Gast)


Lesenswert?

Hi

Habe ich doch schon hier:

Beitrag "Re: Timer Probleme ATMEGA128"

geschrieben.

Mit der zweiten Anweisung wird die erste Einstellung überschrieben.

MfG Spess

von Uwe (de0508)


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 ?

von Karl H. (kbuchegg)


Lesenswert?

Uwe S. schrieb:
> Hallo,
>
> ich habe noch eine Verständnis Frage, im Code wird keine der AVR
> Headerdateien geladen.

Der Code ist ganz offensichtlich nicht vollständig gepostet.

Es gibt ja zb auch kein
1
int main()
2
{
3
  ...

obwohl es das ja offensichtlich geben MUSS.

von Schabbi (Gast)


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

von Karl H. (kbuchegg)


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.

von Björn (Gast)


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

von Schabbi (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Schabbi schrieb:

>> 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

Es ging eher um den Unterschied von

TIMSK=1<<TOIE1;
und
TIMSK|=1<<TOIE1;

von Schabbi (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> TIMSK|=1<<TOIE1;


Ok das ist die schreibweise um das bit anzusprechen.(Und natürlich 
übersichtlicher da man nicht im datenblatt nachschauen muss was bei 
welchem bit passiert).



aber was hat es mit dem querstrich auf sich?

TIMSK|=1<<TOIE1;

von gfhf (Gast)


Lesenswert?

Schabbi schrieb:
> aber was hat es mit dem querstrich auf sich?
>
> TIMSK|=1<<TOIE1;


das steht in jedem C buch ...

von Schabbi (Gast)


Lesenswert?

gfhf schrieb:
> TIMSK|=



binäres ODER

;-)

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.