Hallo
Naja, Sinn würde das schon machen:
Der ACS-Code stammt von hier:Code:// Nibobee ACS mit Pinselbee 12.1.2010 mic #include <nibobee/iodefs.h> #include <nibobee/led.h> #include <nibobee/sens.h> volatile uint8_t count36kHz; volatile uint8_t acs=0; void Sleep(uint8_t pause); void Msleep(uint16_t pause); void ACSData(uint16_t *data) { OCR2=253; PORTA |= (1<<PA1); // ACS LED left on while((PINA & (1<<PA2)) && (OCR2 > 151)) { acs=15; //15 Impulse senden, acs wird in OVF-ISR runtergezählt while(acs); OCR2--; } PORTA &= ~(1<<PA1); // ACS LED left off data[0]=OCR2; while(!(PINA & (1<<PA2))); // warten bis keine Echo mehr OCR2=253; PORTA|= (1<<PA0); // ACS LED right on while((PINA & (1<<PA2)) && (OCR2 > 151)) { acs=15; while(acs); OCR2--; } PORTA &= ~(1<<PA0); // ACS LED right off 6 data[1]=OCR2; while(!(PINA & (1<<PA2))); } int main(void) { uint16_t data[2]; // Speicher für ACS-Werte led_init(); sens_init(); // Setup Timer2 TCCR2 = (1 << WGM20)|(1 << CS20); // PhaseCorrect-PWM, no prescaling, no OC2-Pin! TCNT2 = 96; // (512-416) 36kHz @15MHz OCR2 = 151; // (255-(208/2)) 151 ist 50:50 Compare Match für symetrische Halbwellen TIMSK |= (1 << OCIE2)|(1 << TOIE2); // Comp und OVF-ISR enable, Overflow bei Bottum! enable_interrupts(); led_set(0,1); Msleep(2000); // wait4programmer DDRA |= (1<<PA3)|(1<<PA1)|(1<<PA0); PORTA &= ~((1<<PA3)|(1<<PA1)|(1<<PA0)); //DDRB |= (1<<PB4); // Test mit LineLEDs //PORTB &= ~(1<<PB4); while(!sens_getLeft() & !sens_getRight()) // solange keine Taste gedrückt wird {Msleep(200); PORTB ^= (1<<PB0);} // hektisches Blinken mit LED0 while(1) { ACSData(data); PORTB &= ~15; // alle Leds aus if(data[0] > 250) led_set(1,1); else if(data[0] > 230) led_set(0,1); if(data[1] > 250) led_set(2,1); else if(data[1] > 230) led_set(3,1); Msleep(100); } return(0); } ISR (TIMER2_COMP_vect) { PORTA ^= (1<<PA3); // IR-LEDs togglen //PORTB ^= (1<<PB4); // Test mit LineLEDs } // Frequenzkorrektur 512-416 plus 3 Takte fürs Laden von TCNT2? ISR (TIMER2_OVF_vect) { TCNT2 = 99; if(count36kHz) count36kHz--; if(acs) acs--; } void Sleep(uint8_t pause) // 1/36000 Pause blockierend { count36kHz=pause; while(count36kHz); } void Msleep(uint16_t pause) // 1/1000 Pause blockierend { while(pause--) Sleep(36); }
https://www.roboternetz.de/phpBB2/ze...=459661#459661
ACSData() liefert Werte von 151(kein Echo) bis 253(vor der Nase) und funktioniert wie LineData() oder Odometriedata() beim asuro. Ich hab's mit einer Brücke zwischen X2:1 (PA2) und X2:3 (GND) getestet....
Gruß
mic
[Edit]
Tilde entfernt s.u.







Zitieren

Lesezeichen