Forum: Mikrocontroller und Digitale Elektronik EA eDIPTFT43-ATP per RS-232 an Atmega32


von shibbyx (Gast)


Lesenswert?

Hallo ich habe ein EA eDIPTFT43-ATP Display der Firma Electronic 
Assambly
Ich möchte jetzt daten über RS-232 zu einem ATMEGA32 senden bzw. 
empfangen
gibt es vll ein Tutorial oder ähnliches dafür ?

von spess53 (Gast)


Lesenswert?

Hi

>gibt es vll ein Tutorial oder ähnliches dafür ?

Datenblatt. An deiner Stelle würde ich erst mal einen RS232-Wandler 
(DAtenblatt S.23) dranhängen und die ersten Versuche vom PC aus machen.

MfG Spess

von Ralf (Gast)


Lesenswert?

Geht ohne probleme direkt am µC.
Einfach TX -> RX und RX -> TX verbinden und Befehle mit der Uart senden.

Wichtig gleiche Bautrate einstellen.

von spess53 (Gast)


Lesenswert?

Hi

>Geht ohne probleme direkt am µC.
>Einfach TX -> RX und RX -> TX verbinden und Befehle mit der Uart senden.

Das weiss ich. Ich schrieb aber PC . Mir ging es darum, das er die 
ersten Ansteuerversuche mit dem PC macht. Und wenn er es verstanden hat 
mit dem ATMega weiter macht.

MfG Spess

von Adrian B. (Firma: FHL) (shibbyx)


Lesenswert?

für den PC hab ich das USB-Board.
Im Datenblatt steht als sende Beispiel:

1
voidSendData (unsingned char *buf, unsigned char len)
2
{
3
 unsigned char i, bcc;
4
5
 Sendbyte(0x11);                      //Send DC1
6
 bcc = 0x11;
7
8
 SendByte(len);                     // Send data length
9
 bcc = bcc + len;
10
11
 for(i=0; i < len; i++)             //Send buf
12
 { SendByte (buf[i]);
13
   bcc= bcc + buf[i];
14
  }
15
16
 Sendbyte (bcc);                  //Send checksum
17
}

Das hilft mir irgendwie nich ganz

len = ist die Datenlänge ?
bcc = ist die Prüfsumme?

was ist DC1?
Wo sind die eigentlichen Datenbytes?

von Adrian B. (Firma: FHL) (shibbyx)


Lesenswert?

kann mir keiner weiterhelfen?

von juppi (Gast)


Lesenswert?

Hallo
Nimm ein beliebiges Terminalprogramm und sende im ASCii Format,ohne 
Small Protokoll.

MfG

von shibbyx (Gast)


Lesenswert?

hmmm ich möchte vom atmega ja keine ascii zeichen haben sondern bytes, 
denn die oberfläche soll auf dem controller vom tft laufen. vom atmega 
möchte ich nur infos bzw infos zum atmega senden

von juppi (Gast)


Lesenswert?

natürlich , aber es kann damit alles einfach erst einmal getestet 
werden!

von Juppi J. (juppiii)


Angehängte Dateien:

Lesenswert?

vielleicht hilft das ,hatte mal einen primitiven Simulator gemacht.
Ist schon länger her,aber über die Grundversuche nicht herausgekommen.

Gruß

von shibbyx (Gast)


Lesenswert?

juppi schrieb:
> natürlich , aber es kann damit alles einfach erst einmal getestet
> werden!

da hast du natürlich recht vll. wird mir dann einiges klarer

von shibbyx (Gast)


Lesenswert?

ist es überhaupt möglich ein programm über usb zu schreiben und
zusätlich daten über die rs-232 schnittstelle zu empfangen?

von Juppi J. (juppiii)


Lesenswert?

Hallo
Ich spreche das Teil über COM oder USB to Seriell Adapter an.
Mit meinem Primitivprogramm kann ich Strichgrafiken zeichnen und Buttons
Positionieren.
Befehle testen und senden.
Kleine Versuche speichern.
Für meine Zwecke reicht es.
Ich glaube nicht das du USB Ansteuerung und RS232 gleichzeitig nutzen 
kannst.
USB  ist in diesem Falle auch nur ein USB to seriell Adapter,..oder
MfG

von shibbyx (Gast)


Lesenswert?

naja ich will es ja nur über usb programmieren und dann über rs232 daten 
empfangen. also wenn das programm einmal auf das ding geladen ist soll 
nur noch die rs232 angebunden sein

von Juppi J. (juppiii)


Lesenswert?

Beim Testen nutze ich einen TxD/RxD  Umschalter.
Willst du den Controller mit dem TFT direkt Verbinden,ohne Max232?

von spess53 (Gast)


Lesenswert?

Hi

>Willst du den Controller mit dem TFT direkt Verbinden,ohne Max232?

Wie sonst?

Datenblatt:

'Die Leitungen RxD und TxD führen 5V CMOS-Pegel zur direkten Anbindung 
an
z.B. einen Mikrokontoller.'

MfG Spess

von Juppi J. (juppiii)


Lesenswert?

spess53 schrieb:
>>Willst du den Controller mit dem TFT direkt Verbinden,ohne Max232?
>
>
>
> Wie sonst?

Bei mir ist das zu steuernte Gerät einige Meter entfernt.
..ob dann noch der 5V Pegel sicher ist?

MfG

von shibbyx (Gast)


Lesenswert?

Ich komme einfach nicht weiter, es passiert nix hier mal code:
1
#include <avr/io.h>           
2
#include <stdint.h>     
3
#include <stdio.h> 
4
#include <util/delay.h> 
5
      
6
 
7
void USART_init(void)    // Manual S. 148
8
  {
9
  
10
11
#ifndef F_CPU
12
13
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
14
                         // Ohne ergeben sich unten Fehler in der Berechnung
15
#endif
16
 
17
#define BAUD 115200UL      // Baudrate
18
 
19
// Berechnungen
20
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
21
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
22
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
23
 
24
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
25
  
26
#endif 
27
 
28
void uart_init(void)
29
{
30
  UCSRB = (1<<RXEN) | (1<<TXEN);  // UART TX einschalten
31
  UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
32
 
33
  UBRRH = UBRR_VAL >> 8;
34
  UBRRL = UBRR_VAL & 0xFF;
35
}
36
  /* enable Receiver und Transmitter:  */
37
  UCSRB = (1<<RXEN) | (1<<TXEN);
38
  // set frame format: 8 Dat - 2 Stopbits  
39
  UCSRC = (1<<URSEL) | (1<<USBS) | (1<<UCSZ1) | (1<<UCSZ0); 
40
  }
41
42
43
void USART_transmit (unsigned char data ) // Senden 
44
  {
45
  /* warte auf leeren Transmit-Puffer */
46
  while (! (UCSRA & (1<<UDRE)))        // wartet ewig?
47
  ;
48
  /* put date in the buffer, send the data */
49
  UDR = data;
50
  return;
51
  }
52
53
  
54
int main(void)
55
  {
56
  unsigned char data = 0x11;
57
   USART_init();
58
  USART_transmit(data);
59
60
  data = 0x01;
61
  USART_transmit(data);
62
  
63
  data = 'a';
64
  USART_transmit(data);
65
  
66
67
  return 0; 
68
  }

von spess53 (Gast)


Lesenswert?

Hi

>#define F_CPU 4000000UL
>#define BAUD 115200UL

Gibt einen Baudrate-Fehler von über 8% !

MfG Spess

von shibbyx (Gast)


Lesenswert?

jetzt mit 9600 baud
1
#include <avr/io.h>           
2
#include <stdint.h>     
3
#include <stdio.h> 
4
#include <util/delay.h> 
5
      
6
 
7
void USART_init(void)    // Manual S. 148
8
  {
9
10
#ifndef F_CPU
11
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
12
   F_CPU im Makefile definiert werden, eine nochmalige Definition
13
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
14
   #ifndef/#endif 
15
 
16
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
17
   verwendet wird und dort eine andere, nicht zur Hardware passende 
18
   Taktrate eingestellt ist: Dann wird die folgende Definition 
19
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
20
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
21
   noch nicht definiert: */
22
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
23
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
24
                         // Ohne ergeben sich unten Fehler in der Berechnung
25
#endif
26
 
27
#define BAUD 9600UL      // Baudrate
28
 
29
// Berechnungen
30
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
31
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
32
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
33
 
34
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
35
  
36
#endif 
37
38
39
40
41
/* UART-Init Bsp. ATmega16 */
42
 
43
void uart_init(void)
44
{
45
  UCSRB = (1<<RXEN) | (1<<TXEN);  // UART TX einschalten
46
  UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
47
 
48
  UBRRH = UBRR_VAL >> 8;
49
  UBRRL = UBRR_VAL & 0xFF;
50
}
51
  /* enable Receiver und Transmitter:  */
52
  UCSRB = (1<<RXEN) | (1<<TXEN);
53
  // set frame format: 8 Dat - 2 Stopbits  (wie N u. nur 1 Stopbit?
54
  UCSRC = (1<<URSEL) | (1<<USBS) | (1<<UCSZ1) | (1<<UCSZ0); 
55
  }
56
57
58
void USART_transmit (unsigned char data ) // Senden (Manual S. 149)
59
  {
60
  /* warte auf leeren Transmit-Puffer */
61
  while (! (UCSRA & (1<<UDRE)))        // wartet ewig?
62
  ;
63
  /* put date in the buffer, send the data */
64
  UDR = data;
65
  return;
66
  }
67
68
  
69
int main(unsigned char *buf, unsigned char len)
70
  {
71
   unsigned char data, i, bcc;
72
  data= 0x11;
73
  bcc= 0x11;
74
  USART_init();
75
  USART_transmit(data);
76
77
  data = 0x04;
78
  bcc=bcc+data;
79
  USART_transmit(data);
80
  
81
  data = '#';
82
  USART_transmit(data);
83
  
84
  
85
  data = 'Z';
86
  USART_transmit(data);
87
  
88
89
  data = 'T';
90
  USART_transmit(data);
91
  
92
  data = 'a';
93
  USART_transmit(data);
94
95
  for(i=0; i < len; i++) // Send buf
96
{ data=(buf[i]);
97
  USART_transmit(data);
98
99
bcc= bcc + buf[i];
100
101
}
102
  
103
data = bcc;
104
USART_transmit(data);
105
  
106
  return 0; 
107
  }

von spess53 (Gast)


Lesenswert?

Hi

Und was soll das bewirken? Die #-Befehle werden übrigens ohne das 
DC-Gedödel gesendet.

MfG Spess

von shibbyx (Gast)


Lesenswert?

momentan möchte ich einfach nur ne zeichenkette aufm terminal ausgeben 
das wäre schomal etwas

von Info (Gast)


Lesenswert?

Schick dir erst an den PC, um deine AVR Routinen zu testen.
Schick vom PC an das EDIP
Als letztes dann AVR-EDIP..

von Daniel B. (dbuergin)


Angehängte Dateien:

Lesenswert?

Hallo

Ich weiss nicht genau, wo die Unterschiede zu meinem eDIPTFT43-A liegen,
aber Du kannst es sonst mal mit meinem Code versuchen.

ACHTUNG: Die Library ist für einen Luminary Cortex-M3 und benutzt deren 
Library. Du musst alle UART... Befehle und die Include Statements auf 
den ATmega anpassen. Mein Display läuft am UART1 des Cortex-M3 mit 
115200 Baud.

Nun hast zu zwei Varianten, entweder Du arbeitest im sog. Terminalmode
d.h. Du schreibst deinen Output einfach mit ediptft43_puts() an das
Display. Oder Du verwendest die Grafikbefehle und plazierst deinen
Text irgendwo auf dem Display.

main():
1
.... UART initialisieren....
2
ediptft43_puts("Entering Main-Loop....\r\n");
3
ediptft43_puts("Initializing UDP-get....\r\n");
4
....

oder über die Grafikbefehle:
1
.... UART initialisieren....
2
ediptft43_fontsel(4);
3
ediptft43_fontzoom(2,2);
4
ediptft43_fontcolor(6,0);
5
ediptft43_printxy(240,1,'C', "Text1");
6
ediptft43_fontcolor(8,0);
7
ediptft43_printxy(1,50,'L', "Text2:      Text3");
8
.....

Die Library ist noch sehr jung und unausgetestet. Sporadisch ändert sich 
der Font oder die Grösse, aber das liegt ev. am Rest meines Programs und 
nicht der Library ;-)

Daniel

von juppi (Gast)


Lesenswert?


von shibbyx (Gast)


Lesenswert?

irgendwie bringt mich das auch nicht weiter....

von shibbyx (Gast)


Lesenswert?

Hier nochmal der Code
das Display befindet sich im Terminal Mode mit einer Baudrate von 115200 
und das small Protokoll ist deaktiviert.
Ich möchte nur ein a Ausgeben.

1
#include <avr/io.h>           
2
#include <stdint.h>     
3
#include <stdio.h> 
4
#include <util/delay.h> 
5
      
6
 
7
void USART_init(void)   
8
  {
9
  
10
11
#ifndef F_CPU
12
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
13
   F_CPU im Makefile definiert werden, eine nochmalige Definition
14
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
15
   #ifndef/#endif 
16
 
17
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
18
   verwendet wird und dort eine andere, nicht zur Hardware passende 
19
   Taktrate eingestellt ist: Dann wird die folgende Definition 
20
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
21
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
22
   noch nicht definiert: */
23
24
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
25
                         // Ohne ergeben sich unten Fehler in der Berechnung
26
#endif
27
 
28
#define BAUD 115200L      // Baudrate
29
 
30
// Berechnungen
31
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
32
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
33
34
35
36
37
/* UART-Init Bsp. ATmega16 */
38
 
39
void uart_init(void)
40
{
41
  UCSRB = (1<<RXEN) | (1<<TXEN);  // UART TX einschalten
42
  UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
43
 
44
  UBRRH = UBRR_VAL >> 8;
45
  UBRRL = UBRR_VAL & 0xFF;
46
}
47
  /* enable Receiver und Transmitter:  */
48
  UCSRB = (1<<RXEN) | (1<<TXEN);
49
  // set frame format: 8 Dat - 2 Stopbits  (wie N u. nur 1 Stopbit?
50
  UCSRC = (1<<URSEL) | (1<<USBS) | (1<<UCSZ1) | (1<<UCSZ0); 
51
  }
52
53
54
  
55
int main(unsigned char *buf, unsigned char len)
56
  {
57
   unsigned char data, i, bcc;
58
59
  USART_init();
60
  data = '#';
61
  USART_transmit(data);
62
  
63
  
64
  data = 'Z';
65
  USART_transmit(data);
66
  
67
68
  data = 'T';
69
  USART_transmit(data);
70
  
71
  data = 'a';
72
  USART_transmit(data);
73
74
75
}


void USART_transmit (unsigned char data ) // Senden (Manual S. 149)
  {
  /* warte auf leeren Transmit-Puffer */
//  while (! (UCSRA & (1<<UDRE)))       // wartet ewig?
  ;
  /* put date in the buffer, send the data */
  UDR = data;
  return;
  }

von Daniel B. (dbuergin)


Lesenswert?

Du scheinst ziemlich renitent gegenüber jedwelchen Vorschlägen zu sein.

Hast Du Deine Schaltung (wie sieht die eigentlich aus ?) über einen 
Pegelwandler (max232 o.ä) auf die serielle Schnittstelle gehängt, und 
über ein Terminalprogram kontrolliert, ob der Code läuft ?

Beim Code bin ich auch nicht so sicher. Verschachtelte Funktionen 
( uart_init() innerhalb von USAR_init() ) finde ich nicht sehr 
übersichtlich. Bin nicht der C-Crack, aber mir ist das suspekt.

Habe mal mein Display an einen ATMega128 gehängt.
Einen ATMega32 habe ich nicht. Die Ports 17 und 8 am Display auf GND. 
Damit läuft das Ding mit 9600 Baud und ohne SmallProtocol. Mit 115200 
ist es auch bei mir nicht gelaufen, mein 16Mhz erzeugt dabei wohl zuviel 
Abweichung.

Für die UART Schnittstelle gibts die Library von Peter Fleury. Wenn das 
Ding mal läuft, kannst Du dir die Schnittstellenkonfiguration immer noch
rauspullen, und ohne die Library arbeiten.

Nach dem flashen erscheint bei mir auf dem Display:
1
EA eDIPTFT43-A V1.1 Rev.E TP+
2
a

Habe Dir die main.c und das Makefile für einen ATMega32 angepasst. 
Sollte so laufen.
1
// Includes 
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
6
#define F_CPU 16000000L
7
#include <util/delay.h>
8
9
#include "uart.h" 
10
11
// Serielle Schnittstelle
12
13
#define UART1_BAUD 9600
14
15
int main(void)
16
{
17
  // Init UART1 with 9600 for Input 
18
19
  uart_init( UART_BAUD_SELECT(UART1_BAUD, F_CPU));
20
21
  // enable interrupts 
22
23
  sei();
24
  _delay_ms(1000);
25
26
  // Den Versionstring ausgeben
27
  uart_putc('#');
28
  uart_putc('T');
29
  uart_putc('V');
30
31
  // Linefeed und Carriagereturn
32
  uart_putc(0xa);
33
  uart_putc(0xd);
34
35
  // Den Buchstaben a
36
  uart_putc('#');
37
  uart_putc('Z');
38
  uart_putc('T');
39
  uart_putc('a');
40
41
  while(1)
42
  {
43
  }
44
}

Daniel

von Daniel B. (dbuergin)


Angehängte Dateien:

Lesenswert?

Und hier noch der code.....

von Daniel B. (dbuergin)


Lesenswert?

F_CPU musst Du natürlich auch noch anpassen im main.c

von shibbyx (Gast)


Lesenswert?

Danke!

ich habe das problem mit das ich garnix versende habe dein programm mit 
baud 9600 jetzt so übernommen und das stk500 board an die com 
schnitstelle gehängt um per hyperterminal zu gucken ob ich was versende 
doch leider bekomme ich nix.

mach ich da schonwieder etwas falsch?

das sende vom hyperterminal zum display funktioniert aber schonmal.

von shibbyx (Gast)


Lesenswert?

Also Ich hab ja einen Atmega8 mit 4Mhz
Die Baudrate ist auf 9600
Dann ist am RS232 Spare vom Stk500 ein RS232 auf USB adapter dran und 
über Hyperterminal ruf ich den (com3) auf.

nun sollte er mir das doch eigentlich auf dem Bildschirm auswerfen oder 
nicht?


1
// Includes 
2
3
4
5
#include <avr/io.h>
6
7
#include <avr/interrupt.h>
8
9
10
11
#define F_CPU 4000000L
12
13
#include <util/delay.h>
14
15
16
17
#include "uart.h" 
18
19
20
21
// Serielle Schnittstelle
22
23
24
25
#define UART1_BAUD 9600
26
27
28
29
int main(void)
30
31
{
32
33
  // Init UART1 with 9600 for Input 
34
35
36
37
  uart_init( UART_BAUD_SELECT(UART1_BAUD, F_CPU));
38
39
40
41
  // enable interrupts 
42
43
44
45
 sei();
46
47
  _delay_ms(1000);
48
49
50
51
  // Den Versionstring ausgeben
52
53
  uart_putc('#');
54
55
  uart_putc('T');
56
57
  uart_putc('V');
58
59
60
61
  // Linefeed und Carriagereturn
62
63
  uart_putc(0xa);
64
65
  uart_putc(0xd);
66
67
68
69
  // Den Buchstaben a
70
71
  uart_putc('#');
72
73
  uart_putc('Z');
74
75
  uart_putc('T');
76
77
  
78
  uart_putc('b');
79
80
81
82
  while(1)
83
84
  {
85
86
  }
87
88
}

von spess53 (Gast)


Lesenswert?

Hi

>Also Ich hab ja einen Atmega8 mit 4Mhz

Hoffentlich mit einem Quarz.

>Dann ist am RS232 Spare vom Stk500 ein RS232 auf USB adapter dran und
>über Hyperterminal ruf ich den (com3) auf.

Und Spare auch am Controller (PD0/PD1) angeschlossen?

MfG Spess

von shibbyx (Gast)


Lesenswert?

oder benötige ich einen MAX232?

von shibbyx (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Also Ich hab ja einen Atmega8 mit 4Mhz
>
> Hoffentlich mit einem Quarz.
>
ja


>>Dann ist am RS232 Spare vom Stk500 ein RS232 auf USB adapter dran und
>>über Hyperterminal ruf ich den (com3) auf.
>
> Und Spare auch am Controller (PD0/PD1) angeschlossen?
>
ja

von Daniel B. (dbuergin)


Lesenswert?

Meiner Meinung nach solltest Du auf STK500 alles haben was Du brauchst.

Siehe:

http://www.mikrocontroller.net/attachment/42741/STK500-HW-Beschreibung.pdf

Seite 13. So solltest Du die Verbindung von deinem Processor auf die
RS232 Schnittstelle auf dem STK500 aufsetzen.

von shibbyx (Gast)


Lesenswert?

So da bin ich wieder...
es funktioniert die Verbindung von STK500 zu PC (Hyperterminal)

und es funktioniert die verbindung von PC (Hyperterminal) zum Display

ich bekomme auf dem hyperterminal momentan #TV (Linefeed und 
Carriagereturn) a angezeit

und wenn ich das so vom pc zum display sende zeigt er mir das die 
displayversion (Linefeed und Carriagereturn) und ein a an.

nur wenn ich das display an den RS232 Spare vom STK500 hänge bekomme ich 
irgendwelche kryptischen zeichen.

es funzt sowohl der code von Daniel B. (danke nochmal) als auch der 
hier:
1
#include <avr/io.h>           
2
#include <stdint.h>     
3
#include <stdio.h> 
4
#include <util/delay.h> 
5
      
6
  
7
8
#ifndef F_CPU
9
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
10
   F_CPU im Makefile definiert werden, eine nochmalige Definition
11
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
12
   #ifndef/#endif 
13
 
14
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
15
   verwendet wird und dort eine andere, nicht zur Hardware passende 
16
   Taktrate eingestellt ist: Dann wird die folgende Definition 
17
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
18
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
19
   noch nicht definiert: */
20
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
21
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
22
                         // Ohne ergeben sich unten Fehler in der Berechnung
23
#endif
24
 
25
#define BAUD 2400UL      // Baudrate
26
 
27
// Berechnungen
28
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
29
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
30
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
31
 
32
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
33
  
34
#endif 
35
36
void uart_init(void);
37
void USART_transmit (unsigned char data );
38
39
/* UART-Init Bsp. ATmega16 */
40
 
41
void uart_init(void)
42
{
43
  UCSRB = (1<<RXEN) | (1<<TXEN);  // UART TX einschalten
44
  UCSRC |= (1<<URSEL)|(1<<USBS) | (1<<UCSZ1) | (1<<UCSZ0);  // Asynchron 8N1 
45
 
46
  UBRRH = UBRR_VAL >> 8;
47
  UBRRL = UBRR_VAL & 0xFF;
48
}
49
  /* enable Receiver und Transmitter:  */
50
 // UCSRB = (1<<RXEN) | (1<<TXEN);
51
  // set frame format: 8 Dat - 2 Stopbits  (wie N u. nur 1 Stopbit?
52
  //UCSRC = (1<<URSEL) | (1<<USBS) | (1<<UCSZ1) | (1<<UCSZ0); 
53
 // }
54
  
55
int main(void)
56
{
57
  unsigned char data;
58
  int i=0;
59
60
  if(i<5)
61
  {
62
    //  data= 0x11;
63
    //  bcc= 0x11;
64
    uart_init();
65
    //  USART_transmit(data);
66
67
    //  data = 0x04;
68
    //  bcc=bcc+data;
69
    //  USART_transmit(data);
70
71
72
     data = '#';
73
    USART_transmit(data);
74
75
    data = 'T';
76
    USART_transmit(data);
77
78
79
    data = 'V';
80
    USART_transmit(data);
81
82
  
83
    data = 0xa;
84
    USART_transmit(data);
85
86
    data = 0xa;
87
    USART_transmit(data);  
88
89
    data = 'a';
90
    USART_transmit(data);
91
92
    i++;
93
  }
94
  //  for(i=0; i < len; i++) // Send buf
95
  //  { data=(buf[i]);
96
  //  USART_transmit(data);
97
98
  //  bcc= bcc + buf[i];
99
100
}
101
102
//  data = bcc;
103
//  USART_transmit(data);
104
105
//  return 0; 
106
//  }
107
108
109
void USART_transmit (unsigned char data ) // Senden (Manual S. 149)
110
  {
111
  /* warte auf leeren Transmit-Puffer */
112
     while (! (UCSRA & (1<<UDRE)));    // wartet ewig?
113
  
114
  /* put date in the buffer, send the data */
115
  UDR = data;
116
  return;
117
  }

von spess53 (Gast)


Lesenswert?

Hi

>nur wenn ich das display an den RS232 Spare vom STK500 hänge bekomme ich
>irgendwelche kryptischen zeichen.

Das Display will TTL-Pegel keine RS232-Pegel!

MfG Spess

von shibbyx (Gast)


Lesenswert?

aber wenn ich von pc über rs232 sende geht es ja.
liefert der denn nen TTL pegel?

ich habe das display auch direkt an rxd txd vom atmega angeschlossen, 
das ging auch nicht.

von Juppi J. (juppiii)


Lesenswert?

shibbyx schrieb:
> aber wenn ich von pc über rs232 sende geht es ja.
>
> liefert der denn nen TTL pegel?

Hast du einen usb to ser. Wandler am PC.
Viele liefern 0/5 V.

>ich habe das display auch direkt an rxd txd vom atmega angeschlossen,
>das ging auch nicht.

Das sollte aber gehen,wenn du Rx nicht auf Rx und Tx nicht auf Tx 
geschaltet hast.(5V Pegel)

von shibbyx (Gast)


Lesenswert?

Juppi J. schrieb:
> shibbyx schrieb:
>> aber wenn ich von pc über rs232 sende geht es ja.
>>
>> liefert der denn nen TTL pegel?
>
> Hast du einen usb to ser. Wandler am PC.
> Viele liefern 0/5 V.

ja ich hab nen usb zu rs232 wandler dran


>>ich habe das display auch direkt an rxd txd vom atmega angeschlossen,
>>das ging auch nicht.
>
> Das sollte aber gehen,wenn du Rx nicht auf Rx und Tx nicht auf Tx
> geschaltet hast.(5V Pegel)

ne rx is auf tx und tx auf rx

von Daniel B. (dbuergin)


Lesenswert?

Und die Addressleitungen am Display hast Du entsprechend der Baudrate
auf GND gezogen ?

Für 2400 wären das dann Pin 7 und 8 auf GND, Pin 6 frei lassen, hat ja 
internen Pullup und ist damit High.

von shibbyx (Gast)


Lesenswert?

ja

pin 1 GND
pin 2 5V
pin 7 GND
pin 8 GND
pin 10 an TXD
pin 11 an RXD
pin 17 GND

wenn ichs mit hyperterminal anspreche gehts ja komischerweise auch

von Juppi J. (juppiii)


Lesenswert?

also...

PC--Usb to seriell--->>>> rs232/seriell->EA-dip

PC/Terminal-->Usb to seriell------------->>>>rs232/seriell-> Ea-dip
ist das so?


Arbeite doch erst einmal ohne Small-Protokoll!

von shibbyx (Gast)


Lesenswert?

genau so

ich hab doch pin 17 auf null dezogen also ist das small protokoll aus

von Juppi J. (juppiii)


Lesenswert?

shibbyx schrieb:
> und es funktioniert die verbindung von PC (Hyperterminal) zum Display

sende mal Text ohne  #

vor dem Display ist doch der Max232?

von shibbyx (Gast)


Lesenswert?

ja das hyperterminal-> display funzt!
wenn ich da einfach nur ein T eingebe zeigt er mir auch ein T an

Wenn ich vom STK500->Hyperterminal das T sende geht es auch

nur Wenn ich von STK500-> Display T sende bekomme ich mal ne 5 oder ein 
S (unregelmäßig)

von shibbyx (Gast)


Lesenswert?

Baudraten die ich ausprobiert habe sind 2400, 4800 und 9600 bei allen 
das selbe problem

von shibbyx (Gast)


Lesenswert?

hat keiner mehr eine idee was ich versuchen könnte bzw. wo der fehler 
steckt ?

ich verzweifel langsam !

von shibbyx (Gast)


Lesenswert?

liefert der mikrocontroller über rxd txd eigentlich einen cmos pegel 
oder einen ttl pegel?

von Thomas (Gast)


Lesenswert?

Hi
Der Mikrocontroller liefert über rxd txd TTL Pegel !!

Gruß Thomas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.