MrTaco
13.09.2010, 12:41
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
#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;
}
Die klasse Timerk
#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)
#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);
}
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
#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;
}
Die klasse Timerk
#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)
#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);
}