Hi!
Hab mir vor einiger Zeit die AVR Entwicklungsplatine für den ATMega16
aus dem Shop dieser Seite besorgt. Funktioniert auch alles recht gut,
aber die Kommunikation über ddie RS232 Schnittstelle klappt noch nicht
so ganz.
Was will ich machen?
Erstmal nur ein Zeichen schicken.
Was funktioniert nicht?
Die Daten kommen nicht am PC an. Das Programm HTerm empfängt nur \0 und
deklariert das ganze als Fehler. Interessanter Weise kommen in jedem
Sendezyklus 4 Byte mit jeweils \0 an obwohl nur 1 Byte gesendet wird...
INFOS:
Ich habe die Suche benutzt und nichts gefunden das mir hilft :)
QUELLCODE:
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 | #define FOSC 8000000// Clock Speed
|
5 | #define BAUD 9600
|
6 | #define MYUBRR FOSC/16/BAUD-1
|
7 |
|
8 | void USART_Init( unsigned int ubrr);
|
9 | void USART_Transmit( unsigned char data );
|
10 |
|
11 | int main( void )
|
12 | {
|
13 | int i;
|
14 |
|
15 | USART_Init ( MYUBRR );
|
16 | DDRB = 1 << 0;
|
17 | PORTB = 1;
|
18 |
|
19 | while(1)
|
20 | {
|
21 | USART_Transmit((unsigned char)'Z');
|
22 | }
|
23 | return 0;
|
24 | }
|
25 |
|
26 | void USART_Init( unsigned int ubrr)
|
27 | {
|
28 | /* Set baud rate */
|
29 | UBRRH = (unsigned char)(ubrr>>8);
|
30 | UBRRL = (unsigned char)ubrr;
|
31 | /* Enable receiver and transmitter */
|
32 | UCSRB = (1<<RXEN)|(1<<TXEN);
|
33 | /* Set frame format: 8data, 2stop bit */
|
34 | UCSRC = (1<<USBS)|(3<<UCSZ0);
|
35 | }
|
36 |
|
37 | void USART_Transmit( unsigned char data )
|
38 | {
|
39 | int i;
|
40 |
|
41 | // rote LED an
|
42 | PORTB = 0;
|
43 | //2 sec. warten
|
44 | for(i=0;i<100;i++)
|
45 | _delay_ms(20);
|
46 |
|
47 | /* Wait for empty transmit buffer */
|
48 | while ( !( UCSRA & (1<<UDRE)) );
|
49 | /* Put data into buffer, sends the data */
|
50 | UDR = data;
|
51 |
|
52 | // rote LED aus
|
53 | PORTB = 1;
|
54 | //2 sec. warten
|
55 | for(i=0;i<100;i++)
|
56 | _delay_ms(20);
|
57 | }
|
Senden tut er wohl. Habe hier nur ein uraltes Oszi das mehr schlecht als
recht funktioniert. Und am PC kommen ja Errors an.
VERKABELUNG:
Auf der Platine mussten die TX/RX Pins des ATMega16 mit den Pins des
MAX232N verbunden werden. TX an RX und RX an TX - steht so in der Doku
und passt auch wenn man sich den Schaltplan ansieht.
Von der RS232 Buchse geht dann ein serielles Kabel (1:1) an den COM1
Port des PC. Bei einem Nullmodemkabel (RX/TX gedreht) kommt garnix am
Rechner an.
TAKTEINSTELLUNG:
Genutzt wird der externe 8.000MHz Quarz. Fuses sind richtig gesetzt.
Kurze Zwischenfrage: Wo ist der Unterschied zwischen fast und slow
Rising Power? Das braucht man für die SUT-Fuses. Habe erstmal slow
Rising eingestellt...
Die Frage ist nun warum kommt am PC nur Datenmüll an? das Windowseigene
Hyperterminal zeigt garnix an und HTerm wie gesagt nur die \0 Bytes.
Hoffe Ihr könnt mir helfen. So langsam verzweifle ich daran.