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