Ik ben afgelopen week weer eens aan de gang gegaan met m'n microcontrollers in de hoop RS485-communicatie met de PC nu eindelijk eens werkend te krijgen (ja, daar heb ik jullie al eerder mee lastig gevallen

). Helaas wil het ook deze keer weer niet lukken.
Ik heb een Atmega8 aangesloten op een MAX485 volgens (het bovenste deel van) dit schema:

. Ik gebruik overigens geen 'shielded pair', maar twee losse draadje van 10cm.
Dus van de MAX485 de RO op de RX van de Atmega, de DI op de TX en de andere twee pinnen samen op INT0. De MAX485 hangt aan de + en - die ik overal op m'n bordje gebruik en de A en B hangen aan de A en B van
deze kabel. Het bijgeleverde printje heeft nog een R+, R-, GND en 9V, maar die zijn niet aangesloten.
Dit lijkt me allemaal in orde.
De microcontroller heeft een 3.6864MHz kristal en heb ik voorzien van dit programma:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
| //#define F_CPU 1000000
#define F_CPU 3686400
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
/* ***************************************************************************************************************************
* Initialise serial port for use 9600 8N1
* ***************************************************************************************************************************/
void USART_vInit(int baudrate)
{
// Set baud rate
int rate = F_CPU/(16*baudrate) - 1;
// Set baud rate
UBRRH = (unsigned char)(rate>>8);
UBRRL = (unsigned char)rate;
// Set frame format to 8 data bits, no parity, 1 stop bit
UCSRC = (1 << UCSZ0) | (1 << UCSZ1);
// Enable receiver and transmitter
UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
//UMSEL=(1<<UCPOL);
}
void USART_Transmit( unsigned char data )
{
//Wait for empty transmit buffer
while ( !( UCSRA & (1<<UDRE)) )
;
PORTD=PIND | 0x04;//RX# disable TX enable 0b00000100
// Put data into buffer, sends the data
UDR = data;
}
/* ***************************************************************************************************************************
* Serial interrupt, whenever we receive a byte we get an interrupt
* The byte gets added to the serialbuffer, when it's full or get a linefeed (enter) process it
* ***************************************************************************************************************************/
ISR(USART_RXC_vect)
{
char receivedByte;
receivedByte = UDR; // Fetch the recieved byte value into the variable "receivedByte"
// Echo back the received byte back to the computer
USART_Transmit( receivedByte );
}
ISR(USART_TXC_vect)
{
PORTD=PIND & 0xfb;//RX# enable TX disable 0b11111011
}
ISR(INT0_vect)
{
}
int main(void)
{
DDRC=0xff; // output port
MCUCR = (1 << ISC00) | (0 << ISC01) | (1 << ISC10) | (0 << ISC11);
GICR = (1 << INT0);// | (1 << INT1);
PORTD=PIND & 0xfb;//RX# enable TX disable 0b11111011
// Initialise USART
USART_vInit( 9600 );
//activate interrupts
sei();
while(1)
{
}
return(0);
} |
Dit zou er dus voor moeten zorgen dat, wanneer ik een byte stuur, deze automatisch teruggestuurd wordt.
Echter, als ik test met Putty krijg ik vreemde tekens terug. Als ik een 'a' stuur, krijg ik meestal een 'O' terug. Dit had ik in het verleden ook al eens en toen bleek dat dit binair gezien:
code:
1
2
3
4
5
6
7
8
| 01100101 e
01001101 M
01100001 a
01001111 O
01100011 c
01001110 N |
was.
Dit komt inderdaad overeen met wat ik zie. Maar waar kan dat aan liggen? De A en B zijn goed aangesloten, maar dat zou ook niets uit moeten maken: als dit omgekeerd was, zouden bij het versturen alle enen nullen worden en omgekeerd, maar bij het terugsturen ook weer.
Ook als ik het programma zo bouw dat een LED moet gaan branden bij een bepaalde letter, zie ik niets gebeuren. Niet als ik check op 'a', maar ook niet als ik check op 'O'.
Ik heb de GND van het printje ook al eens aan de - op m'n bordje gehangen, maar dat maakt niets uit.
Als voeding gebruik ik overigens de voeding die uit m'n programmer komt, die nog gewoon in het bord steekt. Maar ook met een externe voeding en zonder programmer, heb ik dit gedrag.
Iemand enig idee wat ik fout doe?