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;
}
}
Lesbarer wird das, wenn Du das ganze in als code formatierst.
Die while-Schleife beim Setzen von DDRD muss weg.
Was soll die Zeile
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 mitCode:PORTD = ((lngUSE*2-1) % lngCount);
haben.Code:PORTD = ((lngUSE*2-1) & 0xff);
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).
Lesezeichen