Skocz do zawartości

[C] funkcja if i przyrównanie [AVR]


nobile

Pomocna odpowiedź

To mój pierwszy post tak więc witam 🙂

Dopiero zaczynam przygodę z AVR i programowaniem [C/C++]

i potrzebuje pomocy..

w programie dostaje wskaźnik zmierzonej wartości na przetworniku ADC i chce aby pętla została wykonana jeśli wartość wskaźnika będzie mniejsza od np 100

niestety pętla jest wykonywana cały czas bez względu czy jest mniejsze czy większe.

Co robię źle?

   while (1) 											//pętla główna programu
  {
     _delay_ms(30);									//pomiar co 30ms
     itoa(osX(), buforX, 10);							//konwersja z BIN -> DEC dla osX
     LCD_Clear();										//wyczyść wyświetlacz
  LCD_WriteText("Pomiar:");							//zapisz na wyświetlaczu "Pomiar:"
     LCD_WriteText(buforX);							//zapisz na wyświetlaczu wartość zmiennej "buforX"
  itoa(osY(), buforY, 10);							//konwersja z BIN -> DEC dla osY
  LCD_WriteText("x");								//zapisz na wyświetlaczu "x"
     LCD_WriteText(buforY);							//zapisz na wyświetlaczu wartość zmiennej "buforX"


  if((*buforX < 100) && (*buforY < 100))
  {
	LCD_WriteText("S");

  }
Link do komentarza
Share on other sites

odczytałem bezpośrednio z funkcji odczytującej z ADC

masz racje ze itoa nie zamienia na DEC tylko chyba na znak

ale ma inne pytanie: musiałem napisać w ten sposób warunek:

if( (100 <= osX()) && (100 <= osY()) && (200 > osX()) && (200 >osY()) )	//przycisk 2
  {
	LCD_WriteText("*");

  }

nie moze byc w ten sposób?:


if( (100 <= osX() <200) && (100 <= osY() < 200) {}

Normalnie bym gdzieś o tym doczytał (bo dopiero uczę sie programowania, ale do poniedziałku muszę wykonać projekt a to do niego mi jest potrzebne, dlatego będę bardzo wdzięczny za pomoc)

PS. Kod całego programu (nie dokończony) At16

#include <avr/io.h>
#include <util/delay.h>
#include "HD44780.h"
#include "HD44780.c"
#include "itoa.h"

void Inicjalizacja(void)
{
ADMUX |= (1 << REFS1) | (1 << REFS0);					// źródło napięcia referencyjnego str 211 pdf
  ADMUX |= (0 << ADLAR);								// zmiana kolejności ADCL, ADCH str 211 pdf
  ADMUX |= (0 << MUX2) | (0 << MUX1) | (0 << MUX0);	//wybranie wejścia str 212 pdf
  ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  ADCSRA |= (1 << ADEN);								// włączenie ADC
  //ADCSRA &= ~(1 << ADEN);							// wyłączenie ADC

}

uint16_t osX() 											//funkcja pobierająca pomiar [wej. PA0]
{
  ADCSRA |= (1 << ADSC);								//rozpoczęcie konwersji OSX
  while (ADCSRA & (1 << ADSC)) 						//oczekiwanie na zakońćżenie konwersji
  ADMUX |= (1 << MUX0);								//przełączenie wejścia na PA1
  return ADCW;											//funkcja zwraca wartosc zapisana w rejestrach (ADCW pozwala na odczyt w odpowiedniej kolejności)

}

uint16_t osY() 											//funkcja pobierająca pomiar [wej. PA1]
{
  ADCSRA |= (1 << ADSC);								//rozpoczęcie konwersji OSY
  while (ADCSRA & (1 << ADSC))						//oczekiwanie na zakońćżenie konwersji
ADMUX &= ~(1 << MUX0);								//przełączenie wejścia na PA0
  return ADCW;											//funkcja zwraca wartosc zapisana w rejestrach (ADCW pozwala na odczyt w odpowiedniej kolejności)

}

int main() 
{
  LCD_Initalize();										//inicjalizacja wyświetlacza
  LCD_Clear();											//wyczyść wyświetlacz
  Inicjalizacja();										//wykonaj funkcje "Inicjalizacja"
  char buforX[16];										//definicja zmiennej "buforX"
  char buforY[16];										//definicja zmiennej "buforY"


  while (1) 											//pętla główna programu
  {
     _delay_ms(30);									//pomiar co 30ms
     itoa(osX(), buforX, 10);							//konwersja z BIN -> ZNAK_LCD dla osX
     LCD_Clear();										//wyczyść wyświetlacz
  LCD_WriteText("Pomiar:");							//zapisz na wyświetlaczu "Pomiar:"
     LCD_WriteText(buforX);							//zapisz na wyświetlaczu wartość zmiennej "buforX"
  itoa(osY(), buforY, 10);							//konwersja z BIN -> ZNAK_LCD dla osY
  LCD_WriteText("x");								//zapisz na wyświetlaczu "x"
     LCD_WriteText(buforY);							//zapisz na wyświetlaczu wartość zmiennej "buforX"


  if((osX() < 100) && (osY() < 100))											//przycisk 1
  {
	LCD_WriteText("#");

  }

  if( (100 <= osX()) && (100 <= osY()) && (200 > osX()) && (200 >osY()) )	//przycisk 2
  {
	LCD_WriteText("*");

  }



  }
  return 0;											//funkcja nie zwraca żadnej wartości
} 
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Twój kod

if( (100 <= osX() <200) && (100 <= osY() < 200) {} 

będzie interpretowany tak:

((100 <= osX()) < 200)

z pierwszego nawiasu zawsze masz 0 albo 1, a to jest zawsze mniejsze od 200, czyli warunek zawsze będzie spełniony

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.