Forum: Mikrocontroller und Digitale Elektronik Fast PWM Code


von Steffi (Gast)


Lesenswert?

Hallo :)

Könnte mir jemand sagen, was an meinem Code für einen Attiny84 nicht 
funktioniert?
An PB2 ist der Enable von einem L293 angeschlossen und an PA2 & PA3 der 
Input.

1
void pwm_init(){
2
  
3
  TCCR0B |= (1 << CS00); // kein Prescaler
4
  TCCR0A |= (1 << WGM00) | (1 << WGM01); //Fast PWM
5
  
6
  TCCR0A |= (1 << COM0A1);
7
  TCCR0B |= (1 << COM0B1); // Compare match Bottom
8
    
9
  TCNT0 = 0;
10
  
11
  OCR0A = 0; // erlaubter Bereich: 0 - 255
12
    
13
  DDRB |= (1 << PB2); // PWN an Port B2 aktivieren  
14
}
15
16
int main(void)
17
{
18
  DDRA=0xFF; //all pins of PORTB declared as output
19
  DDRB = 0xFF;
20
  
21
  pwm_init();
22
  
23
  uint8_t wert;
24
  PORTA |= (1<<PA2);
25
  PORTA &= ~(1<<PA3);
26
    
27
  while(1){
28
  
29
  for (wert=0; wert<255; wert++)
30
  {
31
    OCR0A =  wert;
32
    _delay_ms(10);
33
  }
34
  
35
  for (wert=255; wert>0; wert--)
36
  {
37
    OCR0A =  wert;
38
    _delay_ms(10);
39
  }
40
}

von spess53 (Gast)


Lesenswert?

Hi

>TCCR0B |= (1 << COM0B1); // Compare match Bottom

COM0B1 befindet sich in TCCR0A

MfG Spess

von Steffi (Gast)


Lesenswert?

Das habe ich gerade noch gesehen, hatte den Post aber schon erstellt.
Das war leider nicht des Problems Lösung :(

von holger (Gast)


Lesenswert?

>Könnte mir jemand sagen, was an meinem Code für einen Attiny84 nicht
>funktioniert?

Ja.

  while(1){

Da fehlt eine schliessende Klammer.
Der Code den du zeigst lässt sich nicht compilieren
und kann logischerweise nicht der Code sein den du
wirklich benutzt.

von Steffi (Gast)


Lesenswert?

Die Klammer ist vorhanden, ich hatte sehr viele Kommentare und 
ausgeklammerten Code dazwischen und den ganzen non-sense wollte ich hier 
nicht posten, da es dann nicht mehr übersichtlich ist :)

hier mal der komplette Code:
1
# define F_CPU 10000000UL
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
6
void entprellung( volatile uint8_t *port, uint8_t maske ) {
7
  uint8_t   port_puffer;
8
  uint8_t   entprellungs_puffer;
9
  
10
  for( entprellungs_puffer=0 ; entprellungs_puffer!=0xff ; ) {
11
    entprellungs_puffer<<=1;
12
    port_puffer = *port;
13
    _delay_us(150);
14
    if( (*port & maske) == (port_puffer & maske) )
15
    entprellungs_puffer |= 0x01;
16
  }
17
}
18
19
void long_delay(uint16_t ms)
20
{
21
  for(;ms>0;ms--) _delay_ms(1);
22
}
23
24
25
void pwm_init(){
26
    
27
  TCCR0B |= (1 << CS00); // kein Prescaler
28
  
29
  TCCR0A |= (1 << WGM00) | (1 << WGM01); //Fast PWM
30
  
31
  TCCR0A |= (1 << COM0A1);
32
  TCCR0A |= (1 << COM0B1); // Compare match Bottom
33
    
34
  TCNT0 = 0;
35
  
36
  OCR0A = 0; // erlaubter Bereich: 0 - 255
37
  
38
  DDRB |= (1 << PB2); // PWN an Port B2 aktivieren
39
}
40
41
int main(void)
42
{
43
  DDRA=0xFF; //all pins of PORTB declared as output
44
  DDRB = 0xFF;
45
  
46
  pwm_init();
47
  
48
  uint8_t wert;
49
  PORTA |= (1<<PA2);
50
  PORTA &= ~(1<<PA3);
51
    
52
    while(1){
53
  
54
  for (wert=0; wert<255; wert++)
55
  {
56
    OCR0A =  wert;
57
    _delay_ms(10);
58
  }
59
  
60
  for (wert=255; wert>0; wert--)
61
  {
62
    OCR0A =  wert;
63
    _delay_ms(10);
64
  }
65
    }
66
}

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Steffi schrieb:
> Könnte mir jemand sagen, was an meinem Code für einen Attiny84 nicht
> funktioniert?

WAS an dem Code "nicht funktioniert" solltest DU uns mitteilen. Die 
nicht-Funktion ist nämlich abhängig von der erwarteten Funktion...

Wir können dir Tipps geben was die Ursache dafür sein könnte.

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.