Sida 1 av 1

Problem att kolla en pinne på Atmega8

Postat: 21 september 2005, 23:38:05
av mrhedin
Hej!

Jag blir lite knas på det här problemet...

Jag har lagt 5V på PORTD:s 0:te pinne.
Varför vägrar min Atmega att skicka ut en etta på 0:te pinnen på PORTB med denna tillsynes enkla kod?
Går igenom kompilatorn utan fel.

Kod: Markera allt

#include <avr/io.h>
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
void main(void)
{
   while (1)
   {
      if(CHECKBIT(PORTD,PIND0))
         {
            sbi(PORTB,0);
         }
   }
}

Postat: 22 september 2005, 00:11:59
av cykze
Med makros:

Kod: Markera allt

#include <avr/io.h>

#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
#define SET_BIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))

void main(void)
{
    SET_BIT(DDRB, PB0); // Du måste säga att PB0 ska vara utgång.

    while (1)
    {
        if (CHECKBIT(PIND, PD0))
        {
            SET_BIT(PORTB, PB0);
        }
    }
}
eller utan makros:

Kod: Markera allt

#include <avr/io.h>

void main(void)
{
    DDRB |= _BV(PB0);

    while (1)
    {
        if (PIND & _BV(PD0))
        {
            PORTB |= _BV(PB0);
        }
    }
}
Det är en smaksak hur man väljer att skriva.

Postat: 22 september 2005, 10:25:21
av mrhedin
Tackar! Det funkar...

Men om SET_BIT(DDRB, PB0); anger att en pinne på porten skall vara utgång, hur sätter man då att den skall vara ingång? Och varför behövs inte det på PORTD, PD0 i detta fall?

Postat: 22 september 2005, 12:14:39
av cykze
Ändrar man inte något i registret DDRB så är alla bitar i registret satta till 0:or, som startvärde. Om en bit är 0 betyder det att motsvarande i/o-pinne är en ingång. Därför behöver man bara ändra i DDRB om man vill att någon pinne ska vara utgång.