Ach te przyciski AVR C

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
Laik
Użytkownik
Posty: 242
Rejestracja: 21 maja 2007, 19:19
Lokalizacja: z nienacka

Ach te przyciski AVR C

Post autor: Laik » 16 gru 2008, 17:22

Wszystko szło pięknie dopóki nie przyszła pora na przyciski. Co tu jest źle powiedzcie ze nie odpala mi ?? Podłączenie na pewno dobre.

Kod: Zaznacz cały


#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{   
	DDRB = 0xFF; 		// 1111 1111 
	DDRC = 0x00;		// 0000 0000
	
   while(1)
   {
   
   PORTC = 0x0F;	    // 1111
   
   if((!PINC & 0x01))
		PORTB = 0xFF;
   
   PORTB = 0x00;
   
   }
}

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 16 gru 2008, 18:05

Kod: Zaznacz cały

if(PINC & 0x01)
  {
   PORTB = 0xFF;
  } 
else
  {
   PORTB = 0x00; 
  }

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 16 gru 2008, 18:40

Swoją drogą to tego wykrzyknika wrzuć przed nawias:)

Kod: Zaznacz cały

if(!(PINC & 0x01)) 
tak ma byc.

Awatar użytkownika
c4r0
Moderator
Posty: 2152
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 16 gru 2008, 18:49

Tutaj to chyba nie ma akurat znaczenia ... ?

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 16 gru 2008, 18:53

Oj chyba ma... bo niedawno coś tam skubałem w C i właśnie zapomniałem nawiasu.

Awatar użytkownika
c4r0
Moderator
Posty: 2152
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 16 gru 2008, 19:50

Składniowo warunek napisany w pierwszym poście jest poprawny (chociaż niepotrzebnie podwójny nawias), a to czy się najpierw zaneguje PINC a potem nałoży maskę, czy najpierw się nałoży maskę a potem zaneguje wynik, to nie ma chyba tutaj znaczenia bo będzie działać tak samo.

aktus
Użytkownik
Posty: 379
Rejestracja: 06 sie 2007, 20:44
Lokalizacja: Tychy

Post autor: aktus » 16 gru 2008, 20:23

W pierwszym wypadku maskujesz zanegowany PINC, a w drugim przypadku negujesz zamaskowany PINC. Ot filozofia latania.

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 17 gru 2008, 19:42

aktus pisze:W pierwszym wypadku maskujesz zanegowany PINC, a w drugim przypadku negujesz zamaskowany PINC. Ot filozofia latania.
c4r0 pisze:Składniowo warunek napisany w pierwszym poście jest poprawny...
Pozwolę sobie wypowiedzieć się autorytarnie, że to nie prawda. Zapis:

Kod: Zaznacz cały

if((!PINC & 0x01)) 
Absolutnie nie jest prawidłowy. Operator "!" to negacja LOGICZNA, nie BITOWA. Zapis mógłby wyglądać następująco:

Kod: Zaznacz cały

if((~PINC & 0x01)) 
Różnica jest taka, że operator ~ gwarantuje zanegowanie wszystkich bitów. Operator ! gwarantuje, że wartość 0 zostanie zamieniona na coś innego niż 0 (zwykle 1, ale to nie jest fakt objęty standardem) a wartość inna niż 0 zamieniana jest na 0 (operowanie na wartościach true i false).
Najlepiej poprawić kod tak jak zaproponował Aro. Taki zapis "ułatwia" kompilatorowi optymalizację kodu.

Awatar użytkownika
c4r0
Moderator
Posty: 2152
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 18 gru 2008, 10:17

W takim razie przepraszam i dzięki za wyjaśnienie :oops:

aktus
Użytkownik
Posty: 379
Rejestracja: 06 sie 2007, 20:44
Lokalizacja: Tychy

Post autor: aktus » 18 gru 2008, 18:13

To i ja się podłącze ;)

ODPOWIEDZ