- Labornetzteil AliExpress         
Ergebnis 1 bis 7 von 7

Thema: OCR0 lässt sich nicht zurücksetzen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.08.2005
    Beiträge
    86

    OCR0 lässt sich nicht zurücksetzen

    Anzeige

    Powerstation Test
    Hallo zusammen,

    ich wollte eine LED über PWM ansteuern.

    Ich weiß, das es genug Beispiele dafür gibt, wollte es aber mal alleine und nur nach Datenblatt probieren...

    Ist nicht so einfach, wie ich dachte, denn die LED leuchtet nur ganz schwach.
    Denkt jetzt bitte nicht, "DAS IST DOCH PWM"

    Ich weiß, aber ich wollte uber die if-Bedingung die Heligkeit steuern wollen.

    Könnt Ihr mir bitte sagen, was an meinem Code falsch ist und warum die if-Bedingung nich ausgeführt wird ???

    Danke Euch im Voraus

    MfG

    popi

    Hier der kurze Code:
    #include <avr/io.h>



    void main(void)
    {

    PORTB = (1<< PB4);
    DDRB = (1<< DDB4);
    OCR0 = 0xff;
    TCCR0 = (1 << WGM00) |(1 << WGM01) | (1<< COM01) | (1<< CS00) | (1<< CS01) | (1<< CS01);

    unsigned int wort,x;
    x = 0;

    while(x=0);
    {

    OCR0 = OCR0 + 1;

    if (OCR0 = 0xff) OCR0 = 0x00;

    }




    } // Ende main

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    if (OCR0 = 0xff) OCR0 = 0x00;
    machmal if (OCR0 == 0xff) OCR0 = 0x00;

    Wobei
    1. wenn OCR0 = 0xFF und Du noch eins dazuaddierst wird OCR0 automatisch wieder 0
    2. Es dürfte so schnell passieren, daß Du nichts merkst.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Dir ist klar, was der Unterschied ist zwischen
    Code:
    while (x=0);
    {
    }
    und
    Code:
    while (x==0)
    {
    }
    ???

    Dein momentanes Programm ist äquivalent hierzu:
    Code:
    #include <avr/io.h>
    
    void main(void)
    {
    	PORTB = (1<< PB4);
    	DDRB  = (1<< DDB4);
    	OCR0  = 0xff;
    	TCCR0 = (1 << WGM00) | (1 << WGM01) | (1<< COM01) | (1<< CS00) | (1<< CS01) | (1<< CS01);
    
    	OCR0 = OCR0 + 1;
    
    	if (OCR0 = 0xff) 
    		OCR0 = 0x00;
    
    } // Ende main, landet in exit() (Endlosschleife)
    Das wiederum ist nicht anderes als
    Code:
    #include <avr/io.h>
    
    void main(void)
    {
    	PORTB = (1<< PB4);
    	DDRB  = (1<< DDB4);
    	OCR0  = 0xff;
    	TCCR0 = (1 << WGM00) | (1 << WGM01) | (1<< COM01) | (1<< CS00) | (1<< CS01) | (1<< CS01);
    
    	OCR0 = OCR0 + 1;
    	OCR0 = 0xff;
    	OCR0 = 0x00;
    
    } // Ende main, landet in exit() (Endlosschleife)
    Dein OCR0 ist also immer 0. Mach die den Unterschied klar zwischen = und == und ein überflüssiger ; hat schon so manche Schleife ausgeknockt. Beides und noch mehr steht in Fallstricke bei der C-Programmierung
    Disclaimer: none. Sue me.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    18.08.2005
    Beiträge
    86
    Danke für die Antworten.

    Es lässt sich nun dimmen...

    Aber ich würde gerne den OCR0 Wert ändern können, um ein Zeit Variable zu gestalten, also damit die LED von dunkel auf hell hochdimmt.

    Oder wie lösst man sowas?

    Könnt Ihr bitte nochmal einen Blick auf meinen Code werfen und mir mit dem Problem helfen, die Impulsueit variable zu gestalten?

    Danke im Voraus und Grüße

    popi

    Hier der Code, der zwar dimmt, aber nicht an OCR0 ändert, trotz eindeutigen Befehl, wie ich meine... denke... hoffe....

    #include <avr/io.h>

    void main(void)
    {
    PORTB = (1<< PB4);
    DDRB = (1<< DDB4);
    OCR0 = 0x10;
    TCCR0 = (1 << WGM00) | (1<< COM01) | (1<< CS00) | (1<< CS01);

    if (TCNT0 == 0x20) OCR0 = 0x00;
    }

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Ich weiß jetzt nicht so recht, was Du vor hast.
    Du willst Die Led hochdimmen, und dann wieder runter, oder wie ?

    Also das Programm, was Du da jetzt geschrieben hast läuft Amok, genau so wie das davor, was Dir der Sprinter schon erklärt habe.
    Mach mal eine Schleife, wo Du OCR0 inkrementierst und zwar mit einer kurzen pause zwischen, damit man das auch mitbekommt.
    Vielleicht kommst Du damit weiter.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    18.08.2005
    Beiträge
    86
    Hallo Sebastian,

    ich glaube, ich habs jetzt mit Eurer Hilfe hinbekommen.
    Die LED ändern fließend die Helligkeit in einem "zufälligem Muster"...

    Könnte man das kompakter schreiben?

    Grüße

    popi


    #include <avr/io.h>


    unsigned char x = 2;
    unsigned short i;

    void main(void)
    {
    PORTB = (1<< PB4);
    DDRB = (1<< DDB4);
    OCR0 = 0x00;
    TCCR0 = (1 << WGM00) | (1<< COM01) | (1<< CS00);// | (1 << WGM01);


    while(x==2)
    {
    while(OCR0 <= 0x60) {for (i=0;i<500;i++) asm volatile("NOP"); OCR0 = OCR0 + 1;}
    while(OCR0 >= 0x40) {for (i=0;i<300;i++) asm volatile("NOP"); OCR0 = OCR0 - 1;}

    while(OCR0 <= 0xCF) {for (i=0;i<700;i++) asm volatile("NOP"); OCR0 = OCR0 + 1;}
    while(OCR0 >= 0x10) {for (i=0;i<100;i++) asm volatile("NOP"); OCR0 = OCR0 - 1;}

    while(OCR0 <= 0x70) {for (i=0;i<300;i++) asm volatile("NOP"); OCR0 = OCR0 + 1;}
    while(OCR0 >= 0x05) {for (i=0;i<500;i++) asm volatile("NOP"); OCR0 = OCR0 - 1;}

    while(OCR0 <= 0xEE) {for (i=0;i<100;i++) asm volatile("NOP"); OCR0 = OCR0 + 1;}
    while(OCR0 >= 0x05) {for (i=0;i<400;i++) asm volatile("NOP"); OCR0 = OCR0 - 1;}

    while(OCR0 <= 0xfe) {for (i=0;i<100;i++) asm volatile("NOP"); OCR0 = OCR0 + 1;}
    while(OCR0 >= 0x20) {for (i=0;i<50;i++) asm volatile("NOP"); OCR0 = OCR0 - 1;}
    }
    }

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Wenn du die Sequenz öfter brauchst würde ich eine Funcktion machen, weil sonst fast der gleiche Code mehrfach dasteht, mit Funktionen stehen nur die Aufrufe da.

    Die Warteschleifen machst du besser mit _delay_loop_1(unsigned char) oder _delay_loop_2(unsigned int) aus util/delay.h (deprecated: avr/delay.h)

    Da OCR0 volatile ist, wird der Code kleiner (und schneller), wenn du über ein temporäres Zwischenregister gehst:
    Code:
       uint8_t ocr0 = OCR0;
       while (ocr0 <= ***)
       {
           _delay_loop_* (***);
           OCR0 = ++ocr0;
       }
    Disclaimer: none. Sue me.

Berechtigungen

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

Labornetzteil AliExpress