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

Jak odebrać wiadomość 154 bajtów z @@Ha na ATmega128 w CodeVision?

muniek241 02 Mar 2006 12:06 1689 1
REKLAMA
  • #1 2365037
    muniek241
    Poziom 10  
    Posty: 47
    Witam!
    Mam problem z popranym odbiorem danych.
    Kod wygenerowany przez kreatora jest przedstawiony na listingu. I teraz pytanie. Mam odebrać z odbiornika widomość o długości 154 bajtów.
    Wiadomość ta przychodzi co 1 sekundę i zaczyna się zawsze czterama
    takimi samymi znakami : @@Ha
    Próbowałem już robić to z pętlą, by odbierać 154 znaki, i potem pisać
    do drugiego wiersza tabeli (dwuwymiarowej), próbowałem bez przerwania z getchar, nijak mi to nie wychodzi.
    Może ktoś podpowiedział by jak to zrobić ? Bo już naprawdę nie mam siły.
    Aha. Kod jak widać w CodeVision na ATmega 128.
    Pozdrawiam
    Piotrek

    
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V1.24.5 Standard
    Chip type           : ATmega128
    Program type        : Application
    Clock frequency     : 8,000000 MHz
    Memory model        : Small
    External SRAM size  : 0
    Data Stack size     : 1024
    *****************************************************/
    
    #include <mega128.h>
    #include <delay.h>
    // 1 Wire Bus functions
    #asm
       .equ __w1_port=0x15 ;PORTC
       .equ __w1_bit=0
    #endasm
    #include <1wire.h>
    
    // Alphanumeric LCD Module functions
    #asm
       .equ __lcd_port=0x1B ;PORTA
    #endasm
    #include <lcd.h>
    
    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7
    
    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<OVR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)
    
    // USART0 Receiver buffer
    #define RX_BUFFER_SIZE0 8   //8
    char rx_buffer0[RX_BUFFER_SIZE0];
    
    #if RX_BUFFER_SIZE0<256
    unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
    #else
    unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
    #endif
    
    // This flag is set on USART0 Receiver buffer overflow
    bit rx_buffer_overflow0;
    
    // USART0 Receiver interrupt service routine
    
    interrupt [USART0_RXC] void usart0_rx_isr(void)
    {  
    
    char status,data;
    status=UCSR0A;
    data=UDR0; 
    
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
       {
       rx_buffer0[rx_wr_index0]=data; 
       
       
       if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
       if (++rx_counter0 == RX_BUFFER_SIZE0)
          {
          rx_counter0=0;
          rx_buffer_overflow0=1;
          };
       };
    }      
    
    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART0 Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter0==0);
    data=rx_buffer0[rx_rd_index0];
    if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
    #asm("cli")
    --rx_counter0;
    #asm("sei")
    return data;
    }
    #pragma used-
    #endif
    
    // Get a character from the USART1 Receiver
    #pragma used+
    char getchar1(void)
    {
    char status,data;
    while (1)
          {
          while (((status=UCSR1A) & RX_COMPLETE)==0);
          data=UDR1;
          if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
             return data;
          };
    }
    #pragma used-
    
    // Write a character to the USART1 Transmitter
    #pragma used+
    void putchar1(char c)
    {
    while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
    UDR1=c;
    }
    #pragma used-
    
    // Standard Input/Output functions
    #include <stdio.h>
    
    // SPI functions
    #include <spi.h>
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
    
    Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
    
    State0=T 
    PORTA=0x00;
    DDRA=0x00;
    
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In 
    
    Func0=In 
    // State7=T State6=T State5=T State4=T State3=0 State2=T State1=T 
    
    State0=T 
    PORTB=0x00;
    DDRB=0x08;
    
    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
    
    Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
    
    State0=T 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
    
    Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
    
    State0=T 
    PORTD=0x00;
    DDRD=0x00;
    
    // Port E initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
    
    Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
    
    State0=T 
    PORTE=0x00;
    DDRE=0x00;
    
    // Port F initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
    
    Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
    
    State0=T 
    PORTF=0x00;
    DDRF=0x00;
    
    // Port G initialization
    // Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State4=T State3=T State2=T State1=T State0=T 
    PORTG=0x00;
    DDRG=0x00;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    ASSR=0x00;
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // OC1C output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    OCR1CH=0x00;
    OCR1CL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // Timer/Counter 3 initialization
    // Clock source: System Clock
    // Clock value: Timer 3 Stopped
    // Mode: Normal top=FFFFh
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // OC3A output: Discon.
    // OC3B output: Discon.
    // OC3C output: Discon.
    TCCR3A=0x00;
    TCCR3B=0x00;
    TCNT3H=0x00;
    TCNT3L=0x00;
    ICR3H=0x00;
    ICR3L=0x00;
    OCR3AH=0x00;
    OCR3AL=0x00;
    OCR3BH=0x00;
    OCR3BL=0x00;
    OCR3CH=0x00;
    OCR3CL=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    // INT3: Off
    // INT4: Off
    // INT5: Off
    // INT6: Off
    // INT7: Off
    EICRA=0x00;
    EICRB=0x00;
    EIMSK=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    ETIMSK=0x00;
    
    // USART0 initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART0 Receiver: On
    // USART0 Transmitter: On
    // USART0 Mode: Asynchronous
    // USART0 Baud rate: 9600
    UCSR0A=0x00;
    UCSR0B=0x98;
    UCSR0C=0x06;
    UBRR0H=0x00;
    UBRR0L=0x33;
    
    // USART1 initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART1 Receiver: On
    // USART1 Transmitter: On
    // USART1 Mode: Asynchronous
    // USART1 Baud rate: 38400
    UCSR1A=0x00;
    UCSR1B=0x18;
    UCSR1C=0x06;
    UBRR1H=0x00;
    UBRR1L=0x0C;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // SPI initialization
    // SPI Type: Slave
    // SPI Clock Rate: 2000,000 kHz
    // SPI Clock Phase: Cycle Half
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First
    SPCR=0x40;
    SPSR=0x00;
    
    // 1 Wire Bus initialization
    w1_init();
    
    // LCD module initialization
    lcd_init(16);
    
    // Global enable interrupts
    #asm("sei")
    delay_ms(1000); 
    //lcd_putsf("...ppp");
    //printf("%c%c%c%c%c%c%c",0x40,0x40,0X43,0x6A,0x29,0x0D,0x0A);
    printf("%c%c%c%c%c%c%c%c",0x40,0x40,0x48,0x62,0x02,0x28,0x0D,0x0A);  
    
    delay_ms(1000);
    while (1)
        {
          
          // Place your code here
              
          };
    }
    
  • REKLAMA
  • #2 2369458
    dioda1000
    Poziom 28  
    Posty: 830
    Pomógł: 143
    Ocena: 130
    a spróbuj tak

    tu
    - czytaj 1 znak jak jest różny od @ to skocz tu
    - czytaj 2 znak jak jest różny od @ to skocz tu
    - czytaj 3 znak jak jest różny od H to skocz tu
    - czytaj 4 znak jak jest różny od a to skocz tu
    ; czyli masz odczytany nagłówek

    i teraz pętla dla 150 znaków np. for i=1 to 150

    czytaj zapisz do tablicy(i)

    next i

    poz dioda
    ps.CodeVision nie znam :(
REKLAMA