ATMega16 PWM - externe clock

Gast #1860558
Lesenswert?

Hallo zusammen,

ich versuche momentan eine Manchester-codierte Nachricht über PWM 
abzugeben. ich nutze einen ATMega16 mit externen 8MHz Oszillator. Das 
Signal auf das ich die Nachricht aufbringen möchte läuft mit 125 KHz. 
Ich nutze Timer/Counter1 (16 Bit)da er mir sowohl Fast PWM mit Top OCR1A 
bietet wie auch ansteuerung über externe clock (T1). Ein Halbbit des 
Manchestercodes soll 32 125KHz Zyklen (logischerweise ein Bit 64 Zyklen) 
lang sein.

Probleme: 1. Wenn ich OCR1B nach der Initialisierung von Timer1 setzen 
will funktioniert es nicht (bleibt 0)
2. Wenn ich es vorher setze wird der Ausgang fürs PWM Signal nicht 
gesetzt (PD4)

hier Programmauszug :
1
/* includes sind alle da hab nur leider das programm grad nicht hier, deswegen gibts nur die wichtigsten auszüge*/
2

3
uint8_t nachricht[63]; 
4
/* an jeder stelle wird ein bit gespeichert hab mir den programmteil grad gespart*/
5

6
uint8_t k=0;
7

8
ISR (TIMER1_OVF_vect){
9
  
10
  if(nachricht[k]) {TCCR1A |= (1<<COM1B0); } 
11
  else{ TCCR1A &= ~(1<<COM1B0); } 
12
  /* wenn das aktuelle bit 1 ist dann invertierend ansonsten nicht invertierend */
13
  k++;
14
  if (k==64){ k = 0; } 
15
}
16

17
void pwminit(){
18
  TCCR1A |= (1<<COM1B1) | (1<<WGM11) | (1<<WGM10) ;
19
  TCCR1B |=  (1<<WGM12) | (1<<WGM13) | (1<<CS10) | (1<<CS11) | (1<<CS12) ;
20
  // PWM mode 15, externe clock an T1, vorbereitung für compareausgabe
21
  TIMSK |= (1<<TOIE1); //Timer1 overflow ein
22
}
23

24
int main(){
25
  DDRD = 0xFF;
26
  OCR1A = 64-1; // PWM Zähler bis 63
27
  OCR1B = 32; // 50% PWM durch umschalten bei 32
28
 
29
  pwminit();
30
  
31
  sei();
32
  while (1){}
33

34
return 0;
35
}

Achso, falls interessant genutzt wird AVRstudio 4 und programmiert und 
gedebuggt via JTAG ICE.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren