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.