- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 2 von 2

Thema: Atmel Controller Mega 162

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    01.08.2005
    Ort
    Köln
    Alter
    41
    Beiträge
    70

    Atmel Controller Mega 162

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    ich bin AVR Neueinsteiger und möchte gerne die Timerfunktion des oben genannten Controllers nutzen, aber ich bekomme nur knattern und pfeifen aus OC0. Ist diese C-Code korrekt?


    #include <io.h>

    void setNewFrequency(short);


    int main(void){

    TCCR0 = 0x11;

    //while (DDRB != 0x00 || PORTB != 0xFF){
    DDRB = 0x01;
    PORTB = 0xFE;
    //}


    while (DDRD != 0xFF){
    DDRD = 0xFF;
    }

    int lngCount=1,lngUSE=1,lngSleep; //war long
    // int intInput=0;
    short Music[]={255,200,155,100,23,45,64,23,45,67,22,33,66,100,2 00,255,230,210,1,10};
    short musicpt=0;

    //Music[]={255,200,155,100,23,45,64,23,45,67,22,33,66,100,2 00,255,230,210,1,10};
    while (1){
    for (lngCount=1;lngCount<255;lngCount+=3){

    for (lngSleep=0;lngSleep<17500;lngSleep++){
    asm volatile ("NOP");
    }

    if (musicpt < 20){
    musicpt++;
    }
    else{
    musicpt = 0;
    }

    setNewFrequency(Music[musicpt]);

    // intInput=PINB;

    if (lngUSE<12{
    lngUSE+=2;
    }
    else{
    lngUSE=0;
    }

    PORTD = ((lngUSE*2-1) % lngCount);
    }
    }





    return 0;
    }

    void setNewFrequency(short value){
    short newValue=0;

    if (value >=1 && value <=255){
    //newValue = 256 - value;
    newValue = value;
    //Laden des Vergleichregisters
    OCR0 = newValue;
    }
    }

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Lesbarer wird das, wenn Du das ganze in als code formatierst.

    Die while-Schleife beim Setzen von DDRD muss weg.

    Was soll die Zeile
    Code:
    PORTD = ((lngUSE*2-1) % lngCount);
    den bewirken? Aus lngUSE wird eine ungerade Zahl gemacht und dann Modulo lngCount (der zu dem Zeitpunkt den Wert 255 hat) gerechnet, was bei zu einem Wert zwischen 0 und 0xff führt. Das kannst Du billiger mit

    Code:
    PORTD = ((lngUSE*2-1) & 0xff);
    haben.

    Sonst fällt mir nix auf. Vielleicht noch eine generelle Anmerkung: Die Variablen könnten etwas aussagekräftiger benannt sein.

    Ich persönlich finde im Übrigen Ungarische Notation wenig hilfreich, aber das ist jedem selbst überlassen. Wenn, dann sollte sie aber in der Form verwendet werden, dass der Typ der Variablen nachgestellt ist (also cntLng statt lngCnt).

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress