Forum: Mikrocontroller und Digitale Elektronik PWM an PB1(OC1A) nicht veränderbar


von Kenia (Gast)


Lesenswert?

Hallo habe folgendes Prgrammm gestestet
an PB1(OC1A) soll der Ausgang sein
an PB0+PB2 hängen Taster nach GND.

Am Ausgang kommt zwar ein ca. 13kHz Signal aber ich kann keine Regelung 
vornehmen wo hängts.....?

Alles was mir auffällt kann nur OCR1A nutzen da compiler bei OC1A 
meckert.

hier der code :
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#define F_CPU 8000000UL
4
#include <util/delay.h>
5
6
7
8
int main()
9
{
10
  // OC1A => PB1 Ausgang
11
  DDRB |= (1<<PORTB1);  //Ausgang   DDRB &= ~(1<<PORTB0);  //  Eingang Tater auf GND
12
  DDRB &= ~(1<<PORTB2);  //  Eingang Taster auf GND
13
  PORTB |= (1<<PORTB0) | (1<<PORTB2); // an S1 und S3 Taster PUL UP Widerstände
14
    
15
  // PWM Konfig
16
  TCCR1A |= (1<<WGM10); //fast PWM 8-Bit
17
  TCCR1B |= (1<<WGM12);
18
  TCCR1B |= (1<<CS12);  // Prescaler 256
19
  TCCR1A |= (1<<COM1A1);  //nichtinvertierender PWM Modus
20
  OCR1A = 0; //LED aus;
21
  sei();
22
  
23
  while(1)   
24
  {  // ******* Tatster 1 (LED heller) ************
25
    if (!(PINB & (PINB0)))    
26
    {
27
      if(OCR1A= 255)  // wenn Maxwert noch nicht erreicht 
28
      OCR1A++;    // verbreitere die Impulsbreite
29
      _delay_ms(15);
30
    }
31
    
32
    //******* TASTER 2 (LED dunkler) *************
33
    if (!(PINB & (PINB2)))
34
    {
35
      if(OCR1A > 0)  // wenn Minimalwert noch nicht erreicht
36
      OCR1A--;    // verbreitere die Impulsbreite
37
      _delay_ms(15);
38
    }
39
  }   
40
}

von Dietrich L. (dietrichl)


Lesenswert?

Kenia schrieb:
> sei();

Wozu das? Hast Du einen Interrupt? Dann fehlt die ISR.

Um welchen µC geht es eigentlich?

Gruß Dietrich

von Kenia (Gast)


Lesenswert?

Atmega 168PA

von Karl H. (kbuchegg)


Lesenswert?

> if(OCR1A= 255)

Das ist kein Vergleich sondern eine Zuweisung.
Ausserdem bezweifle ich, dass du an dieser Stelle einen Vergleich auf 
Gleichheit wolltest.

von Karl H. (kbuchegg)


Lesenswert?

>    if (!(PINB & (PINB0)))

    if (!(PINB & (1<<PINB0)))


Das steckt doch alles voller Primtivfehler.
Dürfte ich vorschlagen, dass du dir selber mal eine Strategie 
zurechtlegst, um Fehler zu suchen und zu finden anstatt einfach 
dahinzutippen und wenns nicht geht, dann sofort das Forum zu befragen?

Fehler zu machen ist ok. Das gehört dazu.
Aber genauso gehört es dazu, dass man lernt seine eigenen Fehler zu 
finden. Und das lernt man nicht ohne Übung oder wenn einem die anderen 
alles vorbeten.
Beides sind Fehler, die du eigentlich längst selbst hättest finden 
müssen.

von Kenia (Gast)


Lesenswert?

Manchmal ist es eben so dass man die Kleinigkeiten nicht mehr sieht nach 
langer Prorammtests habe noch andere Tests laufen, das war nur ein Teil.


ABER SUPER DANKE TROTZDEM dafür ist doch auch ein Forum da oder ?

von Kenia (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
>>    if (!(PINB & (PINB0)))
>
>     if (!(PINB & (1<<PINB0)))
>
>
> Das steckt doch alles voller Primtivfehler.


Hab ich korrigiert , keine Funktion !!!!

An was könnte es denn liegen ???

von Karl H. (kbuchegg)


Lesenswert?

Was ist mit dem

> if(OCR1A= 255)

wie hast du ihn korrigiert?


(ehe ich mir die Arbeit antue und die Timer Konfiguration kontrolliere)

von Kenia (Gast)


Lesenswert?

Was soll damit sein

von Karl H. (kbuchegg)


Lesenswert?

Ich zitiere

> Das ist kein Vergleich sondern eine Zuweisung.
> Ausserdem bezweifle ich, dass du an dieser Stelle einen Vergleich auf
> Gleichheit wolltest.

von Kenia (Gast)


Lesenswert?

OK gewollt war

if(OCR1A < 255)  // wenn Maxwert noch nicht erreicht

funktioniert immer noch nicht!!!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Kenia schrieb:
> if(OCR1A= 255)  // wenn Maxwert noch nicht erreicht

Zumal das ja auch noch falsch ist, wenn man mal den Komentar ernster 
nimmt als die Programmzeile :-)

Ich denke mal, da soll eigentlich
1
 if (OCR1A < 255)  // wenn Maxwert noch nicht erreicht
stehen. Karl Heinz hat ja schon alles gesagt. Compilerwarnungen sind 
auch dazu da, sie zu lesen:
Warning: probably unwanted assignment...

Kenia schrieb:
> Karl Heinz Buchegger schrieb:
>>>    if (!(PINB & (PINB0)))
>>
>>     if (!(PINB & (1<<PINB0)))
>>
>>
>> Das steckt doch alles voller Primtivfehler.
>
>
> Hab ich korrigiert , keine Funktion !!!!

Das andere für PINB2 auch?

von Kenia (Gast)


Lesenswert?

Alles korrigiert, geht aber immer noch nicht sorry

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL
#include <util/delay.h>



int main()
{
  // OCA1 => PB1 Ausgang
  DDRB |= (1<<OCR1A);    //Ausgang
  DDRB &= ~(1<<PORTB0);  //  Eingang Tater auf GND
  DDRB &= ~(1<<PORTB2);  //  Eingang Taster auf GND
  PORTB |= (1<<PORTB0) | (1<<PORTB2); // an S1 und S3 Taster PUL UP 
Widerstände

  // PWM Konfig
  TCCR1A |= (1<<WGM10); //fast PWM 8-Bit
  TCCR1B |= (1<<WGM12);
  TCCR1B |= (1<<CS12);  // Prescaler 256
  TCCR1A |= (1<<COM1A1);  //nichtinvertierender PWM Modus
  OCR1A = 0; //LED aus;
//  sei();

  while(1)
  {  // ******* Tatster 1 (LED heller) ************
    if (!(PINB & (1<<PINB0)))
    {
      if(OCR1A < 255)  // wenn Maxwert noch nicht erreicht
      OCR1A++;    // verbreitere die Impulsbreite
      _delay_ms(15);
    }

    //******* TASTER 2 (LED dunkler) *************
    if (!(PINB & (1<<PINB2)))
    {
      if(OCR1A > 0)  // wenn Minimalwert noch nicht erreicht
      OCR1A--;    // verbreitere die Impulsbreite
      _delay_ms(15);
    }
  }
}

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Kenia schrieb:
> DDRB |= (1<<OCR1A);    //Ausgang

OCR1A ist ein Register und kein Pin.

von Falk B. (falk)


Lesenswert?

@  Kenia (Gast)

Eher so.

>  // OCA1 => PB1 Ausgang
>  DDRB |= (1<<PB1);    //Ausgang

von Kenia (Gast)


Lesenswert?

SUUUPER vielen Dank jetzt gehts dank den PROFIS

von Kenia (Gast)


Angehängte Dateien:

Lesenswert?

Hier die finale PWM - Taster Version für jeden

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.