Sida 3 av 5

Postat: 24 april 2005, 11:21:58
av Macce
Den koden fungerar inte heller...

Postat: 24 april 2005, 11:24:48
av cykze
Jo, det ska den göra. Har du pullup på PD2?

Postat: 24 april 2005, 11:29:07
av MicaelKarlsson
Har du testat denna kod?

#include <avr/io.h>

int main(void)
{
DDRB = 0xFF;
DDRD = 0x00;
while(1)
{
if (PINB&0x02==0x02)
{
PORTB=0x1;
}
else
{
PORTB=0;
}
}
}

PINB är ju inpinnar på PORTB (databladet sid 15)

Postat: 24 april 2005, 11:35:32
av Macce
cykze, nej, vad är passligt värde?
Den kod du gav tänder en led, men inget händer när man pillar på knapparna. Inget händer heller om jag drar 5V till ingångsbenen på kretsen.

MicaelKarlsson, nepp, med dendär koden är alla leds släkta och inget händer på knapparna.

Postat: 24 april 2005, 11:39:54
av Macce
JIPPII nu fungerar det när jag drar 5V till PB0!
Dagen är räddad! :)

Tusen tack till er!

Postat: 24 april 2005, 11:41:24
av MicaelKarlsson
Grattis!

Vad var det som gjorde att det funkade till slut?

Postat: 24 april 2005, 11:44:15
av Macce
Hmm, det fungerar ej.

Ledsen på boardet är kopplade så att de tänds när en port dras låg, när jag pillade med 5V på en port blev det kortis = leden slocknade.

Alltså mao fungerar det inte ännu :(

Postat: 24 april 2005, 12:22:54
av Macce
Nu fick jag det att fungera!

Tackar alla + speciellt Ollebull @ #Elektronik :)

Postat: 24 april 2005, 12:51:48
av cykze
Macce skrev:cykze, nej, vad är passligt värde?
Den kod du gav tänder en led, men inget händer när man pillar på knapparna. Inget händer heller om jag drar 5V till ingångsbenen på kretsen.

MicaelKarlsson, nepp, med dendär koden är alla leds släkta och inget händer på knapparna.
Om du inte använder något externt pullup så kommer knappen inte fungera om det är en vanlig slutande knapp. Enklast är om du aktiverar det inbyggda pullup-motståndet på just den pinnen som du har knappen kopplad till. Det gör du genom att sätta porten till ingång (genom DDRD) och sedan aktivera pullup:et (genom PORTD).

Kod: Markera allt

int main()
{
    DDRB = 0xFF; // Sätter alla pinnar som utgångar
    PORTB = 0xFF; // Sätter alla pinnar höga

    DDRD = 0x00; // Sätter alla pinnar som ingångar
    PORTD = _BV(PD2); // Aktiverar pullup på pinnen PD2

    while (1)
    {
        if (!(PIND & _BV(PD2))) // Om PD2 låg
        {
            PORTB &= ~_BV(PB0); // Sätt bit0 i PORTB till 0. (tänder led:en)
        }
        else
        {
            PORTB |= _BV(PB0); // Sätt bit0 i PORTB till 1. (släcker led:en)
        }
    }
}
Se verkligen till att du studerar databladet för kretsen noga. I det står i stort sett allt du behöver veta, förutom hur du hanterar interrupts i avr-gcc.

Postat: 24 april 2005, 13:22:21
av Macce
Tack för koden, mycket jag känner igen från php i den, bara "innehållet" som jag inte kunde.

Aktiveras pullup på alla portar om jag lägger PORTD = 0xFF ? Är det till skada att ha pullup på de portar man inte använder?

Skall bläddra igenom databladet när jag hinner, det är ju inte direkt lite text i det :)

Finns det smidigare sätt att kräva att två knappar än intynda än

Kod: Markera allt

        if (!(PIND & _BV(PD2)))
        {
            if (!(PIND & _BV(PD3)))
             {
              PORTB &= ~_BV(PB0);
             }

        }
?
Provade med if (!(PIND & _BV(PD2) | _BV(PD3))) men det fungerade inte.

Postat: 24 april 2005, 13:32:41
av MicaelKarlsson
Funkar det med: if (!(PIND & _BV(PD2) & _BV(PD3)))

Postat: 24 april 2005, 13:52:01
av Macce
Lysdioden lyser hela tiden med den koden.

Postat: 24 april 2005, 14:15:23
av MicaelKarlsson
if (!((PIND & _BV(PD2)) & (PIND & _BV(PD3)))

Postat: 24 april 2005, 14:35:10
av cykze
Macce skrev:Tack för koden, mycket jag känner igen från php i den, bara "innehållet" som jag inte kunde.

Aktiveras pullup på alla portar om jag lägger PORTD = 0xFF ? Är det till skada att ha pullup på de portar man inte använder?

Skall bläddra igenom databladet när jag hinner, det är ju inte direkt lite text i det :)

Finns det smidigare sätt att kräva att två knappar än intynda än

Kod: Markera allt

        if (!(PIND & _BV(PD2)))
        {
            if (!(PIND & _BV(PD3)))
             {
              PORTB &= ~_BV(PB0);
             }

        }
?
Provade med if (!(PIND & _BV(PD2) | _BV(PD3))) men det fungerade inte.
Jepp. Du kan t ex skriva:

Kod: Markera allt

if (!(PIND & _BV(PD2)) && !(PIND & _BV(PD3)))
{
    PORTB &= ~_BV(PB0);
}
edit: Sätter du ut en parentes till så borde ditt uttryck också fungera:
if (!(PIND & (_BV(PD2) | _BV(PD3))))

Postat: 24 april 2005, 14:51:12
av Macce
Okay tackar och bockar igen. :)

När skall det vara &, &&, | osv och hur skall man veta det?