Forum: Mikrocontroller und Digitale Elektronik AVR UART RS232 testen - bisher kein Erfolg


von J. W. (ontheway)


Lesenswert?

Hi,

ich versuche mich in UART einzuarbeiten. Ich bin bisweilen am 
Bootloader-Beispiel gescheitert: Schritt 3 - Programmieren des 
Bootloaders

Dazu: Habe gerade nen Atmega16 auf dem Pollin-Board. Das hat einen 
Quarz. Ich habe ein Timerbeispiel genommen, mit einer blinkenden LED, 
und habe die verdammte LED mit einer Stoppuhr vermessen (Vorteiler 1024, 
IRQ bei 256 (8 bit Timer), 1 MHz über Fuse eingestellt), funktioniert, 
das Teil scheint mir erwartungsgemäß mit 1 MHz zu takten, oder halt auf 
8MHz, wenn ich die Fuse setze...
ich habe auf dem Pollin-Board Jumper 1 und 2 gesteckt, damit TXD und RXD 
an der RS232 hängen... ich habe mir sogar nebst Putty den Free Serial 
Monitor installiert, um das besser zu verstehen.
Ich bekomme einfach keine Verbindung, ich bräuchte von mir aus auch 
keinen Bootloader, sondern ein simples Beispiel, mit einer Kommunikation 
über die serielle Schnittstelle.
Sobald ich bei dem Beispiel oben die RS232 oben anstöpsel ist schweigen 
im Walde.
Könnt ihr mir helfen? Danke!

Ciao,
Jens

von Steven (. (ovular) Benutzerseite


Lesenswert?

Also Dein µC funktioniert? Kannst Du LEDs blinken lassen oder sowas?

Ich suche mal nach nem kleinen Code...

EDIT: Jo hast ja geschrieben, dass was blinkt...

Gruß Steven

von Steven (. (ovular) Benutzerseite


Lesenswert?

im Tutorial steht was einfaches. AVR-GCC-Tutorial/Der UART
1
#define F_CPU 1000000UL
2
#include <util/delay.h>
3
 
4
#define BAUD 9600UL      // Baudrate
5
 
6
// Berechnungen
7
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
8
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
9
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
10
 
11
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
12
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
13
#endif 
14
15
void uart_init(void)
16
{
17
  UBRRH = UBRR_VAL >> 8;
18
  UBRRL = UBRR_VAL & 0xFF;
19
 
20
  UCSRB |= (1<<TXEN);  // UART TX einschalten
21
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
22
}
23
24
int main(void){
25
  
26
  uart_init();
27
  
28
  while(1){
29
    _delay_ms(1000);
30
    while (!(UCSRA & (1<<UDRE)));
31
    UDR = 'x';
32
  }
33
34
}

von J. W. (ontheway)


Lesenswert?

Steven () schrieb:
> Also Dein µC funktioniert? Kannst Du LEDs blinken lassen oder sowas?
>
> Ich suche mal nach nem kleinen Code...
>
> EDIT: Jo hast ja geschrieben, dass was blinkt...
>
> Gruß Steven

Ich habe gerade festgestellt, dass ich über AVR8 Burn-O-Mat den 
Calibrated INTERNAL Oscillator nutze, aber das Pollin hat ja wohl auch 
einen 16MHz Quarz dranhängen... aktuell habe ich Hex (H)99 (L)E4 für 8 
MHz interne Taktung bei den Fuses... die CKSELx werden ja durch 
Burn-O-Mat automatisch gesetzt, wenn ich die interne Taktrate setze.

Mein mC ist in Ordnung, das oben genannte Beispiel hatte ich auf 0x3800 
programmiert, auch das schien mir in Ordnung. Aber echt, ich sch... auf 
den Bootloader, wenn ich erst einmal ein Beispiel für UART habe, das 
funktioniert... du hast ja auch das Pollin-Board, wie gesagt, Jumper 1 
und 2 habe ich geschlossen, das hatte ich zuerst übersehen...
Merci!

von Pastor Braune (Gast)


Lesenswert?


von J. W. (ontheway)


Lesenswert?

Pastor Braune schrieb:
> moin
>
> schöne Erklärung mit Bsp.
> http://www.avrbeginners.net
> http://www.avrbeginners.net/architecture/uart/setup_uart.html

Okay, sorry, aber ich möchte auf C coden, hätte ich vielleicht explizit 
schreiben müssen.

von Steven (. (ovular) Benutzerseite


Lesenswert?

Also ich programmier schon seit mehreren Jahren die Atmel 
Mikrocontroller und ich muss leise gestehen, dass ich noch nie einen 
Bootloader programmiert habe. Auch keine Makefile...

psst. verrats nicht weiter. :)

Gruß Steven

von J. W. (ontheway)


Lesenswert?

Steven () schrieb:
> Also ich programmier schon seit mehreren Jahren die Atmel
> Mikrocontroller und ich muss leise gestehen, dass ich noch nie einen
> Bootloader programmiert habe. Auch keine Makefile...
>
> psst. verrats nicht weiter. :)
>
> Gruß Steven

Lol, kein Ding, ich will das auch nicht programmieren, aber vermutlich 
nutzen! ;) Bin schweigsam wie Twitter ;) Ich würde gerne UART verstehen 
und nutzen. Echt, der Bootloader ist mir gerade schon wurscht, ich 
möchte eigentlich primär einfach mit der seriellen Schnittstelle 
arbeiten. Du siehst meine Verzweiflung, wenn ich mit ner Handy-Stoppuhr 
eine Leuchtdiode vermesse... (auch nicht weitererzählen bitte ;) )

von Steven (. (ovular) Benutzerseite


Lesenswert?

Was genau meinst Du mit verstehen und nutzen? Mir ist womöglich nicht 
bewusst was ich noch nicht weis.

UART ist ja einfach ein serielles Protokoll, welches mit dem µC entweder 
per Hardware oder Software genutzt werden kann. Die Baudrate ist 
bekanntlich die Anzahl der Zeichen pro Sekunde. Und das wars ja auch 
schon fast. 5 bis 9 Datenbits, ein Stopbits mit 1, 1,5 oder 2 Bitlänge 
(wenn ichs noch richtig weis) und Paritätsbit (1 oder 2?)

Gruß Steven

von J. W. (ontheway)


Lesenswert?

Ich will einfach lernen, seriell zu kommunizieren. Dafür hätte ich gerne 
ein funktionsfähiges schönes Beispiel, denn mir hilft das halt, wenn 
auch etwas passiert... ich möchte das, aktuelle Idee, als 
Kommunikationsprotokoll zwischen mehreren mCs zu benutzen.
Aber egal! Ich will echt momenten nur, dass der Mist hier funktioniert, 
irgendein Beispiel.

Grüße,
Jens

von Spess53 (Gast)


Lesenswert?

Hi

>Ich will echt momenten nur, dass der Mist hier funktioniert,
>irgendein Beispiel.

Ein Beispiel steht sogar im Datenblatt.

MfG Spess

von J. W. (ontheway)


Lesenswert?

Spess53 schrieb:
> Hi
>
>>Ich will echt momenten nur, dass der Mist hier funktioniert,
>>irgendein Beispiel.
>
> Ein Beispiel steht sogar im Datenblatt.
>
> MfG Spess

Hi Spess,

sieht mir doch eher nach Codefragmenten aus. Ich würde halt gerne mit 
einem Beispiel anfangen, dass zusammenhängend ist... vielleicht übersehe 
ich da was. Mir reicht irgendein Hallo-Welt-Zeugs in C, das dann auch 
funktioniert. Vielleicht brauche ich ja mehr Zeit etc., aber ich bin 
gerade etwas ungeduldig, weil ich doch einfach nur funktionsfähigen 
C-Code möchte.

Ciao,
Jens

von amateur (Gast)


Lesenswert?

@J. W.

Was eigentlich stört dich an dem praktisch vollständigen, von Steven 
geposteten, Bleistift.

Das der Hintergrund die falsche Farbe hat?

von Spess53 (Gast)


Lesenswert?

Hi

> aber ich bin
>gerade etwas ungeduldig, weil ich doch einfach nur funktionsfähigen
>C-Code möchte.

Funktionsfähigen Code bekommt man einfach durch Lesen und Verstehen des 
Datenblatts. So habe ich es und tausende andere AVR-Benutzer auch 
gemacht.

Was nutzt dir irgend ein Code, den du nicht verstehst?

Wenn du das nicht in die Reihe bekommst hast du möglicherweise das 
falsche Hobby.

MfG Spess

von J. W. (ontheway)


Lesenswert?

Spess53 schrieb:

>
> Funktionsfähigen Code bekommt man einfach durch Lesen und Verstehen des
> Datenblatts. So habe ich es und tausende andere AVR-Benutzer auch
> gemacht.
>
> Was nutzt dir irgend ein Code, den du nicht verstehst?
>
> Wenn du das nicht in die Reihe bekommst hast du möglicherweise das
> falsche Hobby.
>
> MfG Spess

Danke, vielmals, habe mich lieber selbst auf die Suche gemacht - und 
wurde fündig. Hier funktionsfähiger Code, der sofort Lernerfolg bringt, 
aber daran bist Du im Vermitteln anscheinend nicht interessiert. Ich 
habe den nur kurz angepasst auf PortA. Vielen Dank.

/*
 * UART02.c
 *
 * Created: 24.04.2013 23:03:35
 *  Author: jens
 */

#define F_CPU 8000000UL  // 8 MHz

/*Very Important - change F_CPU to match target clock
  Note: default AVR CLKSEL is 1MHz internal RC
  This program transmits continously on USART. Interrupt is used for
  Receive charactor, which is then transmitted instead. LEDs are used
  as a test. RX routine is included but not used.
  Change USART_BAUDRATE constant to change Baud Rate
*/

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

// Define baud rate
#define USART_BAUDRATE 38400
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

volatile unsigned char value;
/* This variable is volatile so both main and RX interrupt can use it.
It could also be a uint8_t type */

/* Interrupt Service Routine for Receive Complete
NOTE: vector name changes with different AVRs see
Help - AVR-Libc reference - Library Reference - <avr/interrupt.h>: 
Interrupts
for vector names other than USART_RXC_vect for ATmega32 */

ISR(USART_RXC_vect){

   value = UDR;             //read UART register into value
   PORTA = ~value;          // output inverted value on LEDs (0=on)
}

void USART_Init(void){
   // Set baud rate
   UBRRL = BAUD_PRESCALE;// Load lower 8-bits into the low byte of the 
UBRR register
   UBRRH = (BAUD_PRESCALE >> 8);
   /* Load upper 8-bits into the high byte of the UBRR register
    Default frame format is 8 data bits, no parity, 1 stop bit
  to change use UCSRC*/

  // Enable receiver and transmitter and receive complete interrupt
  UCSRB = ((1<<TXEN)|(1<<RXEN) | (1<<RXCIE));
}


void USART_SendByte(uint8_t u8Data){

  // Wait until last byte has been transmitted
  while((UCSRA &(1<<UDRE)) == 0);

  // Transmit data
  UDR = u8Data;
}


// not being used but here for completeness
      // Wait until a byte has been received and return received data
uint8_t USART_ReceiveByte(){
  while((UCSRA &(1<<RXC)) == 0);
  return UDR;
}

void Led_init(void){
   //outputs, all off
  DDRA =0xFF;
  PORTA = 0x00;
}

int main(void){
   USART_Init();  // Initialise USART
   sei();         // enable all interrupts
   Led_init();    // init LEDs for testing
   value = 'A'; //0x41;
   PORTA = ~value; // 0 = LED on

   for(;;){    // Repeat indefinitely

     USART_SendByte(value);  // send value
     _delay_ms(250);
             // delay just to stop Hyperterminal screen cluttering up
   }
}

von Spess53 (Gast)


Lesenswert?

Hi

>Hier funktionsfähiger Code, der sofort Lernerfolg bringt,

Welchen Lernerfolg? Wohl das du Copy & Paste gelernt hast.

>aber daran bist Du im Vermitteln anscheinend nicht interessiert. Ich
>habe den nur kurz angepasst auf PortA. Vielen Dank.

Ich bin notorischer Assembler-Programmierer. Meinst du, das ich dir das 
hätte vermitteln können oder das du an meiner Lösung interessiert wärst?

MfG Spess

von J. W. (ontheway)


Lesenswert?

Spess53 schrieb:

>>Hier funktionsfähiger Code, der sofort Lernerfolg bringt,
>
> Welchen Lernerfolg? Wohl das du Copy & Paste gelernt hast.
>
Nein, das ich FUNKTIONSFÄHIGES Beispiel habe, und verstehen kann, WARUM 
das nun funktioniert.
>>aber daran bist Du im Vermitteln anscheinend nicht interessiert. Ich
>>habe den nur kurz angepasst auf PortA. Vielen Dank.
>
> Ich bin notorischer Assembler-Programmierer. Meinst du, das ich dir das
> hätte vermitteln können oder das du an meiner Lösung interessiert wärst?
>
Spess, ich werde vielleicht auch noch Assembler programmieren, wer weiß, 
dann währe ich für Deine Hilfe dankbar! Aber auf Sprüche wie "Wenn du 
das nicht in die Reihe bekommst hast du möglicherweise das
falsche Hobby." kann ich nun wirklich dauerhaft verzichten, egal, was 
ich mache, welche Sprache etc. Das ist meine Entscheidung. Ob Du mir 
dann noch helfen möchtest, dass ist deine Entscheidung.

> MfG Spess

Grüße,
Jens

von Steven (. (ovular) Benutzerseite


Lesenswert?

Ist ja noch einiges geschrieben worden gestern.

Also Jens, scheinbar hast Du ja jetzt selbst ein Code gefunden.
Wenn ich das jetzt richtig sehe war der Thread und mein Codebeispiel 
mehr oder weniger unnötig.

Vielleicht kannst Du ja beim nächsten Mal einfach mal etwas mehr Geduld 
aufbringen und dann was Posten. Oder wenn Du ne konkrete Frage hast. 
Codefragmente kann man eigentlich selbst suchen...

Funktionierts denn jetzt und hast Du deinen Lernerfolg schon hinter Dir?

Mir ist übrigends beim Überfliegen aufgefallen, dass value nicht 
definiert ist.

Gruß
Steven

von J. W. (ontheway)


Lesenswert?

Steven () schrieb:
> Ist ja noch einiges geschrieben worden gestern.
>
> Also Jens, scheinbar hast Du ja jetzt selbst ein Code gefunden.
> Wenn ich das jetzt richtig sehe war der Thread und mein Codebeispiel
> mehr oder weniger unnötig.

Nein, überhaupt nicht, vielen Dank! Bei mir war das compilieren gleich 
ausgestiegen, wegen dem error im DEFINE. Da war ich genervt nach ein 
paar Abenden misslungenen Bootloader-Versuchen. Das Beispiel, dass ich 
fand, hat sofort funktioniert, ich brauche halt ab und zu ein sichtbares 
Erfolgserlebnis, insofern auch sorry an Spess.
>
> Vielleicht kannst Du ja beim nächsten Mal einfach mal etwas mehr Geduld
> aufbringen und dann was Posten. Oder wenn Du ne konkrete Frage hast.
> Codefragmente kann man eigentlich selbst suchen...

Ja Steven, ich denke halt, dass der umgekehrte Weg mir mehr hilft. 
Endlich funktioniert etwas, aber WARUM funktioniert es? Denn jetzt habe 
ich Dein Beispiel auch zum laufen gebracht.
>
> Funktionierts denn jetzt und hast Du deinen Lernerfolg schon hinter Dir?
>
Da hakt es ganz gewaltig! Ich bekomme das Beispiel nämlich nur zum 
laufen, wenn ich (erwartungsgemäß) den Takt auf 8000000UL setze, aber 
ich muss 38400UL für BAUD setzen... dann bekomme ich viele x über die 
Putty... ansonsten geht es halt bisher nicht...

> Mir ist übrigends beim Überfliegen aufgefallen, dass value nicht
> definiert ist.
>
Wie meinst Du das?
Ist doch volatile unsigned char value;
?

Danke für Deine und die Hilfe anderer, war echt nicht so gemeint, dass 
ich das nicht als Hilfe empfinde.

Viele Grüße,
Jens

von J. W. (ontheway)


Lesenswert?

Steven () schrieb:
>
> Vielleicht kannst Du ja beim nächsten Mal einfach mal etwas mehr Geduld
> aufbringen und dann was Posten. Oder wenn Du ne konkrete Frage hast.
> Codefragmente kann man eigentlich selbst suchen...
>
Ich werde noch narrisch, ich habe den Rechner auf 
http://www.gjlay.de/helferlein/avr-uart-rechner.html genommen, bei 9600 
BAUD sollte es keine Probleme geben, und ich habe Dein Beispiel 
genommen, es geht auch... keine Ahnung was da schief lief...

von Steven (. (ovular) Benutzerseite


Lesenswert?

Hoppla hab die Definition von value überlesen.

Ok, dann hab ich das wohl falsch aufgefasst. Ich kann verstehen, dass Du 
da etwas in Rage bist, wenns nicht klappt.

J. W. schrieb:
> Da hakt es ganz gewaltig! Ich bekomme das Beispiel nämlich nur zum
> laufen, wenn ich (erwartungsgemäß) den Takt auf 8000000UL setze, aber
> ich muss 38400UL für BAUD setzen... dann bekomme ich viele x über die
> Putty... ansonsten geht es halt bisher nicht...

Mhm. Ist das CLK/8 Flag entsprechend gesetzt?

Lad halt mal den Code im Anhang hoch.

Ich hatte letztens übrigends Probleme mit dem Umstellen des Taktes, an 
was es genau lag kann ich aber auch noch nicht sagen. Er ließ sich aber 
schlecht umstellen mittels F_CPU Umdefinition.
Was ich damit sagen will ist nur, dass es sein kann dass die Frequenz 
beim Umdefinieren evtl. nicht gleich stimmt.
Das soll jetzt aber nur ein kleiner Tipp sein, genaueres weis ich auch 
noch nicht. Stelle also am besten erst sicher, dass eine LED die mit 
_delay_ms(1000) blinkt auch wirklich 1sec blinkt...

Gruß Steven

von Steven (. (ovular) Benutzerseite


Lesenswert?

J. W. schrieb:
> Ich werde noch narrisch, ich habe den Rechner auf
> http://www.gjlay.de/helferlein/avr-uart-rechner.html genommen, bei 9600
> BAUD sollte es keine Probleme geben, und ich habe Dein Beispiel
> genommen, es geht auch... keine Ahnung was da schief lief...

Ja ich glaube das hängt mit der Umdefinition von F_CPU zusammen...

Aber vielliecht kennt ja jemand eine bessere Antwort.

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.