PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmel Controller Mega 162



CodeX
10.08.2006, 04:10
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<128){
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;
}
}

ogni42
10.08.2006, 10:24
Lesbarer wird das, wenn Du das ganze in als code formatierst.

Die while-Schleife beim Setzen von DDRD muss weg.

Was soll die Zeile


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



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).