[Atmega8, C] Odczyt i zapis tylko jednego pinu + zmienna

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Adix3
-
Posty: 8
Rejestracja: 30 sty 2011, 15:18
Lokalizacja: Kraków

[Atmega8, C] Odczyt i zapis tylko jednego pinu + zmienna

Post autor: Adix3 » 30 sty 2011, 15:26

Witam serdecznie.

Od wczoraj przesiadłem się na język C z BASCOMA i mam mały problem. Chodzi o to że nie wiem jak odczytać tylko jeden pin (np pin 6 portu D) i zapisać jego stan (0 lub 1) do zmiennej np. A. Oraz jak następnie wystawić na jednym pinie (np. pin 7 portu D) stan (0 lub 1) z tej zmiennej A. Czy ktoś z kolegów mógłby mi to wytłumaczyć??

W BASCOMIE było prosto bo dało się to zrobić tak

Kod: Zaznacz cały

[...]

Dim A As Byte

Do

 A = Pind.6  'odczytanie stanu pinu i zapisanie go do zmiennej

 Portd.7 = A  'wystawienie na pinie 7 stanu 0 lub 1 - zależy od zmiennej

Loop

[...]
Gdyby ktoś mógł mi pomóc to będę wdzięczny.

Pozdrawiam

keruseykaryu

Post autor: keruseykaryu » 30 sty 2011, 20:15

Nie chce mi się sprawdzać czy to zadziała, ale spróbuj tak:

A = bit_is_set(PINA, PA6);
if(A) PORTD |= (1<<PD7); else PORTD &= ~(1<<PD7);

albo jak A nie jest więcej używane to wyeliminuj go:

if(bit_is_set(PINA, PA6) PORTD |= (1<<PD7); else PORTD &= ~(1<<PD7);

Adix3
-
Posty: 8
Rejestracja: 30 sty 2011, 15:18
Lokalizacja: Kraków

Post autor: Adix3 » 30 sty 2011, 20:58

Ok już załapałem.

Zrobiłem to trochę inaczej:

Kod: Zaznacz cały

[...]

A = bit_is_set(PIND, PD6);   
if (A) PORTD = 0b10000000; else PORTD = 0b00000000;  
                                 
[...]
Chciałbym się jeszcze coś dowiedzieć

1. W wyżej przedstawianym przykładzie mam zmienną A zdefiniowaną jako zmienna char. Czyli w zależności od stanu na pinie będzie ta zmienna przyjmowała wartość 0x00 (dla 0 na pinie) lub 0xFF (dla 1)?? Bo chyba dla 1 na pinie nie przyjmie ta zmienna wartości np. 0x3F?


2. Do czego jest to bit_is_set?? to jest jakaś funkcja??
3. Mam konfiguracje portów

Kod: Zaznacz cały

DDRD = 0b10011111 //piny D0...D4 i D7 jako wyjście; piny D5 i D6 jako wejście
PORTD = 0b00000000 //na wyjścia ustaw 0 a wejścia bez podciągnięcia do VCC
I co gdy zrobię coś takiego??

Kod: Zaznacz cały

PORTD = 0b01100000
Wejścia skonfigurowane wcześniej do pracy bez pull-up, teraz zostaną podciągnięte do VCC? Chyba trzeba uważać żeby nie zmienić tego ustawienia.

keruseykaryu

Post autor: keruseykaryu » 30 sty 2011, 23:50

1. W wyżej przedstawianym przykładzie mam zmienną A zdefiniowaną jako zmienna char. Czyli w zależności od stanu na pinie będzie ta zmienna przyjmowała wartość 0x00 (dla 0 na pinie) lub 0xFF (dla 1)?? Bo chyba dla 1 na pinie nie przyjmie ta zmienna wartości np. 0x3F?
No właśnie o to chodzi, że przyjmie taką wartość jak waga bitu w bajcie odczytanym z PINA. Dlatego jakbyś napisał if(A == 1) to nigdy taki warunek się nie spełni. Jednak if(A) się spełni, bo każda wartość A nie równa zero jest prawdą dla takiego warunku.
2. Do czego jest to bit_is_set?? to jest jakaś funkcja??
Funkcja sprawdzająca czy dany bit jest ustawiony. Jest jeszcze bliźniak bit_is_clear().
http://www.nongnu.org/avr-libc/user-man ... __sfr.html
Wejścia skonfigurowane wcześniej do pracy bez pull-up, teraz zostaną podciągnięte do VCC? Chyba trzeba uważać żeby nie zmienić tego ustawienia.
Jak najbardziej. Dlatego lepiej korzystać z operatorów |= (logiczna suma) &= (logiczny iloczyn) ^= (logiczna alternatywa) co pozwoli wybiórczo modyfikować bity.

Kod: Zaznacz cały

PORTD = 0b01100000;
możesz zastąpić

Kod: Zaznacz cały

PORTD &= 0b01100000;
co skasuje to co potrzebujesz a zostawi te dwa wejścia w spokoju.

I na przyszłość. Naucz się korzystać z nazw bitów i takie rzeczy jak DDRD = 0b10011111 pisz:

Kod: Zaznacz cały

DDRD = (1<<PD7)|(1<<PD4)|(1<<PD3)|(1<<PD2)|(1<<PD1)|(1<<PD0);
Trochę się trza rozpisać, ale potem łatwiej coś zmieniać, odejmować, dodawać. Jakbyś jeszcze sobie zrobił definicje:

Kod: Zaznacz cały

#define WYJSCIA_KONFIG DDRD
#define PRZEKAZNIK1  (1<<PD7)
#define LED5               (1<<PD4)
#define LED4               (1<<PD3)
itd. To cała postać poprzednia wygląda tak:

Kod: Zaznacz cały

WYJŚCIA_KONFIG = PRZEKAZNIKI|LED5|LED4|LED3|LED2|LED1;
I jakoś tak lepiej się czyta.

ODPOWIEDZ