Skocz do zawartości

Atmega328p problem z odczytywaniem pinu


ttmdear

Pomocna odpowiedź

Cześć, 

Zmontowałem układ Atmega328p na płytce prototypowej i wgrałem prosty program który odczytuje wejście na pinie 3, 4 i się zdziwiłem ponieważ  program nie działał tak jak oczekiwałem. Pewnie popełniam głupi błąd o którym mi powiedzie 🙂 

Program wygląda tak:

#define PIN_CLOSE 2
#define PIN_OPEN 4
#define PIN_STOP 5
#define PIN_LIMIT_OPEN 6
#define PIN_LIMIT_CLOSE 7
 
void setup() {
    Serial.begin(9600); // open the serial port at 9600 bps:
    pinMode(PIN_CLOSE, INPUT);
    pinMode(PIN_OPEN, INPUT);
}
 
// the loop function runs over and over again forever
void loop() {
    Serial.println("loop");
    monitor();
}
 
void monitor() {
    int state;
 
    while(true) {
        state = digitalRead(PIN_CLOSE);
 
        if (state == HIGH) {
         Serial.print("PIN_CLOSE: ");
         Serial.println(state);
        }
 
        state = digitalRead(PIN_OPEN);
 
        if (state == HIGH) {
         Serial.print("PIN_OPEN: ");
         Serial.println(state);
        }
  
        delay(1000);
    }
}

Pierwszy pin PIN_CLOSE działa bez problemu tzn. jak wcisnę przycisk do poprawnie dostane komunikat o tym, że PIN_CLOSE: 1. Ale PIN_OPEN już z jakiegoś powodu nie chce działać poprawnie. tzn. w momencie wciśnięcia przycisku albo nic się nie dzieje, albo resetuje się kontroler albo w konsoli pojawiają się jakieś kwiatki.

W załącznikach wrzuciłem zdjęcie. Na zdjęciu jestem już podpięty pod pin 4, ale sprawdzałem też na 3 i w obu przypadkach są problemy. Na zdjęciu również nie ma wpiętego opornika 330 między napięciem a przyciskiem. Próbowałem z opornikiem i bez. Nic się nie zmienia. Dodam jeszcze, że układ testowałem z podłączymy konwerterem, USB/TTL/UART tzn. napięcie było pobierane bezpośrednio z niego.

 

1629719940386.jpg

Link do komentarza
Share on other sites

To musi mieć jakiś związek z tym, że pin 3 jest opisany jako pin przetwarzania "It is used as an external interrupt 1". Zauważyłem teraz, że gdy pin 3 podłączę na V to program się zatrzymuje. Gdy podłączę go do GND wtedy dalej działa. 

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

No ale tak się zachowuje, podpięcie pod pin 3 powoduje zatrzymanie się programu. Może to, że zmontowałem ten układ na płytce prototypowej ma znaczenie, o czymś zapomniałem.

Link do komentarza
Share on other sites

W tym programie nie potrzebujesz ani rezystorów ani kondensatorów, przecież możesz na swoich pinach zrobić np: pinMode(PIN_CLOSE, INPUTPULLUP); poza tym, po co Ci ta druga pętla? Czy nie prościej zrobić tak:

#define PIN_CLOSE 2
#define PIN_OPEN 4
#define PIN_STOP 5
#define PIN_LIMIT_OPEN 6
#define PIN_LIMIT_CLOSE 7
 
void setup() {
    Serial.begin(9600); // open the serial port at 9600 bps:
    pinMode(PIN_CLOSE, INPUT);
    pinMode(PIN_OPEN, INPUT);
int state = 0;
Serial.println("loop");
}
 
// the loop function runs over and over again forever
void loop() {
    
     state = digitalRead(PIN_CLOSE);
 
        if (state == HIGH) {
         Serial.print("PIN_CLOSE: ");
         Serial.println(state);
        }
 
        state = digitalRead(PIN_OPEN);
 
        if (state == HIGH) {
         Serial.print("PIN_OPEN: ");
         Serial.println(state);
        }
  
        delay(1000);
  }
 

 

Link do komentarza
Share on other sites

4 minuty temu, ttmdear napisał:

No ale tak się zachowuje, podpięcie pod pin 3 powoduje zatrzymanie się programu.

A na jakiej podstawie tak twierdzisz? Jesli nie wciskasz guzika to nic sie nie wyswietli i zostajesz w petli while...

Link do komentarza
Share on other sites

#define PIN_CLOSE 2
#define PIN_OPEN 3
#define PIN_STOP 5
#define PIN_LIMIT_OPEN 6
#define PIN_LIMIT_CLOSE 7

void setup() {
    Serial.begin(9600); // open the serial port at 9600 bps:
    pinMode(PIN_CLOSE, INPUT);
    pinMode(PIN_OPEN, INPUT);
}

void loop() {
    Serial.println("loop");

    if (digitalRead(PIN_CLOSE)) {
        Serial.println("PIN_CLOSE");
    }

    if (digitalRead(PIN_OPEN)) {
        Serial.println("PIN_OPEN");
    }

    delay(500);
}

Ja testowałem różne wersje tego programu np. taki prosty jak powyżej. Komunikat "loop" sie wyświetla co pół sekundu. Jak pin 3 podłączę do V to komunikat "loop" się nie powiela. Jak podłączę pin 3 do masy znów zaczyna sie pojawiać. Na tej podstawie zakładam, że program się zatrzymał. 

Link do komentarza
Share on other sites

(edytowany)

Wrzucam jeszcze raz zdjęcie płytki prototypowej. Sprawdziłem to na problem jest na płytce prototypowej. Gdy uruchomię na płytce Arduino UNO nie ma tego problemu. 

Rezonator 16MHz, kondenstatory 22pF.

1629752045702.jpg

Edytowano przez ttmdear
Link do komentarza
Share on other sites

Trudno żebyśmy coś tutaj znaleźli, skoro układ działa prawidłowo w uno to znaczy że mikrokontroler jest ok. Ja bym to zostawił do jutra i spojrzał "świeżym" okiem, na pewno jakąś pierdółka nie łączy i stąd te problemy 

Link do komentarza
Share on other sites

Jeszcze zauważyłem, że jak podłącze ten PIN 3 do V to nie mogę zaprogramować mikrokontrolera. Dodam jeszcze że korzystam z konwertera USB to TTL i testy gdy jest podłączony. 

To jest bardzo dziwne 🙂 może stary mikrokontroler. Ta moja Atmega to ma z 5 lat. Dokładne oznaczenia to Atmega328p-PU 1544.

1629754068216.jpg

1629754068207.jpg

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.