Przesunięty przez: daniel93 25 Cze 08 01:29 |
Problem z programem |
| Autor |
Wiadomość |
Turboasm

Posty: 16 Skąd: Kleczew
|
Wysłany: 05 Lip 07 06:30 Problem z programem
|
|
|
Mam taki problem a mianowicie poniższy kod kompiluje się ale nie działa jak trzeba.
| Kod: | #include <avr/io.h>
#define F_CPU 1000000
#define CYCLES_PER_US ((F_CPU+500000)/1000000)
#define klawiszD DDRD
#define klawiszP PORTD
#define pin PD2
#define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1)
void delay(unsigned int us)
{
unsigned int delay_loops;
register unsigned int i;
delay_loops = (us+3)/5*CYCLES_PER_US;
for (i=0; i < delay_loops; i++) {};
}
unsigned char klawiatura(void)
{
unsigned char zwrot=0;
sbi(klawiszD,pin);
sbi(klawiszP,pin);
delay(5);
cbi(klawiszD,pin);
if(bit_is_clear(klawiszD,pin))
{
zwrot=zwrot+1;
}
return zwrot;
}
void zaswiec(void)
{
if(klawiatura()==1)
{
LED_ON;
}
}
int main (void)
{
for (;;)
{
zaswiec();
}
return (0);
} |
|
|
|
|
|
 |
abxyz
Expert programowanie

Pomógł: 18 razy Posty: 166 Otrzymał 28 piw(a) Skąd: zza winkla
|
Wysłany: 05 Lip 07 09:49
|
|
|
Rozumiem, że program w ogóle działa, ale nie takiego zachowania oczekiwałeś;
napisz precyzyjnie ( bardzo precyzyjnie !), co twój program powinien robić. |
|
|
|
|
 |
Turboasm

Posty: 16 Skąd: Kleczew
|
Wysłany: 06 Lip 07 09:53
|
|
|
| Program miał zaświecić diodą podłączoną do PB1 po naciśnięciu przycisku podłączonego do PD2. Program działa ale dioda świeci cały czas i nie reaguje na przycisk. |
|
|
|
|
 |
abxyz
Expert programowanie

Pomógł: 18 razy Posty: 166 Otrzymał 28 piw(a) Skąd: zza winkla
|
Wysłany: 06 Lip 07 10:53
|
|
|
Jeśli funkcja 'klawiatura' ma po prostu odczytać stan wyprowadzenia PD2 uC, to bym ją przerobił tak :
| Kod: |
/* Stan linii PD2 należy odczytać z rejestru PIND, nie z DDRD */
#define klawiszI PIND
unsigned char klawiatura(void)
{
unsigned char zwrot=0;
/* Linia PD2 pracuje jako wejście "podciągnięte do jedynki" */
cbi(klawiszD,pin);
sbi(klawiszP,pin);
/* Odczyt stanu linii PD2 */
if(bit_is_clear(klawiszI ,pin))
{
zwrot=zwrot+1;
}
return zwrot;
} |
|
|
|
|
|
 |
Turboasm

Posty: 16 Skąd: Kleczew
|
Wysłany: 06 Lip 07 01:41
|
|
|
| Uczę się C na przykładach i innych znalezionych programach. Działa dzięki. Jak wygląda zapis : cbi(klawiszD,pin); sbi(klawiszP,pin); w WinAVR 2007 bo narazie używam 2005 |
|
|
|
|
 |
abxyz
Expert programowanie

Pomógł: 18 razy Posty: 166 Otrzymał 28 piw(a) Skąd: zza winkla
|
Wysłany: 06 Lip 07 07:26
|
|
|
Mała ściąga
zmienna |= _BV(numer_bitu); ustawienie bitu
zmienna &= ~_BV(numer_bitu); zgaszenie bitu
zmienna ^= _BV(numer_bitu); przełączenie bitu
No i przerobiony programik :
| Kod: | #include <avr/io.h>
#define F_CPU 1000000
#define klawiszD DDRD
#define klawiszP PORTD
#define klawiszI PIND
#define pin PD2
/* #define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1) */
#define LED_ON DDRB|=_BV(PB1);PORTB|=_BV(PB1);
unsigned char klawiatura(void)
{
unsigned char zwrot=0;
/* Linia PD2 pracuje jako wejście "podciągnięte do jedynki" */
/* cbi(klawiszD,pin); */
klawiszD &= ~_BV(pin);
/* sbi(klawiszP,pin);*/
klawiszP |= _BV(pin);
/* Odczyt stanu linii PD2 */
if(bit_is_clear(klawiszI ,pin))
{
zwrot=zwrot+1;
}
return zwrot;
}
/* Dalej bez zmian */
|
Używam avr-gcc v4.0.2, więc WinAVR 2007 też powinien powyższy programik “łyknąć”. |
|
|
|
|
 |
Turboasm

Posty: 16 Skąd: Kleczew
|
Wysłany: 06 Lip 07 09:07
|
|
|
| a pętla if(bit_is_clear(klawiszI ,pin)) odczytuje czy na PD2 jest stan niski ? Jak będzie dla stanu wysokiego ?? Czy jeżeli PD2 jest ustawiony jako wejście to czy po podaniu - na ten port będzie on w stanie niskim czy wysokim, podaje się na mikroprocesor tylko - czy także + ?? |
|
|
|
|
 |
abxyz
Expert programowanie

Pomógł: 18 razy Posty: 166 Otrzymał 28 piw(a) Skąd: zza winkla
|
Wysłany: 07 Lip 07 10:47
|
|
|
| Kod: | /* Czy na PD2 jest stan wysoki */
if( bit_is_set(klawiszI,pin) )
/* lub tak */
if( klawiszI & _BV(pin) ) |
Dalszej części pytania nie rozumiem, może użyjesz konkretnego przykładu |
|
|
|
|
 |
Turboasm

Posty: 16 Skąd: Kleczew
|
Wysłany: 07 Lip 07 10:14
|
|
|
chodzi o to czy na mikroprocesor mogę na np. PC4 podać + czy nie ??
Jak zrobić aby dana instrukcja była wykonywana przez jakiś czas np. sbi(DDRB,PB1) przez 10s ????
Co zrobić aby w/w programie dioda świeciła tylko gdy przycisk będzie trzymany, jak puszcze to gaśnie ??
Gdzie mogę znaleźć programy dla uC w C wraz z opisami ?? |
|
| Ostatnio zmieniony przez Turboasm 08 Lip 07 09:54, w całości zmieniany 1 raz |
|
|
|
 |
Decado


Pomógł: 6 razy Posty: 160 Otrzymał 6 piw(a) Skąd: Bełk
|
Wysłany: 07 Lip 07 10:26
|
|
|
Wbiję się do dyskusji.
Kolego Turboasm proponuję zakupienie TEGO oraz jakiejś książki z BTC z programowaniem w C(zależnie od tego co chcesz programować). Sam niedawno zaczołem zabawę z programowaniem w C właśnie na tym zestawie.
Pozdrawiam Decado
Sory za OT |
|
_________________ "Niema ludzi niewinnych, są tylko źle przesłuchiwani" Feliks "Krwawy Feliks" Dzierżyński |
|
|
|
 |
Turboasm

Posty: 16 Skąd: Kleczew
|
Wysłany: 07 Lip 07 10:45
|
|
|
Hmm a jaką książkę polecasz ?? Bo ja dla mnie to najlepsza pytania i odpowiedzi no i jeszcze przykłady.
PS. Byłbym bardzo wdzięczny za odp. na powyższe pytania. |
|
|
|
|
 |
Decado


Pomógł: 6 razy Posty: 160 Otrzymał 6 piw(a) Skąd: Bełk
|
Wysłany: 07 Lip 07 10:54
|
|
|
TĄ, mam ten zestaw, tą książkę. Polecam
Pozdrawiam Decado |
|
_________________ "Niema ludzi niewinnych, są tylko źle przesłuchiwani" Feliks "Krwawy Feliks" Dzierżyński |
|
|
|
 |
treker
www.dioda.com.pl


Pomógł: 13 razy Posty: 528 Otrzymał 30 piw(a) Skąd: Gdynia
|
Wysłany: 08 Lip 07 07:52
|
|
|
Ja czekam, aż w formie książki ukaże się kurs C prowadzony w EDW
Pozdrawiam |
|
|
|
|
 |
daniel93


Pomógł: 11 razy Posty: 390 Otrzymał 19 piw(a) Skąd: Wujskie
|
Wysłany: 08 Lip 07 12:41
|
|
|
| We wrześniu jest ostatni odcinek kursu C w edw... |
|
|
|
|
 |
abxyz
Expert programowanie

Pomógł: 18 razy Posty: 166 Otrzymał 28 piw(a) Skąd: zza winkla
|
Wysłany: 08 Lip 07 04:39
|
|
|
| Turboasm napisał/a: | | chodzi o to czy na mikroprocesor mogę na np. PC4 podać + czy nie ?? |
Oczywiście,że można na porty we/wy AVRa podawać napięcie odpowiadające niskiemu lub wysokiemu stanowi sygnału cyfrowego, ale tylko, gdy dana linia portu pracuje jako wejście, w przeciwnym razie można uszkodzić port.
Żeby skonfigurować którąś linię portu jako wejście, należy wyzerować odpowiadający tej linii bit w rejestrze DDRx (gdzie x to A,B,C,D); gdy bit jest ustawiony (ma wartość 1), linia portu pracuje jako wyjście. Po starcie uC AVR wszystkie linie portów we/we są skonfigurowane jako wejścia.
Następnie można sprawdzić stan na wyprowadzeniu uC badając wartość odpowiedniego bitu w rejestrze PINx.
Przykład:
| Kod: | /* Zeruje bit nr. 4 rejestru DDRC- linia PC4 ma pracować jako wejście*/
DDRC &= ~ _BV(PC4);
/* Odczyt wartość bitu nr.4 w rejestrze PINC */
/* Czy na PC4 jest stan wysoki? /
if( bit_is_set(PINC,PC4) )
/* Czy na PC4 jest stan niski? /
if( bis_is_clear(sfr,bit) ) |
Dodatkowo, jeśli port pracuje jako wejście i odpowiedni bit w rejestrze PORTx ustawi się na wartość 1, to linia ta będzie wewnętrznie "podciągnięta" przez rezystor do zasilania (ang. with internal pull-up resistors).
Tak jest w twoim programiku; do PD2 przyłączony został przycisk zwierający wyprowadzenie do masy. Gdy przycisk jest zwolniony, to na wejściu jest stan wysoki mimo, że przycisk nie podaje napięcia odpowiadającego wysokiemu stanowi sygnału; natomiast po wciśnięciu przycisku, wyprowadzenie PD2 zostaje zwarte do masy i na wejściu odczytuje się 0.
| Kod: | DDRD &= ~ _BV(PD2); /* Zeruje bit nr 2 rejestru DDRD, linia PD2 będzie wejściem */
PORTD |= _BV(PD2); /* Ustawia bit nr.2 rejestru PORTD, wyprowadzenie PD2 będzie wewnętrznie podciągnięte przez rezystor do zasilania */ |
| Turboasm napisał/a: | | Jak zrobić aby dana instrukcja była wykonywana przez jakiś czas np. sbi(DDRB,PB1) przez 10s ?? |
Jeśli, na przykład, chcesz, żeby dioda przyłączona do PB1 zapaliła się i świeciła przez 10s, po czym na powrót zgasła, można to zrobić tak: zapalasz diodę, czekasz 10 sek., gasisz diodę - czy o to Ci chodziło ? Jeśli tak, to program poniżej dokładnie to robi.
| Kod: |
#define F_CPU 1000000L /* Częstotliwość kwarcu */
#include <avr/io.h>
#include <util/delay.h> /* Żeby można było korzystać z funkcji '_delay_ms' */
int main(void)
{
int i; /* zmienna przyda się w pętli 'for' */
/* Ustawia bin nr. 1 rejestru DDRB, linia PB1 będzie wyjściem */
DDRB |= _BV(PB1);
/* Ustawia bit nr.1 rejestru PORTB, na wyprowadzeniu PB1 pojawi się stan wysoki */
PORTB |= _BV(PB1);
/* Wykonanie tego fragmentu zajmie uC 10s */
for (i = 0; i < 10*100; i++)
_delay_ms(10); /* Każdym razem wykonanie funkcji "_delay_ms" zajmie uC 10ms */
/* Kasuje bit nr.1 rejestru PORTB, na wyprowadzeniu PB1 pojawi się stan niski */
PORTB &= ~_BV(PB1);
while(1){}; /* Nieskończona pętla "uwięzi" program w tym miejscu */
return 0;
}
|
| Turboasm napisał/a: | | Co zrobić aby w/w programie dioda świeciła tylko gdy przycisk będzie trzymany, jak puszcze to gaśnie ?? |
Przerób funkcję 'zaswiec()' w ten sposób:
| Kod: |
#define LED_OFF DDRB|=_BV(PB1);PORTB&=~_BV(PB1);
void zaswiec(void)
{
if(klawiatura()==1)
{
LED_ON;
}
else
{
LED_OFF;
}
} |
| Turboasm napisał/a: | | Gdzie mogę znaleźć programy dla uC w C wraz z opisami ?? |
|
|
|
|
|
 |
tomaha1


Pomógł: 2 razy Posty: 18 Skąd: Toruń
|
Wysłany: 31 Sie 07 03:53
|
|
|
| treker napisał/a: | Ja czekam, aż w formie książki ukaże się kurs C prowadzony w EDW
Pozdrawiam |
W najnowszym numerze EdW jest potwierdzenie (w listach do redakcji), że niedługo (możliwe że przed zimą) zakończą się prace nad książką dotyczącą kursu C. Będzie to nie tylko kopia tego kursu z magazynu, ale też dodatkowe rzeczy. |
|
|
|
|
 |
|
|