Forum: Compiler & IDEs schnelleren Takt erzeugen


von abcde (Gast)


Lesenswert?

Hallo

ich muss mit uCOS einen Takt erzeugen. So funktioniert zwar der Code 
jedoch mein Problem ist die Frequenz. Die Frequenz ist bei 100Hz ich 
bräuchte jedoch um die 20kHz.

Wie könnte ich das Problem lösen?

MfG

1
void TaskMotor(void *pdata)
2
{
3
    //Taster X+
4
    DDRB &= ~(1<<DDB0);
5
6
  
7
    //Motor Clock X        
8
    DDRB |= (1<<DDB5);
9
    PORTB |= (1<<PORTB5);
10
   
11
    static int variable = 0; 
12
13
14
    while (1)
15
    {
16
17
        if (~PINB & (1<<PB0))
18
        {
19
20
            if(variable == 0)
21
            {
22
                PORTB &= ~(1<<PB5);
23
                variable = 1;
24
25
            }
26
            else if (variable == 1)
27
            {
28
                PORTB |= (1<<PB5);
29
                variable = 0;
30
            }
31
        }
32
33
    OSTimeDly(1);
34
    }
35
}

von (prx) A. K. (prx)


Lesenswert?

Timer

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A. K. schrieb:
> Timer

Stichworte: "clear timer on compare match" und "toggle OCx on compare
match".

von Thomas (Gast)


Lesenswert?

Hallo,

abcde schrieb:
> OSTimeDly(1);

Ist das ein Delay oder was ???

Ansonsten statt

abcde schrieb:
> if (~PINB & (1<<PB0))
>         {
>
>             if(variable == 0)
>             {
>                 PORTB &= ~(1<<PB5);
>                 variable = 1;
>
>             }
>             else if (variable == 1)
>             {
>                 PORTB |= (1<<PB5);
>                 variable = 0;
>             }
>         }

mal

 if (~PINB & (1<<PB0))
   {
       PORTB ^= (1<<PB5);
   }

probieren

Gruss Thomas

von abcde (Gast)


Lesenswert?

Wie genau mit Timer.

Wenn ich zb. Taster drücke soll Interrupt ausgelöst werden. Dann würde 
das Programm dauernd im Interrupt hängen bleiben.

von abcde (Gast)


Lesenswert?

>> OSTimeDly(1);

>Ist das ein Delay oder was ???

Das ist im uCOS ein Time Delay.


> if (~PINB & (1<<PB0))
>  {
>       PORTB ^= (1<<PB5);
>   }

>probieren

Das beeinflusst die anderen Pins

von Thomas (Gast)


Lesenswert?

Weisst du nicht was ein XOR ist ???

von abcde (Gast)


Lesenswert?

War mein Fehler stimmt.

von Thomas (Gast)


Lesenswert?

Also Delay weg, Routine verkürzen

und den Timer machst du Morgen

von abcde (Gast)


Lesenswert?

"toggle OCx on compare match" kann ich nicht verwenden

Deswegen überlege ich es auf diese Art zu programmieren.

Wie lange ist das Compare flag gesetzt.
1
while((taste1 gedrückt) || (taste2 gedrückt) || (taste3 gedrückt)) 
2
{
3
  if(compare flag gesetzt)
4
  {
5
    //pin1, pin2 oder pin 3 toggeln 
6
  }
7
}

MfG

von user (Gast)


Lesenswert?

du nimmst den timer und sagst "toggle PIN on compare match", da wird 
dann kein IRQ ausgelöst, sondern nur der pin getoggelt, also ein takt 
erzeugt

von abcde (Gast)


Lesenswert?

Der OC2 ist am PIN PB7.

Mein Problem ist aber dass ich den Takt am PB4,PB5 und PB6 brauche. Da 
aber der PB7 getoggelt wird ist das für mich nicht hilfreich.

von Karl H. (kbuchegg)


Lesenswert?

umlöten.
und dann den Hardwaredesigner einen krummen Hund schimpfen.

Was bereits in Hardware verbockt ist, kann man mit Software meistens nur 
noch schwer ausbügeln.

von abcde (Gast)


Lesenswert?

Ich kann es nicht umlöten da das ein gekauftes Testboard ist. Somit muss 
ich das mit der Software lösen.

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.