mikrocontroller.net

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


Autor: Fabian G. (deloz)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
#ifndef F_CPU
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert 
   (z. B. durch Übergabe als Parameter zum Compiler innerhalb 
   des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
   "nachträgliche" Definition hinweist */
#warning "F_CPU war noch nicht definiert, wird nun mit 16000000 definiert"
#define F_CPU 16000000UL     /* Quarz mit 16.0000 Mhz */
#endif

//Include Befehle
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <stdlib.h>
#include <avr/interrupt.h> 
        

/*##################################
Deklaration von WERTEN, siehe https://spreadsheets.google.com/ccc?key=0ApVkwGSItH4tdHowd0ZPLWFTQVMyOTFmejhoSDhiUnc&hl=en&authkey=CKvg5NIE 
##################################*/

#define    CLK    16000000            
#define    PRESCALER_TIMER_0    1            
#define    PRESCALER_TIMER_2    1            
#define    PWM_MAX    256            //Bis hierhin zählt die PWM
#define    TIMER_MAX    256            //Bis hierhin zählt der Timer
                    
#define    TIMER_FREQ    31250            
#define    PWM_FREQ    31128.4046692607            // clk/(prescaler(1 + OCR))
#define    FAIL    500            
                    
//Spielmodi                    
#define    FRENCH    0            
#define    BAROCK    1            
                    
//Tonfrequenzen bei French        
#define    FRENCH_F0    348.444444444444
#define    FRENCH_G0    392
#define    FRENCH_GIS0    418.133333333333
#define    FRENCH_A0    441
#define    FRENCH_B0    470.4
#define    FRENCH_H0    490
#define    FRENCH_C0    522.666666666667
#define    FRENCH_CIS0    551.25
#define    FRENCH_D0    588
#define    FRENCH_DIS0    627.2
#define    FRENCH_E0    653.333333333333
#define    FRENCH_F1    696.888888888889
#define    FRENCH_FIS1    735
#define    FRENCH_G1    784
//Tonfrequenzen bei Barock        
#define    BAROCK_C0    264
#define    BAROCK_D0    297
#define    BAROCK_DIS0    316.8
#define    BAROCK_E0    334.125
#define    BAROCK_F0    356.4
#define    BAROCK_FIS0    371.25
#define    BAROCK_G0    396
#define    BAROCK_GIS0    417.65625
#define    BAROCK_A0    445.5
#define    BAROCK_B0    475.2
#define    BAROCK_H0    495
#define    BAROCK_C1    528
#define    BAROCK_CIS1    556.875
#define    BAROCK_D1    594
        
//Additionen bei French        
#define    ADD_FF0    11.4178275555555
#define    ADD_FG0    12.845056
#define    ADD_FGIS0    13.7013930666667
#define    ADD_FA0    14.450688
#define    ADD_FB0    15.4140672
#define    ADD_FH0    16.05632
#define    ADD_FC0    17.1267413333333
#define    ADD_FCIS0    18.06336
#define    ADD_FD0    19.267584
#define    ADD_FDIS0    20.5520896
#define    ADD_FE0    21.4084266666667
#define    ADD_FF1    22.8356551111111
#define    ADD_FFIS1    24.08448
#define    ADD_FG1    25.690112
//Additionen bei Barock        
#define    ADD_BC0    8.650752
#define    ADD_BD0    9.732096
#define    ADD_BDIS0    10.3809024
#define    ADD_BE0    10.948608
#define    ADD_BF0    11.6785152
#define    ADD_BFIS0    12.16512
#define    ADD_BG0    12.976128
#define    ADD_BGIS0    13.68576
#define    ADD_BA0    14.598144
#define    ADD_BB0    15.5713536
#define    ADD_BH0    16.22016
#define    ADD_BC1    17.301504
#define    ADD_BCIS1    18.24768
#define    ADD_BD1    19.464192
        
//Dauertöne        
#define    DAUERC    4.325376
#define    DAUERD    4.866048
#define    DAUERG    3.211264
/*##################################
Deklarationen
##################################*/
//Funktionen
void blinky(); 
void dauerton(); 
int init(); 

//Globale Variablen
volatile unsigned long addition = 0;
volatile unsigned long daueradd = 0;
volatile char flag = 0; 


int main( void )
{    //IO
    DDRB = 0xff;                    //Port B als Ausgang        
    DDRD = 0x00;                     //Port D als Eingang
    DDRA = 0b11110100;                 //nur Pin 1,2,4 als eingang

    //TIMER 0  => PWM
    TCCR0 = 0;                         //definiert 0
    TCCR0 |= (1<<WGM01)|(1<<WGM00); //FAST PWM 8bit
    TCCR0 |= (1<<COM01);            //Nicht invertierend
    TCCR0 |= (1<<CS00);             //Prescalen:  clk / 1 

    OCR0 = 0x00;                     //Vergleichswert, 8bit


    //Timer 1 => Metronom             (16 Bit, manipulation von "flag"), zählt von Bottom to Top (CTC) (stored in OCR1A)
    TCCR1A = 0; 
    TCCR1A |= (1<<WGM12);             //CTC TOP = OCR1A, TOV SET On Max
    TCCR1A |= (1<<COM1A0);             //Toggle

    TCCR1B = 0; 
    TCCR1B |= (1<<CS12)|(1<<CS10);    // Prescaler = 1024


        
    //Timer2 für OCR0 Befüllung / Sägezahnerzeugung
    TCCR2 = 0; 
    TCCR2 |= (1<<CS20);             //Vorteiler = 1; 
    TIMSK |= (1<<TOIE2);             //Nach jedem Oferflow wird ein Interrupt gestartet
    
    sei();                             //Globale Interrupts erlauben, Interrupts via ISR();


    //Variablen
    char mode = BAROCK;
    int metronom = 0; 
    //init
    metronom = init();                 //format: ms*10
    OCR1A = (metronom*156.25); 
    
    if (PINA & 0b00001000) {
        mode = FRENCH;
        }

    while( 1 ) {                    // Endlosschleife

     if (mode == FRENCH){            //if =>french
            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
                case 0b11111111 : addition = ADD_FF0 ; break; //F0
                case 0b11111110 : addition = ADD_FG0 ; break; //G0
                case 0b11111100 : addition = ADD_FA0 ; break; //A0
                case 0b11111000 : addition = ADD_FB0 ; break; //B0
                case 0b11110100 : addition = ADD_FH0 ; break; //H0
                case 0b11100100 : addition = ADD_FC0 ; break; //C0
                case 0b11010100 : addition = ADD_FCIS0 ; break; //Cis0
                case 0b11011110 : addition = ADD_FD0 ; break; //D0
                case 0b10100100 : addition = ADD_FDIS0 ; break; //Dis0
                case 0b10011110 : addition = ADD_FE0 ; break; //E0

                case 0b01011110 : addition = ADD_FF1 ; break; //F1
                case 0b00011110 : addition = ADD_FFIS1 ; break; //Fis1
                case 0b01111110 : addition = ADD_FF1 ; break; //g1 =>Zeigefinger statt Daumen weg
                default : addition = FAIL; 
                            
                } //end Griffabfrage
            } //end if
            else if (mode == BAROCK){                    //if =>Barock    
                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
                    case 0b11111111 : addition = ADD_BC0 ; break; //C0
                    case 0b11111110 : addition = ADD_BD0 ; break; //D0
                    case 0b11111100 : addition = ADD_BE0 ; break;//E0
                    case 0b11111000 : addition = ADD_BF0 ; break;//F0
                    case 0b11110111 : addition = ADD_BFIS0 ; break; //Fis0
                    case 0b11110000 : addition = ADD_BG0 ; break; //G0
                    case 0b11101100 : addition = ADD_BGIS0 ; break; //Gis0
                    case 0b11100000 : addition = ADD_BA0 ; break; //A0
                    case 0b11010000 : addition = ADD_BB0 ; break; //B0
                    case 0b11000000 : addition = ADD_BH0 ; break; //H0
                    case 0b10100000 : addition = ADD_BC1 ; break; //C1
                    case 0b10000000 : addition = ADD_BCIS1 ; break; //Cis1
                    case 0b00100000 : addition = ADD_BD1 ; break; //D1 =>Zeigefinger statt Daumen weg
                    default : addition = FAIL ; break; 
                } //end Griffabfrage
            }//end else
    if (flag == 1) {
        PORTB ^= (1<<PB2);
        flag = 0; 
        }//end if flag
    } // end while (1)

    return 0;
} //end main


ISR( TIMER2_OVF_vect ){
    static double tmp; 

    if (daueradd != 0){
        tmp += (addition + daueradd); 
        if (tmp >= 256) tmp-=256; 
        OCR0 = (int) ((tmp+0.5)/2);
        return; 
        }
        
    if (addition == FAIL){ //Stummschaltung bei falschen/ keinen Griffen 
        OCR0 = 0; 
        return;
        }
    
    tmp += addition; 
    if (tmp >= 256) tmp-=256; 
    OCR0 = (int) (tmp+0.5);
}

ISR( TIMER1_OVF_vect ){
    flag = 1; 
    }
/*#################################
init
#################################*/

int init(){
    int tmp;         //metronom return
    int tmp1 = 0;         //status taster

    _delay_ms(5000); 
    
    if (PINA & 0x01) {
        daueradd = DAUERC;
        }
    
    if (PINA & 0x02) {
        daueradd = DAUERD;
        }

    if (PINA & 0x03) {
        daueradd = DAUERG; 
        }

    _delay_ms(100); 
    addition = DAUERC; 
    _delay_ms(1000); 
    addition = FAIL; 

    while (1){
        if ((PINA & 0x01) | (PINA & 0x02) | (PINA & 0x03)){
            tmp1 = PINA; 
            for (tmp = 0; tmp<419; tmp++){
                if (tmp1 != PINA){return tmp;}
                _delay_ms(10);                
                }//end for
            return 0; 
            }//end if

        _delay_ms(100);
        if (tmp1 == 50){
            return 0;
            }
        tmp1++; 
        }// end while 1        
}  //end init




Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fabian G. (deloz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das wichtigste vergessen....

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.