Es reicht, wenn man die beiden!!! Werte anpasst.Oder reicht es wenn man die OCR0A , OCROB Werte anpasst ?
Der gültige Wertebereich von OCR0B ändert sich ja auch mit dem Ändern von OCR0A.
Es reicht, wenn man die beiden!!! Werte anpasst.Oder reicht es wenn man die OCR0A , OCROB Werte anpasst ?
Der gültige Wertebereich von OCR0B ändert sich ja auch mit dem Ändern von OCR0A.
Kurzeinführung Taster: Da du einen Atmel hast und wir den ganzen Schaltungskladderadatsch weglassen können brauchst du faktisch nur einen kleinen Kondensator und einen Taster.
Die Atmels haben alle sognenannte interne Pull Up Widerstände, in der Größenordnung 10-50kOhm soweit ich das in ERinnerung habe.
Du musst dafür den Pin für den Taster im DDR Register auf Eingang konfigurieren und im OUT Register den Pin auf High setzen. Dann schließt du den Kondensator an den Pin und nach Ground an (der Puffert ein wenig Energie wenn der Schalter prellt) und natürlich deinen Taster, ebenfalls nach Ground.
Wenn du den Taster also drückst, wird der Pin auf Ground gezogen und zeigt im IN Register eine 0, lässt du den Taster los, lädt sich der Kondensator über den Pull-Up Widerstand weider auf und zeigt dann im IN Register eine 1.
Du musst also in deiner nop-Schleife dann nur das IN-Register abfragen und je nachdem ob dein IN Register für den Pin eine 1 oder 0 anzeigt das OCR0B REgister für das Tasterverhältnis ändern oder das OCR0A Register für die Frequenz
Den Code habe ich zwecks Lerneffekt dieses mal weg gelassen :P
PS: Wkrug hat natürlich recht, wenn du OCR0A veränderst, musst du auch OCR0B entsprechend Ändern damit sich das Tastverhältnis nicht verschiebt![]()
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Neuer Versuch,
Es funktioniert so bis jetzt noch nicht.Code:int main(void) { DDRB = (1<<PB1); // Ausgang PWM DDRB &= ~(1<<PB0); // Eingang Taster PORTB |= (1<<PB0); // Pull - Up aktivieren OCR0A = 124; OCR0B = 63; TCCR0A = (1<< COM0B1) + (1<< WGM01) + (1<< WGM00); TCCR0B = (1<<WGM02) + (1<< CS01); while (1) { if (!(PINB & (1<<PB0))); } PORTB |= (1<<PB1); } if (PINB & (1<<PB0)); { PORTB |= ~(1<<PB1); } } }
Habe es auf meinem Steckbrett aufgebaut.
Könnt Ihr mir bitte einen Tip geben wo der Fehler sitzt ?
Da stimmt schon mal die Syntax nichtCode:while (1) { if (!(PINB & (1<<PB0))); } PORTB |= (1<<PB1); } if (PINB & (1<<PB0)); { PORTB |= ~(1<<PB1); }
Wenn der Taster gedrückt ist, musst Du doch die OCR Register ändern, siehe weiter oben.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
}
Vielen Dank für die Info.
Das würde heißen ich schreibe nicht
Benötige ich dan nicht noch OCR0B ?Code:if (!(PINB & (1<<PB0))) sondern if (!(PINB & (1<<OCR0A)))
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 ?
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!
Würde es so jetzt passen ?
Ich könnte es auch so schreiben richtig ?Code:DDRB = (1<<PB1); // Ausgang PWM PORTB |= (1<<PB1); // Port Auf Ausgang setzen DDRB &= ~(1<<PB0); // Eingang Taster PORTB |= (1<<PB0); // Pull - Up aktivieren
Gibt es einen Vorteil wenn ich es per Binärzahlen schreibe ?Code:DDRB = 0b00000001; // Port auf Ausgang setzen DDRB = (1<<PB1); // Ausgang PWM DDRB &= ~(1<<PB0); // Eingang Taster PORTB |= (1<<PB0); // Pull - Up aktivieren
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)
Lesezeichen