- fchao-Sinus-Wechselrichter AliExpress         
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
    Code:
    while (1)
    	{
    		if (!(PINB & (1<<PB0)));
    	}
    	PORTB |= (1<<PB1);
    	}
    	    if (PINB & (1<<PB0));
    	{
    		PORTB |= ~(1<<PB1);
    		
    	}
    Da stimmt schon mal die Syntax nicht
    while (1)
    {
    if (!(PINB & (1<<PB0)))
    {
    // Taster ist zu PinB.0 =0
    }

    PORTB |= (1<<PB1); // Schaltet PORTB 1 auf 1, macht aber keinen Sinn, wenn das ein PWM Ausgang ist
    PORTB &= ~(1<<PB1); // // Schaltet PORTB 1 auf 0, macht aber keinen Sinn, wenn das ein PWM Ausgang ist
    }
    Wenn der Taster gedrückt ist, musst Du doch die OCR Register ändern, siehe weiter oben.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    21
    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 ?

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

  4. #4
    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 20:08 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    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.

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

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

Ä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
  •  

12V Akku bauen