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

Pierwsze programy w C

Post autor: Laik » 09 sie 2008, 22:56

Zacząłem zabawę z programowaniem. Na razie w programie proteus ale zawsze coś. Mam pytanie co do języka C. Znam go w stopniu podstawowym lecz problem dochodzi jeśli chodzi o mikrokontrolery.
Potrzebuję informacji :
1. Dajmy na to iż mam diodę ustawioną do PD1 katodą i chcę ustawić PD1 jako wejście. Aby dioda się świeciła. Jak to napisać (wiem że jest kilka sposobów mógłby je ktoś pokazać?)
2. To samo co w pierwszym lecz do PD2 ustawione anodą i PD2 jako wyjście.
3. Jak ustawić cały port D jako wyjście lub wejście ??
4. Może ktoś mi napisać podstawowy program w którym wykorzystane będą te 2 diody w tych portach.
Tyle informacji wystarczy mi aby zacząć. Pozdrawiam i liczę na nie odsyłanie mnie do Google lub innych stron ponieważ nie za bardzo rozumiem.

Z tego co mniej więcej kojaże to zapis:

Kod: Zaznacz cały

DDRD  |= _BV(1);               
PORTD &= ~_BV(1); 
ustawi mi pin 1 portu D jako wyjście ? PORTD rozumiem te polecenie ale po co jest DDRD ?

Awatar użytkownika
Mateusz
-
Posty: 60
Rejestracja: 21 sty 2006, 16:31
Lokalizacja: Ełk
Kontakt:

Post autor: Mateusz » 10 sie 2008, 0:01

1. DDRD &= ~(1<<1); //ustawienie PD1 jako wejścia
PORTD &= ~(1<<1); //wpisanie zera
Dioda powinna świecić, tylko przeważnie zamiast ustawiania 0 na wejściu ustawia sie je na 1 tzw. wewnętrzne podciąganie(z ang. pull-up jak się nie myle, nóżka nie wisi wtedy w powietrzu i nie ściąga śmieci). Dlaczego akurat tak chcesz skonfigurować port? Masz podłączony jakiś przycisk i chcesz kontrolować czy jest przyciśniety?

2.DDRD |= 1<<1; //ustawienie PD1 jako wejścia
PORTD |= 1<<1; //wpisanie zera

3. W bardzo prosty sposób wpisać w cały rejestr DDRx jednynki lub zera np.:
DDRD = 0xFF; //cały port jako wyjścia
DDRD = 0x00; //cały port jako wejścia

4. Dawno w C już nie pisałem. Proponowałbym wykorzystać jakieś opóźnienia i wykonać migacza na dwóch ledach, albo jakiś przerzutnik RS jeden przycisk zapala diode, drugi gasi.

Tych zapisów co podałeś to ja osobiście jeszcze nie testowałem(specem od C nie jestem zaznaczam od razu), ale jak mówisz że już sie zajmowałeś i działało to pewnie jest ok:)

Co do portów masz trzy rejestry: DDRx, PORTx, PINx. Pierwszy z nich zawiera informacje które piny portu mają być wejściem, a które wyjściem. Wpisując jedynkę ustalasz jako wyjście, zero jako wejście. W rejestrze PORTx wpisujesz to co ma sie pojawić na końcówkach portu. Natomiast w ostatnim z wymienionych rejestrów sprawdzasz bieżace stany logiczne na porcie. Jeśli będziesz chciał wykorzystać jakiś przycisk lub odbierać dane z jakiegoś innego urządzenia to właśnie wykorzystasz do tego ten port. A dwie linijki programu, które napisałeś są bardzo proste w działaniu. Pierwsza ustala PD1 jako wyjście(w rejestrze DDRD), a druga ustala na tym wyprowadzeniu zero(rejestr PORTD).

ZbeeGin

Post autor: ZbeeGin » 10 sie 2008, 6:46

Laik pisze:ustawi mi pin 1 portu D jako wyjście ? PORTD rozumiem te polecenie ale po co jest DDRD ?
Przeczytaj notę katalogową AVR a wszystko stanie się jasne. Programowanie bez znajomości wnętrza procesora mija się z celem - zwłasza w AVRGCC.

Laik
Użytkownik
Posty: 242
Rejestracja: 21 maja 2007, 19:19
Lokalizacja: z nienacka

Post autor: Laik » 10 sie 2008, 11:09

Mam pierwszy problem. Otóż nie chce mi działać taki prosty progam. Wie ktoś ocb ?:

Kod: Zaznacz cały

#include <avr/io.h>

#define P_B DDRB &= ~(1<<1);
#define P_D DDRD |= 1<<1;

int main(void) {

P_B;
P_D;

	for(;;) {
		
	}

	return(0);
}
Schemat:
Załączniki
bez tytułu.JPG

Awatar użytkownika
Mateusz
-
Posty: 60
Rejestracja: 21 sty 2006, 16:31
Lokalizacja: Ełk
Kontakt:

Post autor: Mateusz » 10 sie 2008, 12:40

A co chcesz osiągnąć? Napisz bedzie łatwiej radzić. Jeśli ten schemat ma działać to nie zapomnij o kwarcu i dwóch kondensatorach do niego oraz rezystorach pod diody LED np. mogą być 330 Ohm.

Laik
Użytkownik
Posty: 242
Rejestracja: 21 maja 2007, 19:19
Lokalizacja: z nienacka

Post autor: Laik » 10 sie 2008, 13:51

Po co kwarc ?? to tem At90s2123 nie posiada wbudowanego ?? Program ma po prostu zapalić diody

ZbeeGin

Post autor: ZbeeGin » 10 sie 2008, 14:52

Po co kwarc ?? to tem At90s2123 nie posiada wbudowanego ?? Program ma po prostu zapalić diody
I nijak nie zapali tych diod. Pisałem - przeczytać notę katalogową i zrozumieć do czego służy DDRx i PORTx. Potem dopiero brać się za pisanie programu. W odwrotną stronę się nie da. Ale jak widać kolega jest mądrzejszy....

Awatar użytkownika
Mateusz
-
Posty: 60
Rejestracja: 21 sty 2006, 16:31
Lokalizacja: Ełk
Kontakt:

Post autor: Mateusz » 10 sie 2008, 15:59

Ten procek nie ma, posiada ten który został jego "następcą" (attiny2313) i to nie kwarc tylko wewnetrzy oscylator. Jeśli masz ten co jest na schemacie to stosuj lepiej tego co masz, bo ten drugi posiada fuse bits, które na samym początku mogą Ci nie potrzebnie stwarzać dodatkowe problemy. Jestem zdecydowanie za kolega ZbeeGin. Nota katalogowa to podstawa, nie musisz całej od razu przejrzeć, zacznij od samych podstaw, a potem stopniowo jak będziesz chciał wykorzystywać kolejne cześci procesora to będziesz bardziej sie wgłebiał i najważniejsze się nie zrażaj. Przeżyj note, jak nie będziesz czegoś rozumiał to pisz, może coś uda sie poradzić:) Z więdzą na temat procka, będzie o wiele łatwiej.

Laik
Użytkownik
Posty: 242
Rejestracja: 21 maja 2007, 19:19
Lokalizacja: z nienacka

Post autor: Laik » 11 sie 2008, 14:39

Moglibyście podać mi link do polskiej noty ?? Ewentualnie angielskiej jak polskiej nie ma.

Awatar użytkownika
grysek67
Użytkownik
Posty: 315
Rejestracja: 27 cze 2007, 6:34
Lokalizacja: Limanowa
Kontakt:

Post autor: grysek67 » 11 sie 2008, 14:50

http://www.atmel.com/dyn/resources/prod ... oc0839.pdf - AT90S2313 (jesli chodzi o rejestry to polecam strone 84)
http://www.atmel.com/dyn/resources/prod ... oc2543.PDF - ATTINY2313

Polskiej raczej nie znajdziesz, chociaz kiedys w necie znalazłem chyba do mega8

spark
Użytkownik
Posty: 406
Rejestracja: 25 lis 2004, 15:50
Lokalizacja: Wrocław

Post autor: spark » 12 sie 2008, 15:27

Laik pisze:Mam pierwszy problem. Otóż nie chce mi działać taki prosty progam. Wie ktoś ocb ?
Nie chce działać program w sensie "nie chce się skompilować" czy "źle działa po skompilowaniu"?

Ale błąd jest widoczny na pierwszy rzut oka.
w twoim programie użycie #define powoduje wyszukanie w kodzie odpowiedniego łańcucha znaków i zastąpienie go podaną mu przez Ciebie funkcją ustawienia kierunków działania portów

po podstawieniu "ręcznie" pod wskazane łańcuchy znaków wychodzi nam taki kwiatek:

Kod: Zaznacz cały

#include <avr/io.h>

int main(void) {

DDRB &= ~(1<<1);;
DDRD |= 1<<1;;

	for(;;) {
		
	}

	return(0);
}
czy już widzisz gdzie jest błąd?

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

Post autor: snow » 12 sie 2008, 16:14

Poza tym proponuję się przerzucić na ATtiny2313 bo z at90 mogą być problemy z dostaniem albo jak już to drogi będzie.

To jeżeli nie umieścisz obsługi diód w pętli głównej to nawet nie zauważysz ich działania, pomijając fakt że kod sam w sobie nie obsłuży tych diód ;)

Laik
Użytkownik
Posty: 242
Rejestracja: 21 maja 2007, 19:19
Lokalizacja: z nienacka

Post autor: Laik » 12 sie 2008, 19:05

Jako błąd to widzę po dwa średniki. Chodzi o to ?
snow Jak będe programował na prawdę to tak zrobię a teraz tylko taki mam w proteusie issis do symulacji

ZbeeGin

Post autor: ZbeeGin » 12 sie 2008, 19:19

Pytanie pomocnicze: "Do czego służą rejestry DDR"? Szybka i wyczerpująca odpowiedź please...

Laik
Użytkownik
Posty: 242
Rejestracja: 21 maja 2007, 19:19
Lokalizacja: z nienacka

Post autor: Laik » 12 sie 2008, 19:23

ustala bity jako wyjścia wejścia?

ODPOWIEDZ