Witam serdecznie,
Wykonałem płytkę PCB, której sercem jest ATMega32A. Na płytce znajdują się takie moduły jak:
- wyświetlacz alfanumeryczny,
- moduł komunikacyjny USB - FT232RL,
- tor analogowy przetwarzający sygnał analogowy składający się z dwóch wzmacniaczy i komparatora,
- dioda kontrolna, monitorująca działanie programu.
Wszystkie powyższe moduły działają bez zarzutu. Przetestowałem każdy z nich i nie dopatrzyłem się żadnych zastrzeżeń.
Mam problem z (chyba) najłatwiejszą sprawą - przyciskami (5 szt. zwykłych, prymitywnych microswitchy).
Mianowicie procesor nie reaguje na zmiany stanów przycisków. Widzi je tak, jakby ciągle były wciśnięte. Sprawdzałem zwarcia/zimne luty w otoczeniu przycisków i na liniach z nimi związanych i wszystko jest OK. Sprawdzałem miernikiem poziomy napięć i też wszystko się zgadza - pin mikrokontrolera do którego podłaczony jest przycisk ma potencjał 5V w sytuacji gdy przycisk jest wyciśnięty i 0V gdy przycisk jest naciśnięty. Zatem od strony hardware microswitchy wszystko wygląda jak najbardziej w porządku.
Niestety prymitywny program zapalający/gaszący diodę nie działa tak jak powinien (po naciśnięciu przycisku dioda pali się przez 300ms po czym gaśnie, a program czeka na ponowne wciśnięcie przycisku). Program działa tak jakby przycisk był ciągle wciśnięty i ciagle wchodzi w pętlę zapalania diody i gaszenia po czasie 300ms. Sama dioda działa dobrze - testowałem ją przy innej okazji.
Opisany wyżej program to tylko przykład. Próbowałem obsługiwać przyciski nie tylko z użyciem diody, ale także wyświetlacza alfanumerycznego i efekt ten sam - procesor widzi tak jakby przycisk był ciagle naciśnięty.
Co wiecej, każdy z porgramów testowałem na innej, zupełnie niezależnej płytce z tym samym mikrokontrolerm (ATMega32A) i wszystko działa jak należy, stąd wniosek że w kodzie programu nie ma błędu powodującego takie dziwne zachowanie procesora.
Podsumowując.
Czy macie pomysł gdzie szukać błędu skoro:
- inne, bardziej skomplikowane moduły na płytce działają,
- hardware (ścieżki, luty, poziomy napięć) przycisków bez zarzutu,
- kod programu na innej płytce z tym samym procesorem (ATMega32A) działa,
Dlaczego zatem, procesor widzi przyciski tak jakby były nieustannie wciśnięte?
Załaczam kod programu testowego oraz schemat.
Wykonałem płytkę PCB, której sercem jest ATMega32A. Na płytce znajdują się takie moduły jak:
- wyświetlacz alfanumeryczny,
- moduł komunikacyjny USB - FT232RL,
- tor analogowy przetwarzający sygnał analogowy składający się z dwóch wzmacniaczy i komparatora,
- dioda kontrolna, monitorująca działanie programu.
Wszystkie powyższe moduły działają bez zarzutu. Przetestowałem każdy z nich i nie dopatrzyłem się żadnych zastrzeżeń.
Mam problem z (chyba) najłatwiejszą sprawą - przyciskami (5 szt. zwykłych, prymitywnych microswitchy).
Mianowicie procesor nie reaguje na zmiany stanów przycisków. Widzi je tak, jakby ciągle były wciśnięte. Sprawdzałem zwarcia/zimne luty w otoczeniu przycisków i na liniach z nimi związanych i wszystko jest OK. Sprawdzałem miernikiem poziomy napięć i też wszystko się zgadza - pin mikrokontrolera do którego podłaczony jest przycisk ma potencjał 5V w sytuacji gdy przycisk jest wyciśnięty i 0V gdy przycisk jest naciśnięty. Zatem od strony hardware microswitchy wszystko wygląda jak najbardziej w porządku.
Niestety prymitywny program zapalający/gaszący diodę nie działa tak jak powinien (po naciśnięciu przycisku dioda pali się przez 300ms po czym gaśnie, a program czeka na ponowne wciśnięcie przycisku). Program działa tak jakby przycisk był ciągle wciśnięty i ciagle wchodzi w pętlę zapalania diody i gaszenia po czasie 300ms. Sama dioda działa dobrze - testowałem ją przy innej okazji.
Opisany wyżej program to tylko przykład. Próbowałem obsługiwać przyciski nie tylko z użyciem diody, ale także wyświetlacza alfanumerycznego i efekt ten sam - procesor widzi tak jakby przycisk był ciagle naciśnięty.
Co wiecej, każdy z porgramów testowałem na innej, zupełnie niezależnej płytce z tym samym mikrokontrolerm (ATMega32A) i wszystko działa jak należy, stąd wniosek że w kodzie programu nie ma błędu powodującego takie dziwne zachowanie procesora.
Podsumowując.
Czy macie pomysł gdzie szukać błędu skoro:
- inne, bardziej skomplikowane moduły na płytce działają,
- hardware (ścieżki, luty, poziomy napięć) przycisków bez zarzutu,
- kod programu na innej płytce z tym samym procesorem (ATMega32A) działa,
Dlaczego zatem, procesor widzi przyciski tak jakby były nieustannie wciśnięte?
Załaczam kod programu testowego oraz schemat.
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRC |= (1<<PC7);
DDRC &= ~(1<<PC4);
PORTC |= (1<<PC7);
PORTC |= (1<<PC4);
while (1)
{
if (bit_is_clear(PINC, PC4))
{
_delay_ms(50);
PORTC &= ~(1<<PC7);
//PORTC |= (1<<PC4);
_delay_ms(300);
PORTC |= (1<<PC7);
}
}
}
