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

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
Moderatorzy:Jacek Bogusz, procesorowiec, robertw, tomasz_jablonski, r-mik, Moderatorzy
Instrukcja 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;
Aby było poprawnie należy wykonać negację bitową czyli:
Kod: Zaznacz cały
word = ~a;
Re: program w c na 8051 problem
Na poczatek sprawdz takie cos
Tym sprawdzisz dzialanie, czy ilosc migniec sie zgadza. Do "word" wstaw sobie jeszcze jakies inne wartosc - dla testu.
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();
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
}
Kod: Zaznacz cały
word >>= 4;
Re: program w c na 8051 problem
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..........
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......
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

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