logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega16][C][WinAvr] To samo na LCD co przez UART

kwikam 26 Mar 2009 21:52 3505 5
REKLAMA
  • #1 6337640
    kwikam
    Poziom 10  
    Witam.
    Mam problem, zdaje się, że dość prosty. Odbieram zmienną poprzez UART i ją odbijam z powrotem na terminal, co odbywa się w przerwaniu. Tą samą zmienną wysyłam na LCD. Zamiast otrzymać liczbę dostaje jej kod ASCII. Wolałbym liczbę, którą wpisałem z klawiatury. Ale zdaje się, że do UDR zapisywana jest ona w postaci kodu ASCII właśnie, tzn np zamiast 1 mam 49. Jak to przekonwertować??

    Oto kod programu:

    
    #include "konfig.h"
    
    volatile int Temp;
    
    ISR(USART_RXC_vect)
    
    {
    
    	Temp=0;
    	Temp=UDR;
    	if (Temp==49)
    	{
    	UDR=Temp; //echo tego co wysyla
    	}
    	
    }
    
    int main(void)
    {
    DDRA = 0xFF;				//K**wa ważne!!!
    UART_Init();				//inicjalizacja UART-u
    lcd_init();					//Initializacja LCD
    
    char bufor[10];
    int liczba;
    
    NEWLINE();
    UART_putstr("TESTUJE TYPY");
    NEWLINE();
    
    while(1)
    
    {
    
    itoa(Temp, bufor,10);
    lcd_xy(0,7); 
    write_text(bufor);
    lcd_xy(1,7);
    write_text(Temp); 
    
    }
    }
    


    Dodam że wszystko działa należycie, LCD i UART. Funkcje i procedury to taki "Frankenstein" z bibliotek dostępnych w internecie. W razie wątpliwości udostępnie ich kod.

    PS. zmiana volatile int Temp; na volatile char Temp; nic nie daje. Zamieszczony kod jest "eksperymentalny".. ale już za długo nie działa więc proszę o pomoc.
  • REKLAMA
  • #2 6337707
    Freddie Chopin
    Specjalista - Mikrokontrolery
    '0' - 48
    '1' - 49
    '2' - 50
    ...

    Widzisz zależność? Jeśli z 48 chcesz zrobić 0, to należy ...?

    Pozatym - na chwilę obecną dostajesz przez UART kod ASCII, konwertujesz go na liczbę i w funkcji wysyłania na LCD konwertujesz liczbę na ... ASCII... Troche bez sensu, nie uważasz? Jeśli chcesz wyświetlić na LCD znak o kodzie 49 ('1') to po prostu wyślij do LCD kod 49 i po sprawie.

    4\/3!!
  • REKLAMA
  • #3 6337917
    kwikam
    Poziom 10  
    Odjąć 48!!!
    Tylko że już to przerabiałem, ale może coś źle robiłem.Mógłbyś mi wskazać miejsce gdzie to wpisać? A może jest jakiś mądrzejszy sposób?

    Program miał działać tak ale się zaciąłem:
    1. Na LCD nic albo 0 //działa
    2. W terminalu jakiś tekst powitalny //jest, ok
    3. Wpisuje cyfrę i wyświetlona zostaje ona na LCD //nie działa
    4. Cyfra poddana jakiejś operacji, np x2 wysyłana jest na USART
    5. W drugiej linijce LCD-ka pojawia się ta zmodyfikowana cyfra/liczba. //;(
  • REKLAMA
  • Pomocny post
    #4 6338067
    Freddie Chopin
    Specjalista - Mikrokontrolery
    dzień dobroci.

    
    #include "konfig.h" // sugerowalbym nazwy typu "config.h"
    
    volatile char Temp; // skoro odbierasz znak, to po co komu 16-bitow?
    
    ISR(USART_RXC_vect)
    
    {
    
    //	Temp=0; // zbedne
    	Temp=UDR;
    	if (Temp=='1') // przynajmniej wiadomo o co chodzi
    	{
    	UDR=Temp; //echo tego co wysyla
    	}
    	
    }
    
    int main(void)
    {
    DDRA = 0xFF;				//komentarze z przeklenstawami sa jeszcze gorsze niz takie po polsku
    UART_Init();				//inicjalizacja UART-u
    lcd_init();					//Initializacja LCD
    
    //char bufor[10]; // zbedne
    //int liczba; // nigdzie nie uzywane
    
    NEWLINE();
    UART_putstr("TESTUJE TYPY");
    NEWLINE();
    
    while(1)
    
    {
    
    //itoa(Temp, bufor,10); // zbedne
    lcd_xy(0,7); 
    //write_text(bufor);
    write_char(Temp); // wstaw nazwe odpowiedniej funkcji z twoich bibliotek!
    lcd_xy(1,7);
    //write_text(Temp); // jak wyzej
    
    }
    }
    


    4\/3!!
  • REKLAMA
  • #5 6338626
    kwikam
    Poziom 10  
    Wielkie dzięki. Działa :)

    Ale tak na przyszłość:
    //Twój protekcjonalny ton wypowiedzi //zbędny
REKLAMA