äh welche lösung hast du jetzt genommen?
Druckbare Version
äh welche lösung hast du jetzt genommen?
Hallo, die Lösung mit dem Markro funktioniert auch nur, wenn ich auch den PIN mit den Taster als Ausgang initialisiere. Wenn ich den PB1 als Input initialisiere, klappt auch die Makro Lösung nicht (ich wunder mich immer noch). Genauso gut klappt aber auch die auskommentierte Lösung mit der If-Anweisung.
Hier das was klappt:
noch einmal vielen Dank.Code:#include <avr/io.h>
#include <avr/interrupt.h>
#define VALUEPB1 ((PINB & (1<<PB1)) > 0 ? (1):(0))
int main( void )
{
DDRB = 0xFF; // Alles als Ausgang deklarieren
PORTB |= (1 << PB1); // Pin 1 auf High
PORTB |= (1 << PINB4); // LED an
while(1)
{
switch(VALUEPB1)
{
case 0: //bit is cleared
PORTB |= (1 << PB4);
break;
case 1: //bit is set
PORTB &= ~(1 << PB4);
break;
default: //fallthru
break;
}
/*
if( bit_is_clear(PINB, PB1))
PORTB |= (1 << PB4);
else
PORTB &= ~(1 << PB4);
*/
}
}
Gruß Frank
Interupt aktiv bei Port als Ausgang:
Das die Interupts INT0 bei dem entsprechenden Pin funktionieren auch wenn dieser als Ausgang definiert ist, ist kein Bug sondern ein Feature.
Man kann nämlich dadurch einen Software Interrupt auslösen.
Wenn Du das PORTx Register auf 1 setzt und DDRx auf 0, dann wird der Pullup aktiviert, wie Du schon richtig erkannt hast.
Änderst Du aber im nachhinein das DDRx Register auf 1 wird der entsprechende Pin fest auf 1 gesetzt weil PORTx ja immer noch 1 ist.