Hallo,
ich stehe gerade vor der Aufgabe ein PPM-Signal auf 4 Kanälen auszulesen
und zwischenzuspeichern. Ich habe eine einfache Routine hierzu bereits
entwickelt, leider scheint diese aber noch fehlerbehaftet zu sein. Die
Ausgabe, die mir geben wird, beschreibt mir bei konstanten
Eingangssignalen veränderliche Werte. Ein Veränderungsmuster ist auf die
schnelle nicht erkennbar. Ich vermute ein Problem mit den Interrupts,
aber auch anderes kann ich nicht ausschließen.
Vielleicht sieht jemand den Fehler im Programm?
Vielen Dank schon mal vorab
Marcel P.
PS: Verwendet für den USART wird die Lib von Peter Fleury verwendet.
1 | #include <avr/io.h>
|
2 | #include <stdlib.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <inttypes.h>
|
5 | #include <util/delay.h>
|
6 | #include "uart.h"
|
7 |
|
8 | #define UART_BAUD_RATE 19200
|
9 |
|
10 | volatile uint8_t counter = 10;
|
11 | volatile uint8_t channel[4]={0,0,0,0};
|
12 | volatile char flag=0,flag2=0;
|
13 | char out[4];
|
14 |
|
15 | void init_pcint(){
|
16 |
|
17 | PCMSK2 = 0xF0;
|
18 | PCICR = 0x04;
|
19 |
|
20 | }
|
21 | void init_timer(){
|
22 |
|
23 | TCCR0A = 0;
|
24 | TCCR0B = 4;
|
25 |
|
26 | }
|
27 |
|
28 | int main(void){
|
29 |
|
30 |
|
31 | //###########################Initalisierung#############################
|
32 |
|
33 | DDRD |= 0x02;
|
34 | uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
|
35 | sei();
|
36 | uart_puts("Der Ladevorgang beginnt...\n\r");
|
37 | DDRD = 0b00001111;
|
38 | PORTD = 0xF0;
|
39 | init_pcint();
|
40 | uart_puts("Die Interrupts wurden initalisiert.\n\r");
|
41 | init_timer();
|
42 | uart_puts("Die Timer wurden initalisiert.\n\r");
|
43 | uart_puts("Ladevorgang abgeschlossen!\n\r");
|
44 | _delay_ms(100);
|
45 |
|
46 | //###########################Mainloop##################################
|
47 |
|
48 | flag=0;
|
49 | flag2=1;
|
50 | while(1){
|
51 |
|
52 | _delay_ms(2000);
|
53 |
|
54 |
|
55 | itoa(channel[0],out,10);
|
56 |
|
57 | uart_puts("Channel 1: ");
|
58 | uart_puts(out);
|
59 | uart_putc(10);
|
60 | uart_putc(13);
|
61 |
|
62 | _delay_ms(5);
|
63 |
|
64 | itoa(channel[1],out,10);
|
65 |
|
66 | uart_puts("Channel 2: ");
|
67 | uart_puts(out);
|
68 | uart_putc(10);
|
69 | uart_putc(13);
|
70 |
|
71 | _delay_ms(5);
|
72 |
|
73 | itoa(channel[2],out,10);
|
74 |
|
75 | uart_puts("Channel 3: ");
|
76 | uart_puts(out);
|
77 | uart_putc(10);
|
78 | uart_putc(13);
|
79 |
|
80 | _delay_ms(5);
|
81 |
|
82 | itoa(channel[3],out,10);
|
83 |
|
84 | uart_puts("Channel 4: ");
|
85 | uart_puts(out);
|
86 | uart_putc(10);
|
87 | uart_putc(13);
|
88 |
|
89 |
|
90 |
|
91 |
|
92 | //cli();
|
93 | //sei();
|
94 | }
|
95 |
|
96 |
|
97 | return 0;
|
98 | }
|
99 |
|
100 | ISR(PCINT2_vect){
|
101 | cli();
|
102 | if(counter==0){
|
103 |
|
104 | TCNT0=0;
|
105 | TCCR0B = 4;
|
106 |
|
107 | } else if(counter<= 4) {
|
108 |
|
109 | //uart_putc('5');
|
110 |
|
111 | channel[counter-1] = TCNT0;
|
112 | TCNT0=0;
|
113 |
|
114 | //flag=1;
|
115 |
|
116 | } else {
|
117 |
|
118 |
|
119 | }
|
120 | counter++;
|
121 | sei();
|
122 | }
|
123 |
|
124 | ISR(TIMER0_OVF_vect){
|
125 | TCCR0B = 0;
|
126 | counter = 0;
|
127 |
|
128 | }
|