Nochmals hallo,
ich habe nun versucht mic's Code in mein Programm einzubauen:
Code:
#include <nibobee/iodefs.h>
#include <nibobee/delay.h>
#include <nibobee/led.h>
#include <stdlib.h>
#define FALSE (1==0)
#define TRUE (1==1)
uint8_t objekt_sichtbar_rechts(uint8_t distance_r)
{
uint16_t j,z;
PORTA |= (1 << PA0); // PA0 auf HIGH (LED einschalten)
DDRA |= (1 << DDA1); // PA1 als Ausgang
PORTA &= ~(1 << PA1); // PA1 auf LOW (andere LED ausschalten)
OCR2 = 254-distance_r; // wenn OCR2=0xFE dann Objekt sehr nahe
z=0;
for(j=0;j<30;j++) // loop time: 5ms
{
if (PINA & (1 << PA3))z++;
delay(1);
}
if (z>=29) return FALSE; // Objekt nicht gefunden
else return TRUE;
}
uint8_t objekt_sichtbar_links(uint8_t distance_l)
{
uint16_t i,y;
PORTA |= (1 << PA1); // PA1 auf HIGH (LED einschalten)
DDRA |= (1 << DDA0); // PA0 als Ausgang
PORTA &= ~(1 << PA0); // PA0 auf LOW (andere LED ausschalten)
OCR2 = 254-distance_l; // wenn OCR2=0xFE dann Objekt sehr nahe
y=0;
for(i=0;i<30;i++) // loop time: 5ms
{
if (PINA & (1 << PA3))y++;
delay(1);
}
if (y>=29) return FALSE; // Objekt nicht gefunden
else return TRUE;
}
uint8_t abstand_rechts()
{
uint8_t k,n;
k=255;
for(n=0;n<8;n++)
{
if (!objekt_sichtbar_rechts(n)) k=n; // solange kein Objekt, Distanz erhoehen
}
return k;
}
uint8_t abstand_links()
{
uint8_t l,m;
l=255;
for(m=0;m<8;m++)
{
if (!objekt_sichtbar_links(m)) l=m; // solange kein Objekt, Distanz erhoehen
}
return l;
}
/*************************************************************************
Hauptprogramm
*************************************************************************/
int main(void)
{
led_init();
uint8_t n,m;
delay(2000); // wait4programmer
if(TRUE) led_set(0,1); // true-Test ;)
sei(); // und los
while(1)
{
// Timer2-Setup für 72kHz
TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN!
OCR2 = 208; // 36kHz @15MHz
DDRA |= (1<<PA1) | (1<<PA0); // Anoden der LEDs mit Vorwiderstand (??? Ohm) an PA0/1
PORTA &= ~((1<<PA1) | (1<<PA0)); // low = LEDs aus
DDRA &= ~(1<<PA3); // keine 72kHz-Ansteuerung
PORTA &= ~(1<<PA3); // deshalb Kathoden-Pin auf Ausgang ohne PullUp
n=abstand_rechts();
m=abstand_links();
if ((n!=255) && (m!=255))
{
if (n<2) led_set(LED_R_RD, 1);
if (m<2) led_set(LED_L_RD, 1);
delay(10);
}
}
}
ISR (TIMER2_COMP_vect)
{
static uint8_t status=0;
if(status)
{
led_set(LED_R_YE, 1); // Kontroll-LED
PORTA |= (1<<PA3);
status=0;
}
else
{
led_set(LED_R_YE, 0);
PORTA &= ~(1<<PA3);
status=1;
}
}
Wenn sich von links oder rechts ein Gegenstand nähert, soll die linke oder rechte rote LED leuchten.
Leider funktioniert der Code wieder nicht, was ist nun jetzt wieder falsch?
Lesezeichen