Forum: Mikrocontroller und Digitale Elektronik [ATMega32]Unbekannter Fehler beim Timer0 overflow


von Jahn-Hendrik K. (pitillo)


Lesenswert?

Hallo,
ich habe einen code für eine Maschine ähnlich einer CNC-Fräse 
geschrieben darin gibt es jedoch probleme beim Timer0 und ich weiß 
einfach nich wo der fehler entsteht und wie ich ihn beheben soll.
Main.c
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#define F_CPU 1000000UL  // 1 MHz
4
#include <util/delay.h> 
5
#include "Main.h"
6
7
8
9
int main(void)
10
{
11
   //Timer 0 auf 1024 prescale
12
   TCCR0 = (1<<CS01 | 1<<CS02);
13
   // Overflow Interrupt erlauben
14
   TIMSK |= (1<<TOIE0);
15
   //interupts erlauben
16
   sei();
17
  //Port C als eingang definieren
18
   DDRC = 0x00;
19
   DDRD  = 0xFF;
20
   Motor3 = 0;
21
   //in Motor1 und 2 wird die anzahl der schritte pro tastendruck angegeben
22
   Motor2 = 0;
23
   Motor1 = 0;
24
   while (1)
25
   {
26
     //Taster abfragen
27
     if (PINC0 == 1) 
28
     {
29
       Motor3 =+ 1;
30
     }         
31
     if (PINC1 == 1)
32
     {
33
      Motor3 =- 1;
34
     }
35
     if (PINC2 == 1)           
36
     {
37
       
38
       for (uint8_t i = Motor1;i++;)
39
       {
40
         if (M1 == 1)
41
         {
42
           PORTD = (1<<PD0);
43
         }
44
         if (M1 == 0)
45
         {
46
           PORTD = (0<<PD0);
47
         }
48
         PORTD = (1<<PD1);
49
         _delay_ms(1);
50
         PORTD = 0x00;
51
         _delay_ms(1);       
52
       }         
53
     }    
54
     if (PINC3 == 1)           
55
     {
56
       for (uint8_t i = Motor1;i++;)
57
       {
58
         if (M1 == 0)
59
         {
60
           PORTD = (1<<PD0);
61
         }
62
         if (M1 == 1)
63
         {
64
           PORTD = (0<<PD0);
65
         }
66
         PORTD = (1<<PD1);
67
         _delay_ms(1);
68
         PORTD = 0x00;
69
         _delay_ms(1);     
70
       }        
71
     }     
72
     if (PINC4 == 1)           
73
     {
74
       for (uint8_t i = Motor2;i++;)
75
       {
76
         if (M2 == 1)
77
         {
78
           PORTD = (1<<PD2);
79
         }
80
         if (M2 == 0)
81
         {
82
           PORTD = (0<<PD2);
83
         }
84
         PORTD = (1<<PD3);
85
         _delay_ms(1);
86
         PORTD = 0x00;
87
         _delay_ms(1);
88
         PORTD = 0x00  ;       
89
     }    
90
     if (PINC5 == 1)           
91
     {
92
       for (uint8_t i = Motor2;i++;)
93
       {
94
         if (M2 == 0)
95
         {
96
           PORTD = (1<<PD2);
97
         }
98
         if (M2 == 1)
99
         {
100
           PORTD = (0<<PD2);
101
         }
102
         PORTD = (1<<PD3);
103
         _delay_ms(1);
104
         PORTD = 0x00;
105
         _delay_ms(1);
106
         PORTD = 0x00;       
107
      }    
108
     }   
109
   }
110
  
111
}
112
#ifndef TIMER0_OVF_vect
113
#define TIMER0_OVF_vect TIMER0_OVF0_vect
114
#endif
115
ISR (TIMER0_OVF_vect)
116
{
117
  for (uint8_t i = Motor3; i++;)
118
  {
119
    if (M3 == 1)
120
    {
121
      PORTD = (1<<PD4);
122
    }
123
    PORTD = (1<<PD5);
124
    _delay_ms(1);
125
    PORTD = 0x00;
126
    _delay_ms(1);
127
  }
128
  for (uint8_t i = Motor3; i++;)
129
  {
130
    if (M3 == 1)
131
    {
132
      PORTD = (0<<PD4);
133
    }
134
    PORTD = (1<<PD5);
135
    _delay_ms(1);
136
    PORTD = 0x00;
137
    _delay_ms(1);
138
  }
139
}
Und auch noch die Header Datei
1
//Drehrichtungs einstellung
2
#define M1 1
3
#define M2 1 
4
#define M3 1
5
unsigned int Motor1 = 0;
6
unsigned int Motor2 = 0;
7
unsigned int Motor3 = 0;
ich hoffe ihr könnt mir helfen

von Karl H. (kbuchegg)


Lesenswert?

Jahn-Hendrik K. schrieb:

> ich hoffe ihr könnt mir helfen

Wie soll ich es dir sagen?

OK. Die freundliche Variante ist: in deinem Code gibt es eine Menge 
Probleme.

Die aufrichtige Variante: Lern bitte erst mal die Grundlagen, ehe du 
dich an die reale Harware wagst und noch etwas kaputt machst. In deinem 
Code sind in 3 Zeilen (überspitzt ausgedrückt) 5 Fehler. Und zwar von 
oben bis unten. Fast egal, welche 3 Zeilen man herausnimmt.
Und das fängt bereits beim Setzen von bestimmten Portpins auf 1 oder 0 
an, geht weiter über die korrekte Syntax von for-Schleifen und endet 
nnoch lange nicht beim Abfragen von Portpins. Über so Kleinigkeiten wie 
einem total verkorkstem Aufbau der ISR reden wir erst mal gar nicht. 
Dass du deine Eingabepins nicht flankengesteuert und entprellt abfragst 
und daher die Variable Motor3 (mehr oder weniger zufällig) ihren Wert 
gar nicht ändern kann, weil sich die Effekte der Portpins, so man sie 
korrekt abfragen würde, aufheben ist dann nur noch das Sahnehäubchen.

von Mutti (Gast)


Lesenswert?

Mache niemals delays in Interrup methoden.

 TCCR0 = (1<<CS01 | 1<<CS02) ergibt m.E nicht 1024 prescale
Prüfe das bitte nochmal.

von Jahn-Hendrik K. (pitillo)


Lesenswert?

könntet ihr mir vielleicht sagen was genau meine fehler waren ich hab 
mir die grundlagen bereits durchgelesen ich hab halt vorherr nur NXT´s 
programmiert(in NXC) deswegen dachte ich mir wenn ich mir das tutorial 
durchlese wird das schon nicht so schwer werden. vorher hab ich 
eigendlich auch bascom nutzen wollen jedoch reichen mir evt die 4kb 
nachherr nicht ausalso fing ich an avr gcc zu lernen und assambler....
könntet ihr mir wirklich ma bitte sagen was ich beim programmieren 
falsch mache  wäre wirklich super nett von euch

MfG Pitillo

von Oliver (Gast)


Lesenswert?

Jahn-Hendrik K. schrieb:
> und ich weiß
> einfach nich wo der fehler entsteht

Nun ja, wenn du nicht mal beschreiben kannst, wie sich "der Fehler" 
(bzw. "unbekannter Fehler") eigentlich äussert, wird es sehr schwer.

Jahn-Hendrik K. schrieb:
> deswegen dachte ich mir wenn ich mir das tutorial
> durchlese wird das schon nicht so schwer werden.

Das ist schon nmal ein guter Ansatz, nur reicht lesen nicht. Du solltest 
das Kapitel für Kapitel durcharbeiten und ausprobieren, so lange, bis 
das dort besprochene auf deinem Prozessor tut, was es soll.

Erst, wenn du erfolgreich IO setzen und lesen, einen Taster abfragen, 
und eine LED per Timer blinken lassen kannst, erst dann kannst du 
vielleicht mal drüber nachdenken, das alles zu einem größeren Programm 
zusammenzusetzen.

Oliver

von Ulrich (Gast)


Lesenswert?

Da sind viele Fehler drin, vielleicht nicht ganz so viele wie in der 
ersten Antwort angedroht, aber doch reichlich.

Einer der ersten ist:
 if (PINC0 == 1)

PINC0 ist als eine Konstante (=0) definiert, die die Bit Nummer angibt. 
Der sollte der Compiler ein if (0 == 1) sehen und entsprechend eine 
Warnung ausgeben, dass die Bedingung immer Falsch ist.

Auch sonst sind da noch grobe Patzer dirn, es fehlt z.B. eine Entprellen 
der Taster, Delay im Interrupt, kein Volatile.

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.