- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 39

Thema: Ein paar Fragen zum Timer !!!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.242
    Wenn ich den Port so auf Ausgang setze DDRB = 0b00000001 muss ich dan auch noch DDRB = (1<<PB1); schreiben ?
    Bewirkt beides das gleiche:
    DDRB = 0b00000010 = Schreibe in das DDRB Register den binären Wert 00000010;
    DDRB = ( 1<<PB1 ) = Schibe ein 1 Bit um 1 Stelle nach links und schreibe das dann ins DDRB Register also 0b00000001 um 1 nach links verschoben wird 0b00000010
    PB1 ist in einer Prozessorinitialisierung mit #define PB1 1 definiert, liefert als nach dem Compilieren den Wert 1.

    Übrigens kann man in C alle Werte als dezimal Werte z.B.123 angeben, oder in hex Schreibweise 0x7B oder binär 0b01111011 angeben.
    Alle 3 Beispiele hier liefern den selben Wert.
    Ich nehm halt immer das was für das aktuelle Problem für mich das Übersichtlichste ist.
    Tabellen für ein Lauflicht würde ich da in der Binärschreibweise erzeugen.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    21
    Bitte nochmals um eure Hilfe.

    Wo genau sitzt der Fehler im Code ?

    Code:
    #include <avr/io.h>
    #define F_CPU 1000000UL
    #include <util/delay.h>
    
    
    
    
    int main (void)
    {
    	DDRB |= (1<<PB1);     
    	DDRB = ~(1<<PB0);    
    	PORTB |=  (1<<PB0);   
    	
    	
    	OCR0A = 999;
    	OCR0B = 370;
    		
    	TCCR0A = (1<< COM1A1) + (1<< WGM01) + (1<< WGM00);
    	TCCR0B = (1<<WGM01) + (1<< WGM02) + (1<< CS13);
    		
    	
    	while(1)
    	
    	{
    		if (!(PINB & (1<<PINB0)))
    		{
    			PORTB |= (1<<PB1);
    			
    		}
    			
    			else if (PINB & (1<<PINB0))
    		{
    			PORTB &= ~(1<<PB1);
    			
    			
    			}
    			
    		}
    	}
    Ihr sagt ich muss den PORTB ein und aus schalten.
    Das mache ich doch in meinem Code.

    Wieso funktioniert es dan nicht ?

    Ich möchte wenn ich 1x mal den Taster drücke, das PWM Signal einschaltet.
    Drücke ich nochmals auf den Taster, schaltet das PWM Signal wieder aus.

    Ein kleines Beispiel wäre wirklich eine große Hilfe für mich.

    Vielen Dank mal wieder.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.242
    Ihr sagt ich muss den PORTB ein und aus schalten.
    Das mache ich doch in meinem Code.
    Nö, das machst Du eben nicht. Du schaltest nur den internen Pullup ein und aus.

    Ich hab den Code mal umgeschrieben und im Simulator getestet:
    Code:
    #include <avr/io.h>
    #define F_CPU 1000000UL
    #include <util/delay.h>
    
    
    
    
    int main (void)
    {
        DDRB |= (1<<PB1);
        DDRB = ~(1<<PB0);
        PORTB |=  (1<<PB0);
        
        
        OCR0A = 99;
        OCR0B = 37;
        
        TCCR0A = (1<< COM0B1) + (1<< WGM01) + (1<< WGM00);
        TCCR0B = (1<<WGM02) + (1<< CS01);
        
        
        while(1)
        
        {
            if (PINB & (1<<PINB0))
            {
                DDRB |= (1<<PB1);
            }
            
            else
            {
                DDRB &= ~(1<<PB1);
            }
            
        }
    return (0);
    }
    Im Simulator läuft der Code nicht 100% fehlerfrei, das könnte aber auch ein BUG des Simulators sein.
    Die Variablen OCR0A und OCR0B sind zu groß, da es sich hier nur um 8 Bit Register handelt = max. 255.
    Bei Tastendruck ( PINB.0 = 0 ) wird die PWM abgeschaltet.
    Bei offener Taste läuft die PWM.
    Das toggeln kannst Du so machen wie Ich Dir in der PN geschrieben habe.
    Probier mal aus ob es denn soweit läuft.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    21
    Vielen Dank mal wieder für deine Hilfe.

    Das glaub ich jetzt nicht.
    Es funktioniert sofort !!!

    Ich habe viel zu weit gedacht
    Dachte immer ich muss OCR0A abschalten.....

    Das mit dem Toggeln teste ich sofort und melde mich nochmal.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.242
    Ich habe viel zu weit gedacht
    Dachte immer ich muss OCR0A abschalten.....
    Wie schon mal geschrieben.
    Durch setzen des DDRB.1 Registers auf 0 geht der Port auf Tri State.
    Das bedeutet er ist hochohmig.
    Wenn Du da nen FET oder was ähnliches dran schalten willst, solltest Du einen Pull Down Widerstand ( ein echtes Bauteil - keine Programmierung ) in die Schaltung einfügen.
    Wenn Du das nicht magst, oder es einfach nicht mehr geht ( Layout fertig z.B. ) musst Du doch den Weg über die Abschaltung der OCR Ausganges machen und den Port auf einen festen Level, üblicherweise 0 legen.

Ähnliche Themen

  1. Ein paar Fragen ;)
    Von Checker 1.0 im Forum Robby RP6
    Antworten: 11
    Letzter Beitrag: 18.08.2011, 21:37
  2. Ein paar fragen ...
    Von Gamestake im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 3
    Letzter Beitrag: 21.04.2011, 09:12
  3. Ein paar Fragen
    Von Speed im Forum AVR Hardwarethemen
    Antworten: 10
    Letzter Beitrag: 03.11.2008, 07:19
  4. Ein paar Fragen zu µC
    Von Lars. im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 5
    Letzter Beitrag: 09.06.2006, 14:38
  5. Paar Fragen -g-
    Von Adacart im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 06.01.2005, 17:57

Berechtigungen

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

Labornetzteil AliExpress