Forum: Compiler & IDEs Olimex P28 Board Problem


von Nicolas K. (Gast)


Lesenswert?

Hallo Mikrocontroller.net Gemeindschaft

Ich hab mir das AVR Starterkit (inkl. USB Programmer) hier im Shop 
gekauft alles ok bis her.


Aber wenn ich den Quelltext unten compiliere leuchtet einfach die Led 
auf dem Board auch wenn ich nichts gedrückt habe. Das kommt öffters vor 
das der Quelltext nicht so ausgeführt wird wie ich es versucht hab zu 
programmieren.
Im Simulator läuft das Programm richtig ab nur auf dem Mikrocontroller 
nicht.

C/C++ programmier ich schon seit 4 Jahren.

Ich versuche momentan als Übung verschiedenen Tasterzustände zu 
programmieren, um mich in die Materie der uC einzuarbeiten.
Vielleicht hab ich doch etwas falsch gemacht.
1
#include <avr/io.h>
2
#include <avr/delay.h>
3
#include <avr/interrupt.h>
4
5
#include <stdint.h>
6
7
8
uint16_t time = 0;
9
10
11
ISR( TIMER0_OVF_vect );
12
13
void blink(int8_t i);
14
15
16
int main(void)
17
{
18
  
19
  uint8_t click = 0;
20
  
21
22
23
  DDRC |= ( 1 << PC5 );
24
  DDRD &= ~( 1 << PIND2 );
25
  
26
  TIMSK |= ( 1 << TOIE0 );
27
  
28
  
29
  sei();
30
  
31
  
32
    while(1)
33
    {
34
    
35
    
36
    if( time < 2200 || click != 2)
37
    {
38
      
39
      if( PIND & ( 1 << PIND2 ) )
40
      {
41
        
42
        if( TCCR0 == 0)
43
        {
44
          
45
            TCCR0 |= ( 1 << CS00 ) | ( 1 << CS01 );
46
          
47
            click+=1;
48
          
49
        }
50
        
51
      }else
52
      {
53
        
54
        if( TCCR0 != 0)
55
        {
56
          
57
          TCCR0 = 0x00;
58
          
59
        }
60
        
61
      }
62
      
63
    }else
64
    {
65
      
66
      if( TCCR0 != 0)
67
      {
68
        
69
        TCCR0 = 0x00;
70
        
71
      }
72
      
73
      
74
      
75
      if( time < 2000 )
76
      {
77
        
78
        if( click < 2)
79
        {
80
          
81
          blink( 1 );
82
          
83
        }else
84
        {
85
          
86
          blink( 2 );
87
          
88
        }
89
        
90
      }else
91
      {
92
        
93
        blink( 3 );
94
        
95
      }
96
      
97
      
98
      click = 0;
99
      time = 0;
100
      
101
    }
102
    
103
    
104
      
105
    
106
    
107
    
108
    }
109
  
110
}
111
112
113
114
ISR( TIMER0_OVF_vect )
115
{
116
  
117
  time++;
118
  
119
}
120
121
122
 
123
124
void blink( int8_t i)
125
{
126
  
127
  for( int8_t j = 0; j < i; j++)
128
  {
129
    
130
    PORTC |= ( 1 << PC5);
131
    
132
    _delay_ms( 500 );
133
    
134
    PORTC &= ~( 1 << PC5);
135
    
136
    _delay_ms( 500 );
137
    
138
  }
139
  
140
}

von Stefan E. (sternst)


Lesenswert?

1. "volatile" fehlt.
2. Taster-Logik ist verkehrt herum.
3. Zugriffe auf time in main() sind nicht atomar.
4. LED-Logik ebenfalls verkehrt herum.

von Nicolas K. (Gast)


Lesenswert?

Danke für die Fehleranalyse.
Noch paar fragen:

Was kann ich unter Taster/Led-Logik verstehen ?
Und zugriffe auf time in main() sind nicht atomar. ?

von Stefan E. (sternst)


Lesenswert?

Nicolas K. schrieb:
> Was kann ich unter Taster/Led-Logik verstehen ?

Vor dem Schreiben der Software musst du halt mal einen Blick auf die 
Hardware (Schaltplan) werfen. Einfach anzunehmen, dass ein gedrückter 
Taster am Port ein High erzeugt, ist ganz schlecht. Ebenso falsch ist 
es, einfach anzunehmen, dass ein High am Port die LED einschaltet.

Nicolas K. schrieb:
> Und zugriffe auf time in main() sind nicht atomar. ?

Für deine ersten Spielereien hier kannst du das erst mal außer Acht 
lassen. Aber für spätere "richtige" Programme ist dieses Thema SEHR 
wichtig. Eigentlich hätte ich erwartet, dass jemand der
> C/C++ programmier ich schon seit 4 Jahren.
etwas mit dem Begriff "atomar" anfangen kann. Wenn nicht, dann ->Google 
oder ->Wikipedia.

von Nicolas K. (Gast)


Lesenswert?

Ok hab mir mal den Schaltplan angeschaut und es ist ein low Signal :D
Und jetzt weiß ich auch was mit atomar gemeint ist.
In c++ wird die Klasse atomic genannt deswegen konnt ich nichts mit 
atomar anfangen :D

Noch mal vielen Dank für die hilfe.

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.