Ich verwende folgenden Code und nen mega32 dafür:
Ansonsten hilft es das Signal direkt am Sensor umzuwandeln in High-Low und dann so zum µC zu übertragen. Man sollte generell die Signal-Wandlung immer so nah wie möglich am Sensor machen und nicht den Sensorwert über die Leitung schicken.Code:#include <stdlib.h> #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/delay.h> #include "digits.h" #define SYSCLK 7372800UL // timer clock 8Mhz // |= High // &= ~ low int x = 0; // 1/100sec int y = 0; // 1/10 sec int z = 0; // 1 sec int stopp = 0; int running; int counter; double sec = 0; ISR(INT0_vect){ // Starte Messung TCCR0 = 0x01; running = 1; } ISR(INT1_vect){ // Stopp Messung TCCR0 = 0x00; running = 0; stopp = 1; } ISR(TIMER0_OVF_vect) { if (!(PINA & (1<<PINA2))) { TCCR0 = 0x01; running = 1; } if (running == 1) counter++; else counter = 0; //if (counter > 625) //7,3728MHz ohne Prescaler: (7372800/256)/288=100 --> 1/100sek Auflösung if (counter > 287) { x++; counter = 0; sec++; } if (x > 9) //Zählen der einzelnen Stellen: { x=0; y++; } if (y > 9) { y=0; z++; } if (z > 9) { TCCR0 = 0x00; } } void IRQ_init(void){ cli(); // Interrupts ein sei() GICR |= (0<<INT0); // externer INT Disable GICR |= (0<<INT1); MCUCR |= (1<<ISC10); // Einstellen des Auslösers = Seite 67 Datasheet mega 32 MCUCR |= (1<<ISC11); MCUCR |= (1<<ISC00); MCUCR |= (1<<ISC01); GICR |= (1<<INT0); // extern INT Enable GICR |= (1<<INT1); TCNT0 = 0x00; //Timer0 mit 0 initialisieren (00000000) TIMSK = 0x01; sei(); // Interrupts aus cli() } int main(void) { // Pin als Eingang mit Pullup DDRA = (0 << DDA2); // Programm DDRD = (0 << DDD2) | (0 << DDD3); // Interrupts A und B PORTA |= (1<<PA2); PORTD |= (1<<DD2) | (1<<DD3); //Timer/Counter Control Register 0 //CS02, CS01 und CS00: Prescale auf 256 TCCR0 = (1<<CS02) | (0<<CS01) | (0<<CS00); // Digit 1: B0, B1, B2, B3 DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3); // Digit 2: C4, C5, C6, C7 // Digit 3: C0, C1, C2, C3 DDRC = (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 << DDC4) | (1 << DDC5) | (1 << DDC6) | (1 << DDC7); DDRD = (1 << DDD5); DDRA = (1 << DDA0); IRQ_init(); int a = 0, b = 0, c = 0; short value = 0; running = 0; PORTA &= ~ (1<<PA0); while(1) { digit1(z); digit2(y); digit3(x); while (stopp == 1){ digit1(z); digit2(y); digit3(x); _delay_ms(50000); value = (1.395/(sec/100)) *3.6*10; //1,394 Länge zwischen S1 und S2 mit 10 für Anzeige 01,0 m/s) a = value % 10; value = value / 10; b = value % 10; value = value / 10; c = value % 10; digit1(c); digit2(b); digit3(a); _delay_ms(50000); } } }





Zitieren

Lesezeichen