Skocz do zawartości

Pomiar analogowy na błędnym pinie.


MarCixn

Pomocna odpowiedź

Witam mam taki dość nietypowy problem. Chodzi o to że arduino uno(oryginał) sczytuje pomiar z błędnego pinu, np. kiedy w prostym programie szczytującym wartość potencjometru ustawię pin A5-A0 lub wpiszę inne nazwy PCINT8-13, ADC0-5, 14-19 to zawsze pomiar będzie sczytywany z pinu A4 nawet kiedy w programie jest A2. Co gorsza nie jest to kwestia wadliwego mikrokontrolera 328P bo na jednym tak i na drugim tak się dzieje. A oprócz tego płytka działa bez żadnych wad i teraz pytanie czy da się to jakoś naprawić czy trzeba wymienić całą płytkę. I czego mogły być to przyczyny

Edytowano przez MarCixn
Link do komentarza
Share on other sites

const char POT = "A2"; //POTENTIOMETER
void setup() {
  Serial.begin(9600);
  pinMode(POT, INPUT);

}

void loop() {
  Serial.println(analogRead(POT));
  

}

 

Link do komentarza
Share on other sites

raczej od programu nie zależy wcześniej działało. Na attiny85 też działa nawet bardziej skomplikowany program. to tylko przykład którego użyłem by  sprawdzić czy coś jest nie tak bo wcześniej na tym arduino normalnie chodził program do maszyny spawalniczej potencjometr działał a jak dopisywałem program w którymś momencie przestało i z tego co pamiętam to to samo stało się wcześniej tylko wtedy działał tylko A2 a teraz coś się znów zmieniło i tylko na pinie A4 da się odczytać w sumie to zależy mi tylko by jeden pin działał stale najlepiej właśnie A3-A0 bo mam do tego podpięty wyświetlacz na i2c 

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

To się kompiluje bez błędów? Ja może nie nadążam za arduiniowymi wynalazkami, ale że poszło to w tę stronę że pin da się opisać const charem? nieźle

 

  • Lubię! 1
Link do komentarza
Share on other sites

Właśnie dlatego zadałem to pytanie, chciałem aby autor przesłał faktyczny kod który mu nie działa a nie przykład napisany na kolanie

Link do komentarza
Share on other sites

(edytowany)

to faktyczny kod który nie działa to skrócona wersja tego co było w programie maszyny która działała ale w pewnym momencie przestało po tym jak o zgrozo polutowałem wszystkie kabelki. a ten kod został wykorzystany do sprawdzenia czy na pewno nie działa i w jakich warunkach na jakim pinie.

Edytowano przez MarCixn
Link do komentarza
Share on other sites

10 godzin temu, jand napisał:

W powyższym programie z łańcucha "A2" kompilator brał tylko pierwszą literę (czyli "A"), bo tylko tyle potrzebował by przerobić ją na zmienną uint8_t

a dziękuję po sprawdzeniu wszystko działa. Czyli wychodzi na to że jak był const char jako pin to losowo brał piny. Więc za pierwszym razem jak to pisałem fartownie musiałem odgadnąć który pin "wybrał". 

Link do komentarza
Share on other sites

Raczej zmienił się adres zmiennej czyli wartość wskaźnika. Znak (char) 'A' ma zawsze wartość 65 w ASCII. Natomiast adres stringu "A2" mógł ulec zmianie. Dziwi mnie że nie było ostrzeżeń podczas kompilacji takiego kodu, no ale ardiuinio rządzi się pewnie własnymi prawami  

  • Lubię! 2
Link do komentarza
Share on other sites

6 minut temu, _LM_ napisał:

Dziwi mnie że nie było ostrzeżeń podczas kompilacji takiego kodu

Mnie też.

Gdyby to chodziło o pojedynczy znak to jeszcze rozumiem - w końcu char czy uint8_t to jeden bajt. Ale tablica znaków .... ??? 

  • Lubię! 1
Link do komentarza
Share on other sites

9 minut temu, jand napisał:

Ale tablica znaków .... ??? 

Właściwie wskaźnik na tablicę który w AVR ma dwa bajty, a więc nie miało znaczenia czy string był długości dwóch znaków czy dwudziestu, jego (stringu) adres mieści się w wartości od 0x00 do 0xfffff ( w uproszczeniu, gdyż są mikrokontrolery AVR gdzie potrzebny jest szerszy zakres przestrzeni adresowej np: AtMega128). Przypadkiem stało się tak że starsza część tego dwubajtowego adresu miała wartość 0x02 [0b0010] co pozwoliło na odczyt ADC.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.