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?
GCC - AVR, Vektor
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
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
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
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 >>
;
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
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 >>

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
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Nja, du skickar fyra int och tar emot fyra int eftersom du deklarerar en array med 4 int.
För att skicka
Nåt sånt borde funka.
För att ta emot data som tidigare:
För att skicka
Kod: Markera allt
unsigned int skicka = 1032;
UDR = (unsigned char)(skicka>>8);
UDR = (unsigned char)(skicka & 0x00FF);
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;