tbasnoopy
19.02.2012, 23:07
Hallo,
heute versuche ich mal meinen MAX232 zum kommunizieren zu bringen. Ich benutze einen ATMEGA16 Schaltplan siehe Anhang.
F_CPU ist mit 16Mhz im Makefile definiert
F_CPU = 16000000
//---------------------------------------------------------
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//---------------------------------------------------------
#ifndef F_CPU
#error "F_CPU is not defined"
#endif
//---------------------------------------------------------
#define BAUD 38400
#include <util/setbaud.h>
#include <CLED.h>
//---------------------------------------------------------
CLED *tmpLED;
void uart_init(void)
{
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
/* evtl. verkuerzt falls Register aufeinanderfolgen (vgl. Datenblatt)
UBRR = UBRR_VALUE;
*/
#if USE_2X
/* U2X-Modus erforderlich */
UCSRA |= (1 << U2X);
#else
/* U2X-Modus nicht erforderlich */
UCSRA &= ~(1 << U2X);
#endif
// hier weitere Initialisierungen (TX und/oder RX aktivieren, Modus setzen
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
}
//---------------------------------------------------------
int uart_putc( unsigned char c )
{
tmpLED->On();
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = c; /* sende Zeichen */
tmpLED->Off();
return 0;
}
//---------------------------------------------------------
void uart_puts( char *s )
{
while( *s )
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
uart_putc(*s);
s++;
}
}
//---------------------------------------------------------
int main( void )
{
tmpLED = new CLED( ERegC, 3, false );
tmpLED->Off();
uart_init();
tmpLED->Off();
while (1)
{
uart_puts( "hallo" );
_delay_ms( 4000 );
tmpLED->On();
_delay_ms( 1000 );
tmpLED->Off();
}
return 0;
}
//---------------------------------------------------------
Leider kommt bei mir am Rechner nur sporadisch irgendein Muell. Sporadisch heist, dass es nicht alle ~5 sec zu einem Byte kommt sondern ca. alle 20sec.
Empfangen wird:
FF FF F8 F8 FF FF F8 F8 FF FF FF FF F8 F8
Empfangen habe ich mit einem USB2Serial converter und HTerm 0.8.1beta mit folgenden Einstellungen: COM4 (B:38400 d:8 s:1 p:None).
Wie ich bereits nachgelesen habe sind die meisten Fehler in dem Bereich ungenauigkeiten mit der Baudrate. Lt. dieser Liste http://www.wormfood.net/avrbaudcalc.php sind 38400 okay. Das externe Quarz wird auch verwendet. Zumindest kann man das mit einem Blink Test der LED einigermasen kontrollieren.
Kann mir wer nen Tip geben was ich noch kontrollieren kann?
heute versuche ich mal meinen MAX232 zum kommunizieren zu bringen. Ich benutze einen ATMEGA16 Schaltplan siehe Anhang.
F_CPU ist mit 16Mhz im Makefile definiert
F_CPU = 16000000
//---------------------------------------------------------
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//---------------------------------------------------------
#ifndef F_CPU
#error "F_CPU is not defined"
#endif
//---------------------------------------------------------
#define BAUD 38400
#include <util/setbaud.h>
#include <CLED.h>
//---------------------------------------------------------
CLED *tmpLED;
void uart_init(void)
{
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
/* evtl. verkuerzt falls Register aufeinanderfolgen (vgl. Datenblatt)
UBRR = UBRR_VALUE;
*/
#if USE_2X
/* U2X-Modus erforderlich */
UCSRA |= (1 << U2X);
#else
/* U2X-Modus nicht erforderlich */
UCSRA &= ~(1 << U2X);
#endif
// hier weitere Initialisierungen (TX und/oder RX aktivieren, Modus setzen
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
}
//---------------------------------------------------------
int uart_putc( unsigned char c )
{
tmpLED->On();
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = c; /* sende Zeichen */
tmpLED->Off();
return 0;
}
//---------------------------------------------------------
void uart_puts( char *s )
{
while( *s )
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
uart_putc(*s);
s++;
}
}
//---------------------------------------------------------
int main( void )
{
tmpLED = new CLED( ERegC, 3, false );
tmpLED->Off();
uart_init();
tmpLED->Off();
while (1)
{
uart_puts( "hallo" );
_delay_ms( 4000 );
tmpLED->On();
_delay_ms( 1000 );
tmpLED->Off();
}
return 0;
}
//---------------------------------------------------------
Leider kommt bei mir am Rechner nur sporadisch irgendein Muell. Sporadisch heist, dass es nicht alle ~5 sec zu einem Byte kommt sondern ca. alle 20sec.
Empfangen wird:
FF FF F8 F8 FF FF F8 F8 FF FF FF FF F8 F8
Empfangen habe ich mit einem USB2Serial converter und HTerm 0.8.1beta mit folgenden Einstellungen: COM4 (B:38400 d:8 s:1 p:None).
Wie ich bereits nachgelesen habe sind die meisten Fehler in dem Bereich ungenauigkeiten mit der Baudrate. Lt. dieser Liste http://www.wormfood.net/avrbaudcalc.php sind 38400 okay. Das externe Quarz wird auch verwendet. Zumindest kann man das mit einem Blink Test der LED einigermasen kontrollieren.
Kann mir wer nen Tip geben was ich noch kontrollieren kann?