Skocz do zawartości

[AVR GCC][C][hapsim]Terminal i przyciski


qw33r

Pomocna odpowiedź

program miał wyświetlać w terminalu numer wciśniętego przycisku.Ale coś nie za bardzo dobrze działa, ponieważ po uruchomieniu go od razu wyskakuje jedynka '1' poczym jak się wciśnie jakiś przycisk nic się nie dzieje.. 🙁

program zatrzymuje się na:

loop_until_bit_is_set(PORTB,TXC); 

wydaje mi się, że jest to źle: czekaj na zakończenie transmisji i tez na odbiór..

a oto cały program:

// Sterownie dioda LED podłaczona do dowolnej linii mikrokontrolera
// za pomoca dowolnego znaku odebranego z portu szeregowego
// mikrokontrolera i wysyłanie jej stanu na port szeregowy
#include <avr/io.h> // dostep do rejestrów
#include <avr\iom128.h>
#include <compat/deprecated.h>
// Zmieniajac ponisze definicje mona dostosowac program do potrzeb
#define F_CPU 8000000ul // czestotliwosc zegara w Hz
#define UART_BAUD 19200ul // predkosc transmisji bit/s
#define LED_PORT PORTD // port diody LED
#define LED_BIT 4 // bit diody LED
#define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1) // adr. rej. kier. PORTx
#define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2) // adr. rej. wej. PORTx
#define LED_PORT_O LED_PORT // rejestr wyjsciowy
#define LED_PORT_D DDR(LED_PORT) // rejestr kierunkowy
#define LED_PORT_I PIN(LED_PORT) // rejestr wejsciowy
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1)
// _UCR_
#ifdef UCR
#define _UCR_ UCR
#endif
#ifdef UCSRB
#define _UCR_ UCSRB
#endif
#ifdef UCSR0B
#define _UCR_ UCSR0B
#endif
// _USR_
#ifdef USR
#define _USR_ USR
#endif
#ifdef UCSRA
#define _USR_ UCSRA
#endif
#ifdef UCSR0A
#define _USR_ UCSR0A
#endif
// Definicje funkcji
// inicjalizacja portu szeregowego
void UART_init(void)
{
UBRR0H = (UART_CONST >> 8); // ustaw predkosc transmisji
UBRR0L = (UART_CONST & 0xFF);
_UCR_ = _BV(RXEN)|_BV(TXEN); // załacz tx, rx
}
// wysyła znak podany jako parametr na port szeregowy
void UART_putchar (char c)
{
UDR0 = c; // wpisz c do rejestru UDR
loop_until_bit_is_set(PORTB,TXC); // czekaj na zakonczenie transmisji
sbi(_USR_,TXC); // ustaw bit TXC w rej. USR
}
// odbiera znak z portu szeregowego i zwraca go jako wartosc funkcji
char UART_getchar (void)
{
loop_until_bit_is_set(PORTB,RXC); // czekaj na zakonczenie odbioru
cbi(_USR_,RXC); // skasuj bit RXC w rej. USR
return UDR0; // zwróc zawartosc rejestru UDR
}
int main(void) // program główny
{
PORTB=0xFF;
char c; 
UART_init(); // inicjalizacja portu szeregowego
sbi(LED_PORT_D,LED_BIT); // uyj linii jako wyjscia
while(1) // petla nieskonczona
{
PORTB=UART_getchar ();

    switch (PORTB)
     {
        case 0:
  cbi(LED_PORT_O,LED_BIT); // zapal diode LED
UART_putchar('1'); // wyslij '1' na port szeregowy
UART_getchar(); // czekaj na znak z portu szeregowego
        break;

        case 1:
         cbi(LED_PORT_O,LED_BIT); // zapal diode LED
UART_putchar('2'); // wyslij '2' na port szeregowy
UART_getchar(); // czekaj na znak z portu szeregowego
        break;

       case 2:
cbi(LED_PORT_O,LED_BIT); // zapal diode LED
UART_putchar('3'); // wyslij '3' na port szeregowy
UART_getchar(); // czekaj na znak z portu szeregowego
        break;

        case 4:
cbi(LED_PORT_O,LED_BIT); // zapal diode LED
UART_putchar('4'); // wyslij '4' na port szeregowy
UART_getchar(); // czekaj na znak z portu szeregowego
       break;

}

}
} 

możecie pomóc? gdzie jest błąd? (:

Link do komentarza
Share on other sites

Do odczytu powinieneś używać PINB nie PORTB.

Czyli w kodzie

switch (PORTB) 

zmień na

switch (PINB) 

[ Dodano: 02 Lis 09 06:33 ]

Inna sprawa, że

case 0:

chyba jest niepoprawne (chyba że ma zwracać 1 jeśli nic nie naciśnięte).

[ Dodano: 02 Lis 09 06:38 ]

Nie wiem, jak zdefiniowane jest makro loop_until_bit_is_set(), ale chyba odczytuje ze złego rejestru. Nie chodzi o PORTB, ale UCSRA (nie wiem czy tak samo dla m128, sprawdzałem dla m8).

Na początek wyrzuć wywołania loop_until_bit_is_set(), dodaj opóźnienia, powinno działać. Później dodaj oczekiwanie na koniec transmisji.

  • Lubię! 1
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.