GCC - AVR, Vektor

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

GCC - AVR, Vektor

Inlägg av Anonym2 »

Hej

Jag håller på att fixa ihop 2st AVR, via en UART. Tanken är att skicka ett värde(0-1024) från en AVR till en annan. Kommunikationen mellan dem fungerar jättebra, men däremot inte hanteringen av datan, när den väl har kommit fram.

En AVR skickar först "111"(för att initiera mottagningen), sedan "1" "0" "1" "2" till en annan. Den andra AVRen lagrar samtidigt ner alla dessa sifror i en vektor, typ

int mottaget[4]

data mottagen
mottaget[0] = UDR
ny data mottagen
mottaget[1] = UDR

Men efter detta uppstår problem. Kan jag inte använda integer variabeln mottaget som vilken variabel som helst? När jag skickar variabeln till min LCD-display så går det att skicka varje separat del av vektorn åt gången, men inte hela sammtidigt. Jag skulle altså vilja ha det som att "int mottaget = 1012"


Kan någon ge mig en hint om vad som har blivit tokigt?
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Hur ser det ut när du skickar data? Jag tycker det är lite svårtolkat om du skickar det som ascii eller inte.

Om du vill ta emot en unsigned int så bör koden se ut ungefär så här förutsatt att du skickar "high byte" först.

unsigned int mottaget;

data mottagen
mottaget = UDR
mottaget <<= 8;
ny data mottagen
mottaget += UDR
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

Inlägg av Anonym2 »

Hej

Detta är programmet som tar emot datan


#nclude<stdlib.h>
#include<avr/io.h>
#include<avr/pgmspace.h>
#include "lcd.h"

#define F_CPU 8000000
#define USART_BAUDRATE 1200
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

int main (void)
{
int ReceivedByte;
char output[5];
int data[4];

TCCR1B |= ((1 << CS10) | (1 << CS11));

lcd_init(LCD_DISP_ON);

UCSRB |= (1 << RXEN) | (1 << TXEN);
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
UBRRL = BAUD_PRESCALE;
UBRRH = (BAUD_PRESCALE >> 8);

for (;;) // Loop forever
{
while ((UCSRA & (1 << RXC)) == 0) {};
ReceivedByte = UDR;
if(ReceivedByte == 111)
{
while ((UCSRA & (1 << RXC)) == 0) {};
data[0] = UDR;
while ((UCSRA & (1 << RXC)) == 0) {};
data[1] = UDR;
while ((UCSRA & (1 << RXC)) == 0) {};
data[2] = UDR;
while ((UCSRA & (1 << RXC)) == 0) {};
data[3]= UDR;

itoa(data, output, 10);
lcd_gotoxy(0,0);
lcd_puts(output);
}
}
}

Och detta är programmet som skickar data

#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>

#define F_CPU 1000000
#define USART_BAUDRATE 1200
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

int main (void)
{
int skicka[4] = {1 , 0 , 3 , 2};
int ReceivedByte = 123;
char buff[4];
TCCR1B |= ((1 << CS10) | (1 << CS11));


UCSRB |= (1 << RXEN) | (1 << TXEN);
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);

UBRRL = BAUD_PRESCALE; //
UBRRH = (BAUD_PRESCALE >> Cool; //

for (;Wink // Loop forever
{
while(TCNT1 <=20000);
{}
TCNT1 = 0;
while ((UCSRA & (1 << UDRE)) == 0) {};
UDR = 111;
while(TCNT1 <=20000);
{}
TCNT1 = 0;
while ((UCSRA & (1 << UDRE)) == 0) {};
UDR = skicka[3];
while(TCNT1 <=20000);
{}
TCNT1 = 0;
while ((UCSRA & (1 << UDRE)) == 0) {};
UDR = skicka[2];
while(TCNT1 <=20000);
{
}
TCNT1 = 0;
while ((UCSRA & (1 << UDRE)) == 0) {};
UDR = skicka[1];
while(TCNT1 <=20000);
{
}
TCNT1 = 0;
while ((UCSRA & (1 << UDRE)) == 0) {};
UDR = skicka[0];

}
}


Jag skickar altså en INT(tror jag) och tar emot den och lagrar den i en INT, stämmer det?


//Alexander
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Nja, du skickar fyra int och tar emot fyra int eftersom du deklarerar en array med 4 int.

För att skicka

Kod: Markera allt

unsigned int skicka = 1032;

UDR = (unsigned char)(skicka>>8); 

UDR = (unsigned char)(skicka & 0x00FF); 
Nåt sånt borde funka.


För att ta emot data som tidigare:

Kod: Markera allt

unsigned int mottaget; 

data mottagen 
mottaget = UDR; 
mottaget <<= 8; 
ny data mottagen 
mottaget += UDR;
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Om du ändå vill skicka det binärt så blir det 2 tecken.
Du måste nog bestämma dig hur du vill att dina data
ska representeras...
Skriv svar