Ich komme nicht drauf, wo da der Fehler liegt. Könnte mir jemand einen Rat geben? PB1-LED leuchtet nicht. Vielen Dank! /* * LICHT, NACHTRIGGERBAR * * Created: 14.1.2023 11:20:01 * Author : Übung 8 */ #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> uint8_t timer_overflow_counter = 0, leuchtdauer = 10, leuchtdauer_led_2 = 0, tasten_flag = 0; void init_timer_0 (void) { TCCR0B = (1<<CS01) + (1<<CS00); // Prescaler = 64 bei 8 MHz TIMSK0 = (1<<TOIE0); // Timer overflow interrupt enable TCNT0 = 6 ; // Timer mit 6 vorladen } int main(void) { DDRB = 0xFF ; // PORTB = Ausgang DDRD = 0xF0 ; // PD0..PD3 auf Eingang PORTD |= (1 << PD2) ; // PD2 = Pull up init_timer_0(); // Timer0 initialisieren sei(); // Interrupts einschalten while (1) { if (PORTD &= ~(1 << PD2)) // Wenn Taster gedrückt wurde { tasten_flag = 1 ; // Flag für "Taster wurde gedrückt" leuchtdauer_led_2 = leuchtdauer; // leuchtdauer_led2 auf Anfangswert 10 } } } ISR(TIMER0_OVF_vect) { if (timer_overflow_counter <= 399) timer_overflow_counter ++ ; else // nach dem 400. Durchlauf: { TCNT0 = 6; // reload timer0 PORTB ^= (1 << PB0) ; // LED1 toggeln timer_overflow_counter = 0; // Zähler zurücksetzen if (tasten_flag == 1) // Taster wurde gedrückt { PORTB |= (1 << PB1) ; //LED on leuchtdauer_led_2 -- ; // Um 1 runter zählen if (leuchtdauer_led_2 == 0) { PORTB &= ~(1 << PB1); // LED aus ; tasten_flag = 0; } } } } Verwendet wird ein ATMega48
Gerhard H. schrieb: > Ich komme nicht drauf, wo da der Fehler liegt. Könnte mir jemand einen > Rat geben? PB1-LED leuchtet nicht. > Vielen Dank! Lies mal was über Netiquette.
Gerhard H. schrieb: > if (PORTD &= ~(1 << PD2)) // Wenn Taster gedrückt wurde Nö > if (PIND & ~(1 << PD2)) // Wenn Taster gedrückt wurde
Der Rest ist auch reichlich chaotisch. So viel Durcheinander für ein einfaches [[Monoflop] in Software. Außerdem fehlt da noch ein volatile, siehe Interrupt. Eher so. Siehe Anhang. Da waren noch einige andere Fehler drin.
:
Bearbeitet durch User
Gerhard H. schrieb: > Bin eher Anfänger. Ich sehe z.B. noch uint8_t timer_overflow_counter = 0 und if (timer_overflow_counter <= 399) Das passt eh nicht zusammen, uint8 geht nur bis 255. Du würdest also nie den 'else'-Zweig erreichen.
Das mit uint8_t ist ein schlimmer Fehler in dem Fall. Sollte nicht passieren. Mit 74 C lernen ist leider nicht so leicht, aber ich versuche, mich durchzubeissen. ;-) Vielen Dank nochmals für die Tipps!
HildeK schrieb: > Ich sehe z.B. noch > uint8_t timer_overflow_counter = 0 > und > if (timer_overflow_counter <= 399) > Das passt eh nicht zusammen, uint8 geht nur bis 255. Super Compiler, der das zuläßt und nicht sofort hustet oder spuckt. Dreckswerkzeug -> Drecksergebnis.
Cape Canaveral schrieb: > Super Compiler, der das zuläßt und nicht sofort hustet oder spuckt. Mich wundert, dass der avr-gcc trotz Parameter -Wall nicht davor warnt.
Gerhard H. schrieb: > Mit 74 C lernen ist leider nicht so leicht, aber ich versuche, mich > durchzubeissen. ;-) Geil! Lass dich nicht entmutigen und mach weiter so! Endlich mal ein Rentner, der nicht nach eigener Aussage zu alt ist um was neues zu lernen find ich super, Respekt!
Gerhard H. schrieb: > Mit 74 C lernen ist leider nicht so leicht, aber ich versuche, mich > durchzubeissen. ;-) Respekt! Ich bin nur wenige Jahre jünger und kenne das: man vergisst manchmal schneller als man lernt ... > Vielen Dank nochmals für die Tipps! Das ist der Grundgedanke eines Forums. Auch wenn es manche ab und zu vergessen. 😉
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.