Hier ist mein code. Ich Frage mich warum das nicht klappt.
Hier Infos zum Sensor
http://www.robotikhardware.de/download/srf05doku.pdf
Der Sensor wird aktiviert indem ich am PORTC0 ein Highpegel von mid. 10 us lege. Dann wird der Port als Eingang geschaltet.
Wenn am PINC0 ein highpegel ankommt startet der Timer1.
Der Timer1 Zählt eine variabel zähler hoch und gibt sie dann per usart aus.
Doch es kommt ständig nicht richtiges raus.
Das vom sensor ankommende signal ist min 100 us bis max 25 ms lang.
Mit dem timer (zähler ) kann ich dann die länge ca. bestimmten.
main Code
Die klasse TimerkCode:#include <avr/io.h> #include <avr/delay.h> #include <avr/signal.h> #include "timerk.h" #include "das.h" volatile unsigned int zahler =0; // HIER KÖNNTE EIN FEHLER STECKEN int Senden(unsigned int zahler) // Sende und empfange signal am Sensor { zahler =0; DDRC=0x1; PORTC = 0x1; _delay_us(20); PORTC = 0x0; DDRC=0x00; while(PINC == 0){}; TCCR1B |=(1<<CS11); while((PINC !=0)|(zahler>= 12510)){}; TCCR1B |=(1<<CS12)|(1<<CS11)|(1<<CS10); TCNT1 = 0; if(zahler>= 12510) { return 0xFF; } else{ return zahler; } } SIGNAL(SIG_OUTPUT_COMPARE1A) { zahler++; } int main(void) { initd(); sei(); Init(); USART_putid(22,2); while(1) { //Senden(zahler); USART_putid(Senden(zahler),5); // er gibt als Zahl immer nur 0 aus _delay_ms(20); } return 1; }
#include <avr/io.h>
#include <avr/delay.h>
#include "das.h"
void Init()
{
OCR1A = 12500ul;
// OCR1A = 20ul;
TIMSK |=(1<<OCIE1A);
TCCR1B |= (1<<WGM12);
TCCR1A |= (1<<FOC1A);
}
[/code]
Klasse das ( für das Usart)
Code:#include "das.h" #include <avr/io.h> #include <stdlib.h> void initd(void) { UCSRB |= (1<<TXEN)|(1<<RXEN); // UART TX einschalten UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 UBRRL = 25; } void sendend(char byte){ while(bit_is_clear(UCSRA,UDRE)); //warten auf Datenregister empty UDR=byte; } void sendesd(char *s) { while (*s!=0) { sendend(*s); s++; } } void USART_putid(int zahl, int sges){ //Ausgabe der Integerzahl zahl formatiert mit sges Stellen char buffer[17]; uint8_t l=0,n; char *z=buffer; itoa(zahl,buffer,10); while(*z!=0){l++; z++;}//Bufferlänge l for(n=l;n<sges;n++) sendend(' '); sendesd(buffer); }







Zitieren

Lesezeichen