Skocz do zawartości

Atmega328p problem z odczytywaniem pinu


Pomocna odpowiedź

Napisano

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

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. 

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.

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);
  }
 

 

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...

#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ł. 

A to dziwne...musi sie wyswietlac co pol sekundy bez znaczenia czy ktorys guzik wcisniety bo if to nie petla i nie mozesz sie wnim zatrzymac...wykona sie i kod leci dalej...sprawdz te piny kabelki jeszcze raz...

(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

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 

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

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...