Forum: Mikrocontroller und Digitale Elektronik Code auf dem Atmega 8535 funktioniert nicht


von Fabian G. (deloz)


Angehängte Dateien:

Lesenswert?

Hallo,

ich verzweifel hier grad an einem Stück Code.
Ohne die init Bestandteile funktionierte alles super und problemlos, nun 
sitz ich hier schon ewig und kann den Fehler nicht finden.
Hab eben die "init" eingefügt und einen dritten Timer (den 16 Bit Timer 
1) gestartet.

Es gibt keine weiteren Files wie ausgelagerte Funktionen .h files o.ä.
-obwohl eine header-datei bestimmt sinnvoll wäre ;)

Würd mich freuen wenn jemand den Fehler findet.
Auch gegen andere Verbesserungsvorschläge hab ich nix ;)
Ist bestimmt ne Menge, ist mein erstes richtiges Projekt, soll einen 
Dudelsack emulieren ;)

Läuft mit nem externen Quarzsoszillator.
Ich hoffe die Kommentare helfen weiter.
Ansonsten versuch ich es.

Gruß Fabian
1
#ifndef F_CPU
2
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert 
3
   (z. B. durch Übergabe als Parameter zum Compiler innerhalb 
4
   des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
5
   "nachträgliche" Definition hinweist */
6
#warning "F_CPU war noch nicht definiert, wird nun mit 16000000 definiert"
7
#define F_CPU 16000000UL     /* Quarz mit 16.0000 Mhz */
8
#endif
9
10
//Include Befehle
11
#include <avr/io.h>
12
#include <util/delay.h>
13
#include <stdint.h>
14
#include <stdlib.h>
15
#include <avr/interrupt.h> 
16
        
17
18
/*##################################
19
Deklaration von WERTEN, siehe https://spreadsheets.google.com/ccc?key=0ApVkwGSItH4tdHowd0ZPLWFTQVMyOTFmejhoSDhiUnc&hl=en&authkey=CKvg5NIE 
20
##################################*/
21
22
#define    CLK    16000000            
23
#define    PRESCALER_TIMER_0    1            
24
#define    PRESCALER_TIMER_2    1            
25
#define    PWM_MAX    256            //Bis hierhin zählt die PWM
26
#define    TIMER_MAX    256            //Bis hierhin zählt der Timer
27
                    
28
#define    TIMER_FREQ    31250            
29
#define    PWM_FREQ    31128.4046692607            // clk/(prescaler(1 + OCR))
30
#define    FAIL    500            
31
                    
32
//Spielmodi                    
33
#define    FRENCH    0            
34
#define    BAROCK    1            
35
                    
36
//Tonfrequenzen bei French        
37
#define    FRENCH_F0    348.444444444444
38
#define    FRENCH_G0    392
39
#define    FRENCH_GIS0    418.133333333333
40
#define    FRENCH_A0    441
41
#define    FRENCH_B0    470.4
42
#define    FRENCH_H0    490
43
#define    FRENCH_C0    522.666666666667
44
#define    FRENCH_CIS0    551.25
45
#define    FRENCH_D0    588
46
#define    FRENCH_DIS0    627.2
47
#define    FRENCH_E0    653.333333333333
48
#define    FRENCH_F1    696.888888888889
49
#define    FRENCH_FIS1    735
50
#define    FRENCH_G1    784
51
//Tonfrequenzen bei Barock        
52
#define    BAROCK_C0    264
53
#define    BAROCK_D0    297
54
#define    BAROCK_DIS0    316.8
55
#define    BAROCK_E0    334.125
56
#define    BAROCK_F0    356.4
57
#define    BAROCK_FIS0    371.25
58
#define    BAROCK_G0    396
59
#define    BAROCK_GIS0    417.65625
60
#define    BAROCK_A0    445.5
61
#define    BAROCK_B0    475.2
62
#define    BAROCK_H0    495
63
#define    BAROCK_C1    528
64
#define    BAROCK_CIS1    556.875
65
#define    BAROCK_D1    594
66
        
67
//Additionen bei French        
68
#define    ADD_FF0    11.4178275555555
69
#define    ADD_FG0    12.845056
70
#define    ADD_FGIS0    13.7013930666667
71
#define    ADD_FA0    14.450688
72
#define    ADD_FB0    15.4140672
73
#define    ADD_FH0    16.05632
74
#define    ADD_FC0    17.1267413333333
75
#define    ADD_FCIS0    18.06336
76
#define    ADD_FD0    19.267584
77
#define    ADD_FDIS0    20.5520896
78
#define    ADD_FE0    21.4084266666667
79
#define    ADD_FF1    22.8356551111111
80
#define    ADD_FFIS1    24.08448
81
#define    ADD_FG1    25.690112
82
//Additionen bei Barock        
83
#define    ADD_BC0    8.650752
84
#define    ADD_BD0    9.732096
85
#define    ADD_BDIS0    10.3809024
86
#define    ADD_BE0    10.948608
87
#define    ADD_BF0    11.6785152
88
#define    ADD_BFIS0    12.16512
89
#define    ADD_BG0    12.976128
90
#define    ADD_BGIS0    13.68576
91
#define    ADD_BA0    14.598144
92
#define    ADD_BB0    15.5713536
93
#define    ADD_BH0    16.22016
94
#define    ADD_BC1    17.301504
95
#define    ADD_BCIS1    18.24768
96
#define    ADD_BD1    19.464192
97
        
98
//Dauertöne        
99
#define    DAUERC    4.325376
100
#define    DAUERD    4.866048
101
#define    DAUERG    3.211264
102
/*##################################
103
Deklarationen
104
##################################*/
105
//Funktionen
106
void blinky(); 
107
void dauerton(); 
108
int init(); 
109
110
//Globale Variablen
111
volatile unsigned long addition = 0;
112
volatile unsigned long daueradd = 0;
113
volatile char flag = 0; 
114
115
116
int main( void )
117
{    //IO
118
    DDRB = 0xff;                    //Port B als Ausgang        
119
    DDRD = 0x00;                     //Port D als Eingang
120
    DDRA = 0b11110100;                 //nur Pin 1,2,4 als eingang
121
122
    //TIMER 0  => PWM
123
    TCCR0 = 0;                         //definiert 0
124
    TCCR0 |= (1<<WGM01)|(1<<WGM00); //FAST PWM 8bit
125
    TCCR0 |= (1<<COM01);            //Nicht invertierend
126
    TCCR0 |= (1<<CS00);             //Prescalen:  clk / 1 
127
128
    OCR0 = 0x00;                     //Vergleichswert, 8bit
129
130
131
    //Timer 1 => Metronom             (16 Bit, manipulation von "flag"), zählt von Bottom to Top (CTC) (stored in OCR1A)
132
    TCCR1A = 0; 
133
    TCCR1A |= (1<<WGM12);             //CTC TOP = OCR1A, TOV SET On Max
134
    TCCR1A |= (1<<COM1A0);             //Toggle
135
136
    TCCR1B = 0; 
137
    TCCR1B |= (1<<CS12)|(1<<CS10);    // Prescaler = 1024
138
139
140
        
141
    //Timer2 für OCR0 Befüllung / Sägezahnerzeugung
142
    TCCR2 = 0; 
143
    TCCR2 |= (1<<CS20);             //Vorteiler = 1; 
144
    TIMSK |= (1<<TOIE2);             //Nach jedem Oferflow wird ein Interrupt gestartet
145
    
146
    sei();                             //Globale Interrupts erlauben, Interrupts via ISR();
147
148
149
    //Variablen
150
    char mode = BAROCK;
151
    int metronom = 0; 
152
    //init
153
    metronom = init();                 //format: ms*10
154
    OCR1A = (metronom*156.25); 
155
    
156
    if (PINA & 0b00001000) {
157
        mode = FRENCH;
158
        }
159
160
    while( 1 ) {                    // Endlosschleife
161
162
     if (mode == FRENCH){            //if =>french
163
            switch(PIND){                //Griffabfrage + Add abfrage (1mhz / 256) => ISR löst 3906,25 mal / sek aus. ### [hz*256(pwm schritte)] / 3906,25 ergibt addition pro isr
164
                case 0b11111111 : addition = ADD_FF0 ; break; //F0
165
                case 0b11111110 : addition = ADD_FG0 ; break; //G0
166
                case 0b11111100 : addition = ADD_FA0 ; break; //A0
167
                case 0b11111000 : addition = ADD_FB0 ; break; //B0
168
                case 0b11110100 : addition = ADD_FH0 ; break; //H0
169
                case 0b11100100 : addition = ADD_FC0 ; break; //C0
170
                case 0b11010100 : addition = ADD_FCIS0 ; break; //Cis0
171
                case 0b11011110 : addition = ADD_FD0 ; break; //D0
172
                case 0b10100100 : addition = ADD_FDIS0 ; break; //Dis0
173
                case 0b10011110 : addition = ADD_FE0 ; break; //E0
174
175
                case 0b01011110 : addition = ADD_FF1 ; break; //F1
176
                case 0b00011110 : addition = ADD_FFIS1 ; break; //Fis1
177
                case 0b01111110 : addition = ADD_FF1 ; break; //g1 =>Zeigefinger statt Daumen weg
178
                default : addition = FAIL; 
179
                            
180
                } //end Griffabfrage
181
            } //end if
182
            else if (mode == BAROCK){                    //if =>Barock    
183
                switch(PIND){                //Griffabfrage + Add abfrage (1mhz / 256) => ISR löst 3906,25 mal / sek aus. ### [hz*256(pwm schritte)] / 3906,25 ergibt addition pro isr
184
                    case 0b11111111 : addition = ADD_BC0 ; break; //C0
185
                    case 0b11111110 : addition = ADD_BD0 ; break; //D0
186
                    case 0b11111100 : addition = ADD_BE0 ; break;//E0
187
                    case 0b11111000 : addition = ADD_BF0 ; break;//F0
188
                    case 0b11110111 : addition = ADD_BFIS0 ; break; //Fis0
189
                    case 0b11110000 : addition = ADD_BG0 ; break; //G0
190
                    case 0b11101100 : addition = ADD_BGIS0 ; break; //Gis0
191
                    case 0b11100000 : addition = ADD_BA0 ; break; //A0
192
                    case 0b11010000 : addition = ADD_BB0 ; break; //B0
193
                    case 0b11000000 : addition = ADD_BH0 ; break; //H0
194
                    case 0b10100000 : addition = ADD_BC1 ; break; //C1
195
                    case 0b10000000 : addition = ADD_BCIS1 ; break; //Cis1
196
                    case 0b00100000 : addition = ADD_BD1 ; break; //D1 =>Zeigefinger statt Daumen weg
197
                    default : addition = FAIL ; break; 
198
                } //end Griffabfrage
199
            }//end else
200
    if (flag == 1) {
201
        PORTB ^= (1<<PB2);
202
        flag = 0; 
203
        }//end if flag
204
    } // end while (1)
205
206
    return 0;
207
} //end main
208
209
210
ISR( TIMER2_OVF_vect ){
211
    static double tmp; 
212
213
    if (daueradd != 0){
214
        tmp += (addition + daueradd); 
215
        if (tmp >= 256) tmp-=256; 
216
        OCR0 = (int) ((tmp+0.5)/2);
217
        return; 
218
        }
219
        
220
    if (addition == FAIL){ //Stummschaltung bei falschen/ keinen Griffen 
221
        OCR0 = 0; 
222
        return;
223
        }
224
    
225
    tmp += addition; 
226
    if (tmp >= 256) tmp-=256; 
227
    OCR0 = (int) (tmp+0.5);
228
}
229
230
ISR( TIMER1_OVF_vect ){
231
    flag = 1; 
232
    }
233
/*#################################
234
init
235
#################################*/
236
237
int init(){
238
    int tmp;         //metronom return
239
    int tmp1 = 0;         //status taster
240
241
    _delay_ms(5000); 
242
    
243
    if (PINA & 0x01) {
244
        daueradd = DAUERC;
245
        }
246
    
247
    if (PINA & 0x02) {
248
        daueradd = DAUERD;
249
        }
250
251
    if (PINA & 0x03) {
252
        daueradd = DAUERG; 
253
        }
254
255
    _delay_ms(100); 
256
    addition = DAUERC; 
257
    _delay_ms(1000); 
258
    addition = FAIL; 
259
260
    while (1){
261
        if ((PINA & 0x01) | (PINA & 0x02) | (PINA & 0x03)){
262
            tmp1 = PINA; 
263
            for (tmp = 0; tmp<419; tmp++){
264
                if (tmp1 != PINA){return tmp;}
265
                _delay_ms(10);                
266
                }//end for
267
            return 0; 
268
            }//end if
269
270
        _delay_ms(100);
271
        if (tmp1 == 50){
272
            return 0;
273
            }
274
        tmp1++; 
275
        }// end while 1        
276
}  //end init

von Karl H. (kbuchegg)


Lesenswert?

Fabian G. schrieb:

> Ohne die init Bestandteile funktionierte alles super und problemlos, nun
> sitz ich hier schon ewig und kann den Fehler nicht finden.

Es wäre gut zu wissen, WAS denn nun eigentlich der Fehler ist.
Es hilft ungemein beim Absuchen eines Codes, wenn man wenigstens 
ungefähr weiß, worauf man sein Augenmerk richten soll.

von Fabian G. (deloz)


Lesenswert?

das wichtigste vergessen....

der uc hängt sich auf.
er reagiert nicht mehr auf eingaben.

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.