In C spuckt er mir leider die selben Mist Werte wie im Bascom Prog aus. Also scheint irgendwas an meinem Prinzip völlig daneben zu gehen.
main.c
Code:
#include <avr/io.h>
#include <stdlib.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "uart.h"
#include "input.h"
/* define CPU frequency in Mhz here if not defined in Makefile */
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
/* 9600 baud */
#define UART_BAUD_RATE 9600
int main(void)
{
//Uart initialisieren
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
//Eingänge INT0 und INT1 initialisieren
init_inputs();
while(1)
{
char tmp[5];
itoa(input_channel[3], tmp, 10);
uart_puts(tmp);
uart_puts("\n");
_delay_ms(50);
}; //Endlosschleife
}
input.c
Code:
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include "input.h"
// **************************
// Prototypen
// **************************
void init_inputs(void);//Initialisiert INT0 und INT1
// **************************
// Deklarationen
// **************************
uint16_t (input_channel)[7]; //Array für die einzelnen Kanäle
uint8_t (fail_flag); //Flag für Fail Safe Modus
uint8_t (ch_cnt); //Counter für aktuellen Kanal
void init_inputs(void)
{
//INT0 und INT1 als Eingang
//DDRD = 0b11111001;
DDRD &= ~((1 << DDD1) | (1 << DDD2));
//INT0 und INT1 aktivieren
GICR |= ((1 << INT0) | (1 << INT1));
//Beide INT auf steigene Flanke konfigurieren
MCUCR |= ((1 << ISC01) | (1 << ISC00)); //INT0
MCUCR |= ((1 << ISC11) | (1 << ISC10)); //INT1
//Timer1 Prescaler auf 1 stellen
TCCR1B |= (1 << CS10);
//Timer1 Overflow INT aktivieren
TIMSK |= (1 << TOIE1);
//Interrupts anschalten
sei();
};
//ISR von INT0
ISR(INT0_vect)
{
//Wenn der CH != 0 dann speichere Zählerstand
if(ch_cnt != 0){input_channel[ch_cnt] = TCNT1;}
//Ch Zähler erhöhen
ch_cnt++;
//Zähler zurücksetzen
TCNT1 = 0;
//INT0 auf fallende Flanke
if(ch_cnt == 6){MCUCR &= ~(1 << ISC00);}
}
//ISR von INT1
ISR(INT1_vect)
{
//Wenn der CH != 0 dann speichere Zählerstand
if(ch_cnt != 0){input_channel[ch_cnt] = TCNT1;}
//Ch Zähler erhöhen
ch_cnt++;
//Zähler zurücksetzen
TCNT1 = 0;
//INT1 auf fallende Flanke
if(ch_cnt == 6){MCUCR &= ~(1 << ISC10);}
}
//Timerüberlauf nach ~4ms, wenn nicht manuell zurückgesetzt wird
ISR(TIMER1_OVF_vect)
{
//Kanalzähler zurücksetzen
ch_cnt = 0;
//Beide INT auf steigene Flanke konfigurieren
MCUCR |= ((1 << ISC01) | (1 << ISC00)); //INT0
MCUCR |= ((1 << ISC11) | (1 << ISC10)); //INT1
}
Aus hTerm
Code:
...
...
...
9618<\n>
9618<\n>
9618<\n>
9618<\n>
9618<\n>
9618<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
8837<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
6762<\n>
-2320<\n>
-2320<\n>
-2320<\n>
-2320<\n>
-2320<\n>
-2320<\n>
-2320<\n>
...
...
...
Ich versteh nur langsam nicht mehr so ganz wieso dieses Prinzip nicht funktioniert.
Bei jedem INT den Zähler speichern und zurücksetzen.
Beim letzten auf fallende Flanke, damit das Ende des letzten Puls erfasst wird.
Die Pause nach den Pulsen ist dann größer als 4ms, sodass der Timer überläuft.
Der setzt dann alles auf Anfang zurück. Die 4ms Pause ist quasi das Syncronistations Signal.
Jemand ne Idee was ich falsch mache?
Gruß Basti
PS.: Schönen Feiertag noch 
EDIT:
gerade festgestellt, für Ch1 passt es eigentlich. Da bringt er mir einen Wert zwischen etwa 18000 und 30000 Ticks des Timers.
Nur die weiteren Ch haben dann falsche oder sogar negative Werte. Wie kann der Timer negativ Zählen?
Das sind die 6Ch Daten die er mir ausspuckt....
Code:
23925 | -239 | 2331 | -14653 | 0 | 0<\n>
Nur Ch1 verhält sich wie gewollt, äquivalent zum Knüpel der Fernbedienung, alle anderen springen ab und zu mal wild umher, aber nicht unbedingt auf Knüpelbewegungen.
EDIT2:
Weitere Erkenntnis, wenn ich beide Oszi Kanäle an die INTS halte und mir die Signale anschauen will, kommen die auch auf einmal korrekt an :-D scheinbar hängt der ganze scheiß irgendwie in der Luft und fängt sich Müll ein, sobal ich das aber - wenn auch nur minimal - mit dem Oszi belaste, haut's hin. Mal überlegen was ich da nun mache....
EDIT3:
Tatsache, die Ausgänge des Empfängers hingen bei Low Pegel völlig in der Luft. 10k gegen Masse und die Nummer läuft wie geschmiert.
Is ja klar, das der mir nur Müll auswertet, wenn die INTs sich alles einfangen, nur nicht das richtige Signal :-D
Aber aus lauter Trotz bleibe ich jetzt bei C, dann lern ich das auch endlich mal - bis dato noch NIE angefasst.
Alles was oben steht habe ich mir in etwa 48h angelesen
Lesezeichen