Hi!
Ich habe einen Fototransistor an einen Atmega8 angehängt und lese die
Spannung per ADC aus. Wenn die Spannung einen gewissen wert
unterschreitet, soll eine LED angeschaltet werden.
Beim Start des Programms (Fotosensor nicht beleuchtet->geringe Spannung
am ADC) leuchtet die LED bereits, wird der Sensor beleuchtet geht die
LED aus, wenn ich dann jedoch die Beleuchtung des Fotosensors wieder
beende, geht die LED NICHT wieder an(obwohl der codeabschnitt in dem das
passieren sollte durchlaufen wird, siehe log-datei). Was mache ich da
falsch? wieso schaltet "if (result<30) {uart_puts (" LED ist an ");
PORTC |= (0<<PC5); };" die LED nicht wieder an??
grüße
andy
1 | #include <avr/io.h>
|
2 | #include <stdint.h>
|
3 | #define FOSC 1843200
|
4 | #define BAUD 9600
|
5 | #define MYUBRR FOSC/16/BAUD-1
|
6 | #include <stdlib.h>
|
7 | #define PI 3.141592654;
|
8 | uint8_t EINGELESENEBITS;
|
9 |
|
10 | int main (void)
|
11 | {
|
12 | ////////////////////////*Leuchtdiode*/////////////////////////////
|
13 | DDRC |= (1<<DDC5);
|
14 | ////////////////////////* UART *//////////////////////////////////////////////
|
15 | USART_Init ( MYUBRR );
|
16 | ////////////////////////* ADC *///////////////////////////////////////////////
|
17 | while(1)
|
18 | {
|
19 | uint16_t result = 0;
|
20 | DDRC |= (1<<DDC4);
|
21 | ADMUX = 0b100;
|
22 | ADMUX |= (1<<REFS1) | (1<<REFS0);
|
23 | ADCSRA = (1<<ADEN) | (1<<ADPS1) |(1<<ADPS0);
|
24 | ADCSRA |= (1<<ADSC);
|
25 | while ( ADCSRA & (1<<ADSC) )
|
26 | {
|
27 | ;
|
28 | }
|
29 | result = ADCW;
|
30 | ADCSRA &= ~(1<<ADEN);
|
31 | //Ausgabe an USART
|
32 | char ASCII[15];
|
33 | utoa(result, ASCII, 10);
|
34 | uart_puts ("Ergebnis Spannungsmessung: ");
|
35 | uart_puts(ASCII);
|
36 | uart_puts (" Volt"); //Natürlich müssten die Werte noch in die tats. Spannung umgerechnet werden!!!
|
37 | //LED einschalten, wenn Lichtstärke gross
|
38 | if (result<30) {uart_puts (" LED ist an "); PORTC |= (0<<PC5); };
|
39 | if (result>30) {uart_puts (" LED ist aus "); PORTC |= (1<<PC5); };
|
40 | uart_puts("\r\n"); //Zeilenumbruch
|
41 | }
|
42 |
|
43 | //////////////////////////////////////////////////////////////////////////////
|
44 |
|
45 | while(1)
|
46 | {
|
47 | }
|
48 |
|
49 | return 0;
|
50 | }
|
51 |
|
52 |
|
53 | //=====================================
|
54 | //====== USART initialisieren =========
|
55 | //=====================================
|
56 | void USART_Init( unsigned int ubrr)
|
57 | {
|
58 | UBRRL = 8;
|
59 | UCSRB = (1<<RXEN)|(1<<TXEN);
|
60 | UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
|
61 | }
|
62 |
|
63 |
|
64 |
|
65 | //=====================================
|
66 | //====== USART-Sendefunktion ==========
|
67 | //=====================================
|
68 | void uart_puts (char *s)
|
69 | {
|
70 |
|
71 | while (*s)
|
72 | {
|
73 | uart_putc(*s);
|
74 | s++;
|
75 | }
|
76 | }
|
77 |
|
78 |
|
79 |
|
80 | //=====================================
|
81 | //====== USART-Sendefunktion ==========
|
82 | //=====================================
|
83 | void uart_putc(unsigned char c)
|
84 | {
|
85 |
|
86 | while (!(UCSRA & (1<<UDRE)))
|
87 | {
|
88 | }
|
89 | UDR = c;
|
90 | }
|
Log-Datei: (habe ich der übersichtlichkeit halber etwas gekürzt)
(...)
Ergebnis Spannungsmessung: 14 Volt LED ist an
Ergebnis Spannungsmessung: 14 Volt LED ist an
Ergebnis Spannungsmessung: 14 Volt LED ist an
Ergebnis Spannungsmessung: 39 Volt LED ist aus
Ergebnis Spannungsmessung: 41 Volt LED ist aus
Ergebnis Spannungsmessung: 44 Volt LED ist aus
Ergebnis Spannungsmessung: 44 Volt LED ist aus
(...)
Ergebnis Spannungsmessung: 48 Volt LED ist aus
Ergebnis Spannungsmessung: 48 Volt LED ist aus
Ergebnis Spannungsmessung: 47 Volt LED ist aus
Ergebnis Spannungsmessung: 22 Volt LED ist an
Ergebnis Spannungsmessung: 15 Volt LED ist an
Ergebnis Spannungsmessung: 12 Volt LED ist an
(...)
Ergebnis Spannungsmessung: 13 Volt LED ist an
Ergebnis Spannungsmessung: 12 Volt LED ist an
Ergebnis Spannungsmessung: 12 Volt LED ist an
(...)