Forum: Mikrocontroller und Digitale Elektronik Attiny841: TOCC3 blockiert?


von Stefan S. (sschultewolter)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein kleines Problem, das einen PWM Ausgang komischerweise nicht 
nutzen kann.

Es handelt sich hier um einen Attiny841 mit internen 8MHz.
Ich habe als Peripherie an PA7(CS), PA6(MOSI) PA4(SCK) für 74HC595 im 
Einsatz. Des weiteren muss ich eine kleine Last über einen Mosfet 
ansteuern.

Das hatte ich bislang über TOCC0 gemnacht. Jedoch würde ich gerne TXD0 
und RXD0 nun zusätzlich nutzen. Mapping geht nicht, da die anderen Pins 
(PA7 und PB2) bereits belegt, bzw. noch belegt werden müssen.

Nun habe ich versucht, den PWM Ausgang an PA3 zu nutzen. Doch leider 
bekomme ich damit testweise die Led nicht ans leuchten.

Habe es dann mit dem TOCC1 versucht. Der geht, aber da brauch ich den 
RXD Pin. Kann mir einer sagen, wieso der PA3 für PWM gesperrt ist?
1
/*
2
 * main.h
3
 *
4
 * Created: 05.01.2015 19:37:04
5
 *  Author: sschultewolter
6
 */ 
7
8
9
#ifndef MAIN_H_
10
#define MAIN_H_
11
12
#include <avr/io.h>
13
#include <avr/interrupt.h>
14
#include <stdlib.h>
15
16
/************************************************************************/
17
/* Allgmein                                                             */
18
/************************************************************************/
19
#define  OFF        0
20
#define ON        1
21
#define TOGGLE      2
22
23
/************************************************************************/
24
/* HC595                                                                */
25
/************************************************************************/
26
#define HC595_DDR    DDRA
27
#define HC595_PORT    PORTA
28
#define HC595_MOSI    PORTA6
29
#define HC595_SS    PORTA7
30
#define HC595_SCK    PORTA4
31
32
/************************************************************************/
33
/* PWM Motor                                                            */
34
/************************************************************************/
35
#define MOTOR_DDR    DDRA
36
#define MOTOR_PORT    PORTA2
37
#define ALT_MOTOR_PORT  PORTA3
38
#define MOTOR_PWM    OCR1A
39
#define MOTOR_PWM_MIN  55
40
#define MOTOR_PWM_MAX  255
41
#define MOTOR_ON    TCCR1A |= (1<<COM1A1)
42
#define MOTOR_OFF    TCCR1A &= ~(1<<COM1A1)
43
44
/************************************************************************/
45
/* Prototypen                                                           */
46
/************************************************************************/
47
// 1ms Timer
48
volatile uint32_t millis;
49
uint32_t time(void);
50
51
void time_init(void);
52
53
// HC595
54
void hc595_init(void);
55
56
// PWM Motor
57
void motor_init(void);
58
59
#endif /* MAIN_H_ */
1
/*
2
* luigiv4.c
3
*
4
* Created: 05.01.2015 06:15:26
5
*  Author: sschultewolter
6
*/
7
8
#include "main.h"
9
10
11
12
void time_init(void)
13
{
14
  // CTC Modus
15
  TCCR0A |= (1<<WGM01);
16
  // Prescaler 64
17
  TCCR0B |= 1<<CS01 | 1<<CS00;
18
  OCR0A = 125-1;
19
  // Interrupt aktivieren
20
  TIMSK0 |= (1<<OCIE0A);
21
}
22
23
uint32_t time(void) { return millis; }
24
25
ISR(TIMER0_COMPA_vect) {millis++;}
26
27
void hc595_init(void)
28
{
29
  HC595_DDR |= 1<<HC595_SS | 1<<HC595_MOSI | 1<<HC595_SCK;
30
  // SPI aktivieren | Master
31
  SPCR |= 1<<SPE | 1<<MSTR;
32
  // SCK = F_CPU/2
33
  SPSR |= 1<<SPI2X;
34
}
35
36
void hc595_send(uint8_t data)
37
{
38
  HC595_PORT &= ~(1<<HC595_SS);
39
  SPDR = data^0x0F;
40
  while(!(SPSR & 1<<SPIF));
41
  HC595_PORT |= 1<<HC595_SS;
42
}
43
44
void motor_init(void)
45
{
46
/*  Das geht nicht!
47
  MOTOR_DDR |= 1<<ALT_MOTOR_PORT;
48
  TOCPMSA0 |= 1<<TOCC2S0;
49
  TOCPMCOE |= 1<<TOCC2OE;*/
50
51
  MOTOR_DDR |= 1<<MOTOR_PORT;
52
  TOCPMSA0 |= 1<<TOCC1S0;
53
  TOCPMCOE |= 1<< TOCC1OE;
54
55
  // FastPWM
56
  TCCR1A = (1<<WGM10);
57
  // Prescaler 64
58
  TCCR1B = (1<<CS11) | (1<<CS10);
59
  MOTOR_ON;
60
  MOTOR_PWM = 0;
61
}
62
63
int main(void)
64
{
65
  time_init();
66
  hc595_init();
67
  motor_init();
68
  
69
  extern unsigned short __heap_start;
70
  unsigned int seed = *((unsigned int *)__heap_start);
71
  srand(seed);
72
73
  uint8_t random_number;
74
  uint32_t last_time = time();
75
  uint8_t led_value = 0;
76
  
77
  sei();
78
  
79
  while(1)
80
  {
81
    random_number = (uint8_t)rand();
82
    
83
    if(time() - last_time > 50)
84
    {
85
      last_time = time();
86
      hc595_send(led_value++);
87
      MOTOR_PWM = random_number;
88
    }
89
  }
90
}


Edit: Hier noch einmal der Link zu Datenblatt.
http://www.atmel.com/Images/Atmel-8495-8-bit-AVR-Microcontrollers-ATtiny441-ATtiny841_Datasheet.pdf

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Stefan S. schrieb:

> Nun habe ich versucht, den PWM Ausgang an PA3 zu nutzen. Doch leider
> bekomme ich damit testweise die Led nicht ans leuchten.
>
> Habe es dann mit dem TOCC1 versucht. Der geht, aber da brauch ich den
> RXD Pin. Kann mir einer sagen, wieso der PA3 für PWM gesperrt ist?

Hast du den Teil im Datenblatt übersehen, dass du nicht wahlfrei den A 
oder B Output Compare an die Pins legen kannst?

Datenblatt Tabelle 12.7 (Seite 116)

PA3 ist der TOCC2. Laut Tabelle geht da nur eine PWM vom B-Kanal.

von Stefan S. (sschultewolter)


Lesenswert?

Auf Register B bekomme ich an dem Timer keinen PWM Output hin.
1
  MOTOR_DDR |= 1<<3;
2
  TOCPMSA0 |= 1<<TOCC2S1;      // Timer 1 -> TOCC2 OC1B
3
  TOCPMCOE |= 1<<TOCC2OE;      // Ausgang an PA3 freigaben
4
5
  TCCR1A |= (1<<COM1B1) |(1<<WGM10);      // PWM 8Bit  
6
  TCCR1B = (1<<CS11) | (1<<CS10);  // Prescaler 64
7
  OCR1B = 100;

von Stefan S. (sschultewolter)


Lesenswert?

1
  // Fast PWM 8-Bit
2
  DDRA    |= (1<<3);
3
  TCCR1A    |= (1<<COM1B1) | (1<<WGM10);
4
  TCCR1B    |= (1<<WGM12);
5
  TCCR1B    |= (1<<CS12) | (0<<CS11) | (0<<CS10); 
6
  TOCPMSA0  |= (1<<TOCC2S0);
7
  TOCPMCOE  |= (1<<TOCC2OE);
8
  OCR1B = 40;
9
  while (1)
10
  {
11
    while(OCR1B < 255) {OCR1B++; _delay_ms(5);}
12
    while(OCR1B > 40) {OCR1B--; _delay_ms(5);}
13
  }

So gehts. Muss halt noch etwas die Prescaler anpassen. So richtig passt 
das noch nicht (hörbare Geräusche/ ruckeliger Anlauf). Habe aber auch 
noch keinen extra Kondensator verbaut.

: Bearbeitet durch User
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.