Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

cbi(PORTB,i);

Awatar użytkownika
almatea
-
-
Posty: 240
Rejestracja: 12 gru 2003, o 17:02
Lokalizacja: Brzeszcze
Kontaktowanie:

cbi(PORTB,i);

Postautor: almatea » 2 lut 2008, o 16:09

Wertuję książkę Pana Jarosława Dolińskiego - "Mikrokontrolery AVR w praktyce" poświęconej programowaniu mikrokontrolerów w C.

1. W pierwszym listingu użyto komend cbi(PORTB,i); i sbi(PORTB,i); których nie przyjmuje WinAVR GCC. Używam najnowszej wersji WinAvR oraz z 2005 roku. W obu przypadkach ten sam błąd. Jak temu zaradzić.

2. Co to są pliki <io.h>?
Równolegle śledzę kurs C z Edw z 2005/2006 roku.

We wspomnianej książce spotykam następujący kod:
#include <io.h>
natomiast w kursie z EdW
#include <avr\io.h>

Czy obydwie składnie są poprawne i dotyczą tych samych plików?

Awatar użytkownika
piotr_go
-
-
Posty: 159
Rejestracja: 27 sie 2004, o 12:18
Lokalizacja: far far away

Postautor: piotr_go » 2 lut 2008, o 16:37

w nowszych gcc to wycieli, teraz robi sie to mniej więcej tak:

#include <avr/io.h>
...
#define PWR_BIT _BV(0) // bit 0 portu
...
PORTB |= PWR_BIT; // sbi
PORTB &= ~(PWR_BIT); // cbi

Jurek Szczesiul
-
-
Posty: 175
Rejestracja: 10 paź 2003, o 20:44
Lokalizacja: Białystok
Kontaktowanie:

Postautor: Jurek Szczesiul » 2 lut 2008, o 16:56

w nowszych gcc to wycieli, teraz robi sie to mniej więcej tak:

#include <avr/io.h>
...
#define PWR_BIT _BV(0) // bit 0 portu
...
PORTB |= PWR_BIT; // sbi
PORTB &= ~(PWR_BIT); // cbi
Można też
#include <avr/compat/deprecated.h>

tam to już jest zrobione

Pozdrowienia Jurek S.

awatar100
-
-
Posty: 415
Rejestracja: 27 cze 2003, o 07:55
Lokalizacja: Gdańsk
Kontaktowanie:

Postautor: awatar100 » 4 lut 2008, o 06:23

zeby korzystac z tych makr dodaj wpierw:

#include <avr\sfr_defs.h>
cytat

Kod: Zaznacz cały

Avr-gcc nie posiada składni bezpośredniego dostępu do bitów zmienna.numer_bitu. Operacje na bitach wykonujemy używając iloczynu i sumy bitowej, np. dla bajtu: zmienna |= _BV(numer_bitu); // ustawienie bitu zmienna &= ~_BV(numer_bitu); //zgaszenie bitu zmienna ^= _BV(numer_bitu); // przełączenie bitu ( _BV() - bit value to proste pomocnicze makro równoznaczne z jedynką przesuniętą w lewo o numer_bitu ). PORTC & 0x01; // Testuj bit 0 portu C.

i wybij sobie ze ..glowy
:623: :623: :623: :623: :623: :623: :623: :623: :623: :623: :623: :623: :623:

Kod: Zaznacz cały

A na zapis podobny do funkcji jest śliczna funkcja 'inline', w pełni sprawdzana przez kompilator, będąca jakąś tam sensowną całością. zamiast #define LED_OFF PORTB=!_BV(PB4) poprawnie jest inline void LED_OFF(void) { PORTB=!_BV(PB4) ; }

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 18 gości