Forum: Mikrocontroller und Digitale Elektronik PPM Atmega328p auslesen


von Marcel P. (Gast)


Lesenswert?

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
}

von Marcel P. (Gast)


Lesenswert?

Kann mir dabei keiner helfen oder fehlen noch Informationen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.