Lösung: Arduino UNO Taster 1

Aufgabe a)

Quellcode I

#define F_CPU 16000000UL

#include <avr/io.h>

int main(void)
{
	DDRD |= 0b11111111;
	DDRB &= ~0b00000100;
		
	while (1)
	{
		if(!(PINB & 0b00000100)) {
			PORTD |= 0b00000100;
		}
		PORTD &= ~0b00000100;
	}
}

main() Funktion

DDRD |= 0b11111111;

PortD als Ausgang definieren. Alle Pins sollen als Ausgang fungieren.

DDRB &= ~0b00000100;

PB2 als Eingang definieren definieren (mit Bitmaske)

Hauptschleife

  • if(!(PINB & 0b00000100)) {}

    Auf Tastendruck warten.
    Dabei ist zu bedenken, dass der Taster low-active ist. Die Abfrage mit der Bitmaske (UND-Maske) muss also noch negiert werden.

    • PD2 Auf HI setzen. LED einschalten.
  • PD2 Auf LOW setzen. LED ausschalten.

Der Hauptfehler im ersten Programm ist, dass der internen Pullup-Widerstand am PB2 nicht aktiviert wurde. Der Taster ist extrem anfällig auf äußere EM-Störungen und schaltet ggf. verzögert oder gar nicht.

Aufgabe b)

Quellcode II

#define F_CPU 16000000UL

#include <avr/io.h>

int main(void)
{
	DDRD |= 0b11111111;
	DDRB &= ~0b00000100;
	PORTB |= 0b00000100;
		
	while (1)
	{
		if(!(PINB & 0b00000100)) {
			PORTD |= 0b00000100;
		}
		PORTD &= ~0b00000100;
	}
}

main() Funktion

PORTB |= 0b00000100;

Der Hauptfehler aus dem ersten Programm wird hier eliminiert. Der interne Pullup-Widerstand an PB2 wird aktiviert.

Das Programm hat dennoch einen gravierenden Fehler im Programmablauf.
Beim Tastendruck wird die if-Bedingung zwar angesprungen und die LED eingeschaltet. Jedoch wird sie danach sofort ausgeschaltet. Die LED wird also mit einem Hochfrequenten PWM-Signal angesteuert. Dies sorgt dafür, dass die LED dunkler leuchtet, allerdings auch und vor allem für viele Störsignale.

Messung 1 an der LED

Messung

Messung an der LED

Die Messung an der LED zeigt ein PWM-Signal mit einer Pulsdauer von T=440 ns.
Dies entspricht einer Pulsfrequenz von etwa 2,3 MHz.

Aufgabe c) Quelltext:

#include <avr/io.h>

int main(void)
{
	DDRD |= 0b11111111;
	DDRB &= ~0b00000100;
	PORTB |= 0b00000100;
		
	while (1)
	{
		if(!(PINB & 0b00000100)) {
			PORTD |= 0b00000100;
		}
		else{
			PORTD &= ~0b00000100;
		}
	}
}

Die else-Bedingung eliminiert den Fehler aus Quellcode II.

Messung 2 an der LED

Messung

Messung an der LED

Die Messung an der LED zeigt den Einschaltmoment und danach ein konstantes HIGH-Signal.