-         

Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 39 von 39

Thema: Ein paar Fragen zum Timer !!!

  1. #31
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    21
    Anzeige

    Vielen Dank für die Info.

    Das würde heißen ich schreibe nicht

    Code:
    if (!(PINB & (1<<PB0)))
    sondern
    if (!(PINB & (1<<OCR0A)))
    Benötige ich dan nicht noch OCR0B ?

    Und was ich nicht verstehe ist, wieso kann ich nicht wie bei einer LED den PB0 einschalten und abschalten ?
    Wenn ich nur diese eine Funktion auf dem PB0 habe sollte das doch normal möglich sein oder ?

  2. #32
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.880
    Hallo, erstmal langsam.

    Ein AVR hat 3 Register für die Ports PINx = zustand des Ports, wenn der extern angesprochen wurde.
    DDRx = Data Direction Register eine 1 bedeutet es ist ein Ausgang eine 0 - es ist ein Eingang.
    PORTx = gezieltes setzen eines Ports auf 0 oder 1. Wenn auf dem entsprechenden Bit im DDRx eine 0 steht, wird der interne Pullup bei einer 1 im PORTx Register aktiviert.
    In deinem Mini Prog fragst Du den Zustand des PORTB.0 ( PINB &(1<<PB0)) ab.
    Das ist ja kein aktives setzen des Ports, sondern eine Zustandsabfrage ( "if" ).
    Wenn Du den Port setzen willst musst Du "PORTB | = (1<<PB0);" ( das entspricht PORTB | = 0b00000001; ) eingeben.
    Das entsprechende Bit im DDRB muss dazu aber auch auf 1 gesetzt sein, sonst wird nur der Pullup des Ports aktiviert.

    Auch wenn Du es nicht glauben magst - Datenblatt lesen hilft!

  3. #33
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    21
    Würde es so jetzt passen ?

    Code:
    DDRB = (1<<PB1);               // Ausgang PWM 
    PORTB |= (1<<PB1);           // Port Auf Ausgang setzen
    DDRB &= ~(1<<PB0);           // Eingang Taster
    PORTB |= (1<<PB0);           // Pull - Up aktivieren
    Ich könnte es auch so schreiben richtig ?

    Code:
    DDRB = 0b00000001;             // Port auf Ausgang setzen
    DDRB = (1<<PB1);               // Ausgang PWM 
    DDRB &= ~(1<<PB0);           // Eingang Taster
    PORTB |= (1<<PB0);           // Pull - Up aktivieren
    Gibt es einen Vorteil wenn ich es per Binärzahlen schreibe ?

    Wenn ich den Port so auf Ausgang setze DDRB = 0b00000001 muss ich dan auch noch DDRB = (1<<PB1); schreiben ?
    Geändert von Nicole01 (16.02.2017 um 21:08 Uhr)

  4. #34
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    32
    Beiträge
    2.127
    beide Reihenfolgen sind okay, aber das manuelle bit-setzen macht den code unleserlich, weil niemand weis welcher Pin 0b00000001 ist. Wichtig ist aber eigentlich nur immer die Pins erst Konfigurieren(DDR), dann Setzen(PORT).

    Lesen geht immer, auch wenns auf Ausgang steht, macht aber nur wenig Sinn!

    Den PWM Ausgang in PORT Register zu setzen hat nur die Wirkung, dass der Pin so lange an ist, bis das Timer Register programmiert wird. Im Datenblatt steht, dass der Timer die Port Funktion übersteuert und wirkungslos macht wenn der Ausgang als PWM benutzt wird.

    Ob du PB0 oder OCRA0 als Makro verwendest ist je nach Prozessor abhängig! PB0 ist IMMER Port B Pin 0 aber OCR0A kann auf einem anderen Pin liegen, je nach Layout. Zum lesen den PIN Register oder schreiben des PORT Register ist das schlecht, denn diese Register arbeiten nicht sinnvoll mit PWM zusammen! Aber für das DDR Register ist es wiederum gut, weil der Code so portierbar wird für Prozessoren mit anderem Pin Layout!
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #35
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.880
    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.

  6. #36
    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.

  7. #37
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.880
    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.

  8. #38
    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.

  9. #39
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.880
    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.

Seite 4 von 4 ErsteErste ... 234

Ähnliche Themen

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

Berechtigungen

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