Hallo,
ich nutze zurzeit einen ATMega644 mit einem AVR Dragon board und
programmiere in AVR Stodio 4. Muss gleich dazu sagen ich nutze den
mega644 nur zum testen da ich dort nen jtag zugriff habe, das Programm
soll später mal auf nem ATtiny45 laufen und da ist auch schon das
Problem. Ich möchte eine PWM machen über einen externen Takt und einen
Sensor an die I²C Schnittstelle anschließen, allerdings teilen sich
Timer0 (einzigster Timer mit pwm beim tiny45) und I²C einen Pin.
Nun hatte ich die Idee über einen Externen interrupt (beim mega nutze
ich int0, beim tiny wollte ich dann pcintX nehmen) den Timer/Counter
direkt hochzuzählen.
Tja, hochzählen funktioniert, aber keine PWM und kein TIMER1 overflow.
ist es nicht möglich diese funktionen über interne zugriffe zu steuern?
Brauche ich unbedingt dafür einen direkten Takt am Timer?
hier Programmauszug:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | #ifndef F_CPU
|
5 | #define F_CPU 1000000UL // interner 8MHz oszi mit CKDIV8
|
6 | #endif
|
7 |
|
8 |
|
9 | ISR (TIMER1_OVF_vect){ //Interrupt bei Timer1 overflow
|
10 | //hier wird Programm ausgeführt
|
11 | }
|
12 |
|
13 | ISR (INT0_vect){
|
14 | TCNT1++;
|
15 | }
|
16 |
|
17 | void INT0init(){
|
18 | EICRA |= (1<<ISC01); //int0 interrupt falling edge
|
19 | EIMSK |= (1<<INT0); //int0 interrupt enable
|
20 | }
|
21 |
|
22 | void PWMinit(){
|
23 | OCR1A = 63; //bis dahin soll Timer1 laufen
|
24 | OCR1B = 32; // 50% PWM durch OCR1B
|
25 |
|
26 | // PWM auf mode 15(Fast PWM, Top OCR1A) und externe clock aus
|
27 | TCCR1A |= (1<<COM1B1) | (1<<WGM10) |(1<<WGM11);
|
28 | TCCR1B |= (1<<WGM12) | (1<<WGM13) ;
|
29 |
|
30 | TIMSK1 |= (1<<TOIE1); //Timer1 overflow interrupt enable
|
31 |
|
32 | }
|
33 |
|
34 | int main (){
|
35 |
|
36 | // Port Deklaration
|
37 | DDRD = (1<<PD4); //PD4 als Ausgang
|
38 |
|
39 | //Initialisierungen
|
40 | INT0init();
|
41 | PWMinit();
|
42 |
|
43 | sei();
|
44 |
|
45 | //Programmschleife
|
46 | while(1){}
|
47 |
|
48 | return 0;
|
49 | }
|