PPM Atmega328p auslesen

Gast #2210369
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.