Forum: Mikrocontroller und Digitale Elektronik Licht-Trigger


von Gerhard H. (Firma: Rentner) (spectro)


Angehängte Dateien:

Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Gerhard H. schrieb:
> if (PORTD &= ~(1 << PD2))     //  Wenn Taster gedrückt wurde> if (PIND & ~(1 << PD2))     //  Wenn Taster gedrückt wurde

von Gerhard H. (Firma: Rentner) (spectro)


Lesenswert?

Danke sehr

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

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
von Gerhard H. (Firma: Rentner) (spectro)


Lesenswert?

Recht herzlichen Dank für die Hilfe!
Bin eher Anfänger.

von HildeK (Gast)


Lesenswert?

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.

von Gerhard H. (Firma: Rentner) (spectro)


Lesenswert?

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!

von Cape Canaveral (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Hermann S. (diphtong)


Lesenswert?

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!

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

QT Creator warnt brav.

von HildeK (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.