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ę

program w c na 8051 problem

harley75
-
-
Posty: 6
Rejestracja: 26 wrz 2006, o 08:14
Lokalizacja: Warszawa

program w c na 8051 problem

Postautor: harley75 » 27 wrz 2006, o 07:55

Napisalem programik i jako poczatkujacy programista mecze sie juz 2 dni

#include "8051.h"

int i,t;
int word, a;

void main (void){

P1=0xF7;
for(t=0;t<100;t++);
a=P1;
word=!a;
word >>= 4;

for(i=0;i<word;i++){
for(t=0;t<20000;t++);
P3_0=!P3_0;
}

}

Program ma za zadanie mignac tyle razy dioda podlaczona do P3_0 ile jest to ustawione na nastawniku kodu BCD podlaczonym do portu P1.
Wszystko jest ok dopuki nie ma negacji word=!a. Jezeli jest word=a wszystko dziala ale nie do konca poprawnie (zla ilosc migniec). Przy negacji nie dziala w ogole.
Prosze o pomoc i wskazanie bledow. 0xF7 jest adresem konkretnego nastawnika

Guru
-
-
Posty: 250
Rejestracja: 30 cze 2003, o 13:26
Lokalizacja: Kraków

Postautor: Guru » 27 wrz 2006, o 09:14

Instrukcja

Kod: Zaznacz cały

word = !a;
wykonuje negację logiczną, czyli najczęściej jest negowany tylko najmłodszy bit.
Aby było poprawnie należy wykonać negację bitową czyli:

Kod: Zaznacz cały

word = ~a;

harley75
-
-
Posty: 6
Rejestracja: 26 wrz 2006, o 08:14
Lokalizacja: Warszawa

Postautor: harley75 » 27 wrz 2006, o 09:20

probowalem ale to tez nie pomaga

Guru
-
-
Posty: 250
Rejestracja: 30 cze 2003, o 13:26
Lokalizacja: Kraków

Postautor: Guru » 27 wrz 2006, o 10:07

Ja zastosowałbym w tym przypadku inne typy danych zamiast int może trzeba zastosować unsigned char dla zmiennych i, word, a;
A tak na przyszłość, nie stosuj pojemniejszych typów danych niż jest to potrzebne.
Jest to duże marnotrawstwo pamięci.

krzysiek1
-
-
Posty: 11
Rejestracja: 8 gru 2005, o 12:00
Lokalizacja: Warszawa

Re: program w c na 8051 problem

Postautor: krzysiek1 » 27 wrz 2006, o 10:45

Na poczatek sprawdz takie cos

Kod: Zaznacz cały

void main (void){ word=5; for(i=0;i<word;i++){ for(t=0;t<20000;t++); P3_0=!P3_0; } while(1); //tutaj dodatkowa petla, tak tylko zeby procesor sie tu zatrzymal }
Tym sprawdzisz dzialanie, czy ilosc migniec sie zgadza. Do "word" wstaw sobie jeszcze jakies inne wartosc - dla testu.

Kod: Zaznacz cały

word >>= 4;
Co to ma robic? Jesli chcesz zamienic tetrady mlodsza ze starsza(4starsze bity na 4mlodsze), to przy word >>= 4; niektore kompilatory zamieniaja tak jak trzeba, a niektore przesuwaja. Efekt jest taki, ze na 4mlodszych bitach otrzymasz 4starsze, ale 4starsze zostana wyzerowane. W takim przypadku puszukaj funkji swap();

tomek_j
-
-
Posty: 264
Rejestracja: 14 sty 2004, o 09:06

Re: program w c na 8051 problem

Postautor: tomek_j » 27 wrz 2006, o 11:06

.........
Co to ma robic? Jesli chcesz zamienic tetrady mlodsza ze starsza(4starsze bity na 4mlodsze), to przy word >>= 4; niektore kompilatory zamieniaja tak jak trzeba, a niektore przesuwaja.Efekt jest taki, ze na 4mlodszych bitach otrzymasz 4starsze, ale 4starsze zostana wyzerowane......
prawidłowo działający kompilator po wykonaniu word >>= 4;przesunie zwartość word o 4 bity w prawo, a 4 najstarsze bity wyzeruje i już - o żadnym zamienianiu typu swap nie ma tu mowy. Poza tym word jest zdeklarowane jako int i w wiekszosci kompilatorów jest to słowo 16 bitowe i przesuwanie w prawo bedzie robione na takim słowie.
Dokonujesz konwersji typów podstawiajac (int)a=(char)P1. Tu chyba to nic nie zmienia pod warunkiem że po deklaracji kompilator wpsze automatycznie do word=0. Z typem int wiaze sie tez wynik negacji = po zanegowaniu 0x00 otrzymasz 0xff dla typu char, ale pozanegowaniu 0x0000 otrzymasz 0xffff - popatrz jak beda wygladaly twoje liczniki - radze rowniez zmienic deklaracje na char lub unsigned char

W jakim srodowisku to piszesz? Moze skorzystaj z emulatora programowego - wiele sie wtedy wyjasni :|

harley75
-
-
Posty: 6
Rejestracja: 26 wrz 2006, o 08:14
Lokalizacja: Warszawa

Postautor: harley75 » 27 wrz 2006, o 11:28

pisze pod sdcc
rzeczywisice postaram sie powalczyc z typami zmiennych

[ Dodano: 27-09-2006, 11:36 ]
mlodszy polbajt jest adresem dla nastawnikow BCD
starszy polbajt jest odczytywana liczba
odczyt z nastawnikow wymuszany jest zerem i stad potrzeba negacji
przesuniecie bitow o 4 wiadomo po co

Wróć do „8051”

Kto jest online

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